Mercurial > projects > dwt2
diff base/src/java/nonstandard/SharedLib.d @ 46:17310ba3c1bc
Moved all load lib functionality into own module
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Fri, 27 Mar 2009 11:10:45 +0100 |
parents | |
children | 65761bc28ab2 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/base/src/java/nonstandard/SharedLib.d Fri Mar 27 11:10:45 2009 +0100 @@ -0,0 +1,70 @@ +module java.nonstandard.SharedLib; + +import java.lang.all; + +struct Symbol { + String name; + void** symbol; +} + +struct SymbolVersioned2 { + String name; + void** symbol; + int major; + int minor; +} + +struct SharedLib { + static void loadLibSymbols( SymbolVersioned2[] symbols, String libname, int major, int minor ){ + version(Tango){ + if (auto lib = tango.sys.SharedLib.SharedLib.load(libname)) { + foreach( inout s; symbols ){ + if( s.major < major ) continue; + if( s.major == major && s.minor > minor ) continue; + *s.symbol = lib.getSymbol( s.name.ptr ); + if( s.symbol is null ){ + getDwtLogger.error( __FILE__, __LINE__, "{}: Symbol '{}' not found", libname, s.name ); + } + } + } else { + getDwtLogger.error( __FILE__, __LINE__, "Could not load the library {}", libname ); + } + } else { // Phobos + implMissing( __FILE__, __LINE__ ); + } + } + static void loadLibSymbols( Symbol[] symbols, String libname ){ + version(Tango){ + if (auto lib = tango.sys.SharedLib.SharedLib.load(libname)) { + foreach( inout s; symbols ){ + *s.symbol = lib.getSymbol( s.name.ptr ); + if( s.symbol is null ){ + getDwtLogger.error( __FILE__, __LINE__, "{}: Symbol '{}' not found", libname, s.name ); + } + } + } else { + getDwtLogger.error( __FILE__, __LINE__, "Could not load the library {}", libname ); + } + } else { // Phobos + implMissing( __FILE__, __LINE__ ); + } + } + static bool tryUseSymbol( String symbolname, String libname, void delegate( void*) dg ){ + bool result = false; + version(Tango){ + if (auto lib = tango.sys.SharedLib.SharedLib.load( libname ) ) { + void* ptr = lib.getSymbol(symbolname); + if (ptr !is null){ + dg(ptr); + result = true; + } + lib.unload(); + } + } else { // Phobos + implMissing( __FILE__, __LINE__ ); + } + return result; + } +} + +