Main Page | Class Hierarchy | Class List | Directories | File List | Class Members | File Members | Related Pages

GLibrary.h

00001 #ifndef __GLIBRARY_H
00002 #define __GLIBRARY_H
00003 
00004 // Os specific wrapper typedefs/defines
00005 #ifdef WIN32
00006 
00007     // Win32
00008     typedef HMODULE _SysLibHandle;
00009     #define _SysDefLibExtension ".dll"
00010 
00011 #else
00012 
00013     // Unix-like systems
00014 
00015     #if defined BEOS
00016     typedef image_id _SysLibHandle;
00017     #elif defined LINUX
00018     typedef void *_SysLibHandle;
00019     #else // atheos/linux
00020     typedef int _SysLibHandle;
00021     #endif
00022 
00023     #define _SysDefLibExtension ".so"
00024 
00025 #endif
00026 
00027 // Generic shared library loader
00028 class LgiClass GLibrary
00029 {
00030     char *FileName;
00031     _SysLibHandle hLib;
00032 
00033 public:
00034     GLibrary(char *File = 0);
00035     virtual ~GLibrary();
00036 
00037     _SysLibHandle Handle() { return hLib; }
00038     char *GetFileName() { return FileName; }
00039     virtual bool IsLoaded() { return hLib != 0; }
00040 
00041     bool Load(char *File);
00042     bool Unload();
00043     void *GetAddress(char *Resource);
00044 };
00045 
00046 // Runtime linking macros
00047 #define GLibBreakPoint  LgiAssert(0);
00048 #define GLibCallType    // __stdcall
00049 
00050 #define GLibFunc0(ret, func)                            \
00051     ret func()                                          \
00052     {                                                   \
00053         typedef ret (GLibCallType *p_##func)();         \
00054         p_##func p = (p_##func) GetAddress(#func);      \
00055         if (p)                                          \
00056         {                                               \
00057             return p();                                 \
00058         }                                               \
00059         GLibBreakPoint                                  \
00060         return 0;                                       \
00061     }
00062 
00063 #define GLibFunc1(ret, func, argtype, argname)          \
00064     ret func(argtype argname)                           \
00065     {                                                   \
00066         typedef ret (GLibCallType *p_##func)(argtype);  \
00067         p_##func p = (p_##func) GetAddress(#func);      \
00068         if (p)                                          \
00069         {                                               \
00070             return p(argname);                          \
00071         }                                               \
00072         GLibBreakPoint                                  \
00073         return 0;                                       \
00074     }
00075 
00076 #define GLibFunc2(ret, func, argtype1, argname1, argtype2, argname2) \
00077     ret func(argtype1 argname1, argtype2 argname2)      \
00078     {                                                   \
00079         typedef ret (GLibCallType *p_##func)(argtype1, argtype2);   \
00080         p_##func p = (p_##func) GetAddress(#func);      \
00081         if (p)                                          \
00082         {                                               \
00083             return p(argname1, argname2);               \
00084         }                                               \
00085         GLibBreakPoint                                  \
00086         return 0;                                       \
00087     }
00088 
00089 #define GLibFunc3(ret, func, argtype1, argname1,        \
00090                             argtype2, argname2,         \
00091                             argtype3, argname3)         \
00092     ret func(argtype1 argname1,                         \
00093              argtype2 argname2,                         \
00094              argtype3 argname3)                         \
00095     {                                                   \
00096         typedef ret (GLibCallType *p_##func)(argtype1,  \
00097                                 argtype2,               \
00098                                 argtype3);              \
00099         p_##func p = (p_##func) GetAddress(#func);      \
00100         if (p)                                          \
00101         {                                               \
00102             return p(argname1, argname2, argname3);     \
00103         }                                               \
00104         GLibBreakPoint                                  \
00105         return 0;                                       \
00106     }
00107 
00108 #define GLibFunc4(ret, func, argtype1, argname1,        \
00109                             argtype2, argname2,         \
00110                             argtype3, argname3,         \
00111                             argtype4, argname4)         \
00112     ret func(argtype1 argname1,                         \
00113              argtype2 argname2,                         \
00114              argtype3 argname3,                         \
00115              argtype4 argname4)                         \
00116     {                                                   \
00117         typedef ret (GLibCallType *p_##func)(argtype1,  \
00118                                 argtype2,               \
00119                                 argtype3,               \
00120                                 argtype4);              \
00121         p_##func p = (p_##func) GetAddress(#func);      \
00122         if (p)                                          \
00123         {                                               \
00124             return p(argname1, argname2,                \
00125                      argname3, argname4);               \
00126         }                                               \
00127         GLibBreakPoint                                  \
00128         return 0;                                       \
00129     }
00130 
00131 #define GLibFunc5(ret, func, argtype1, argname1,        \
00132                             argtype2, argname2,         \
00133                             argtype3, argname3,         \
00134                             argtype4, argname4,         \
00135                             argtype5, argname5)         \
00136     ret func(argtype1 argname1,                         \
00137              argtype2 argname2,                         \
00138              argtype3 argname3,                         \
00139              argtype4 argname4,                         \
00140              argtype5 argname5)                         \
00141     {                                                   \
00142         typedef ret (GLibCallType *p_##func)(argtype1,  \
00143                                 argtype2,               \
00144                                 argtype3,               \
00145                                 argtype4,               \
00146                                 argtype5);              \
00147         p_##func p = (p_##func) GetAddress(#func);      \
00148         if (p)                                          \
00149         {                                               \
00150             return p(argname1, argname2,                \
00151                      argname3, argname4,                \
00152                      argname5);                         \
00153         }                                               \
00154         GLibBreakPoint                                  \
00155         return 0;                                       \
00156     }
00157 
00158 
00159 #endif

Generated on Wed Oct 26 14:46:49 2005 for Lgi by  doxygen 1.4.1