gnucap-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gnucap-devel] MS Windows, mingw compatibility of recent snapshots


From: Holger Vogt
Subject: [Gnucap-devel] MS Windows, mingw compatibility of recent snapshots
Date: Sun, 31 Dec 2006 16:36:18 +0100
User-agent: Thunderbird 1.5.0.9 (Windows/20061207)

Dear Al,

version 0.35 of gnucap was compatible with mingw and quasi compiled out of the box (except for the small bug reported in [Bug-gnucap] building guncap-0.35 in cygwin). The recently introduced functions CMD::attach and CMD::detach however do not compile with mingw because dlopen(), dlclose() and dlerror() are not available in the Windows world (except for Cygwin).

I have made a small patch to c_attahc.cc to allow the attachment of DLLs under mingw (not really tested so far however). This is also not compatible to having all non portable functions in md.cc, but at least allows to compile and run gnucap snapshots under mingw.

Regards

Holger



/* MS Windows portability added to c_attach.cc
* DLLs may be loaded with the following patch
*/
//testing=none
#ifdef _WIN32
#include <windows.h>
#undef min
#undef max
#else
#include <dlfcn.h>
#endif

#include "ap.h"
#include "c_comand.h"

#ifdef _WIN32
/*--------------------------------------------------------------------------*/
static std::map<const std::string, HINSTANCE> attach_list;
/*--------------------------------------------------------------------------*/
void CMD::attach(CS& cmd)
{
 int here = cmd.cursor();
 std::string s;
 cmd >> s;

 HINSTANCE handle = LoadLibrary(s.c_str());
 if (handle) {
   attach_list[s] = handle;
 }else{
   cmd.warn(bERROR, here, (char*)GetLastError);
 }
}
/*--------------------------------------------------------------------------*/
void CMD::detach(CS& cmd)
{
 int here = cmd.cursor();
 std::string s;
 cmd >> s;

 HINSTANCE handle = attach_list[s];
 if (handle) {
   FreeLibrary(handle);
   attach_list[s] = NULL;
 }else{
   cmd.warn(bERROR, here, "plugin not attached");
 }
}
#else
/*--------------------------------------------------------------------------*/
static std::map<const std::string, void*> attach_list;
/*--------------------------------------------------------------------------*/
void CMD::attach(CS& cmd)
{
 int here = cmd.cursor();
 std::string s;
 cmd >> s;

 void* handle = dlopen(s.c_str(), RTLD_NOW);
 if (handle) {
   attach_list[s] = handle;
 }else{
   cmd.warn(bERROR, here, dlerror());
 }
}
/*--------------------------------------------------------------------------*/
void CMD::detach(CS& cmd)
{
 int here = cmd.cursor();
 std::string s;
 cmd >> s;

 void* handle = attach_list[s];
 if (handle) {
   dlclose(handle);
   attach_list[s] = NULL;
 }else{
   cmd.warn(bERROR, here, "plugin not attached");
 }
}
#endif
/*--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*/





reply via email to

[Prev in Thread] Current Thread [Next in Thread]