33#if defined(__unix__ ) || defined(__APPLE__ )
44
55#include <dlfcn.h>
6- #include <stddef.h>
76#include <err.h>
7+ #include <stddef.h>
8+ #include <stdlib.h>
9+ #include <string.h>
810
911void * ga_load_library (const char * name ) {
1012 void * res = dlopen (name , RTLD_LAZY |RTLD_LOCAL );
@@ -24,10 +26,50 @@ void *ga_func_ptr(void *h, const char *name) {
2426 return res ;
2527}
2628
29+ float ga_lib_version (void * h , void * sym ) {
30+ Dl_info dli ;
31+ char * real_path ;
32+ char * dot1 ;
33+ char * dot2 ;
34+ char * end ;
35+ float res ;
36+
37+ if (!dladdr (sym , & dli ))
38+ return -1 ;
39+
40+ real_path = realpath (dli .dli_fname , NULL );
41+ if (real_path == NULL )
42+ return -1 ;
43+
44+ dot1 = strrchr (real_path , '.' );
45+ if (dot1 == NULL ) {
46+ free (real_path );
47+ return -1 ;
48+ }
49+ dot1 [0 ] = '\0' ;
50+
51+ dot2 = strrchr (real_path , '.' );
52+ if (dot2 == NULL ) {
53+ free (real_path );
54+ return -1 ;
55+ }
56+ dot1 [0 ] = '.' ;
57+
58+ res = strtof (dot2 + 1 , & end );
59+ if (* end != '\0' ) {
60+ free (real_path );
61+ return -1 ;
62+ }
63+
64+ free (real_path );
65+ return res ;
66+ }
67+
2768#else
2869
2970/* Should be windows */
3071#include <windows.h>
72+ #pragma comment(lib,"Version.lib")
3173
3274void * ga_load_library (const char * name ) {
3375 return LoadLibrary (name );
@@ -37,4 +79,39 @@ void *ga_func_ptr(void *h, const char *name) {
3779 return (void * )GetProcAddress (h , name );
3880}
3981
82+ float ga_lib_version (void * h , void * sym ) {
83+ char fname [1024 ];
84+ char * vinfo ;
85+ size_t vsize ;
86+ VS_FIXEDFILEINFO * vp ;
87+ unsigned int ui ;
88+ float res ;
89+
90+ if (GetModuleFileName (h , fname , sizeof (fname )) == sizeof (fname ))
91+ return -1 ;
92+
93+ vsize = GetFileVersionInfoSize (fname , NULL );
94+ if (vsize == 0 )
95+ return -1 ;
96+
97+ vinfo = malloc (vsize );
98+ if (vinfo == NULL )
99+ return -1 ;
100+
101+ if (!GetFileVersionInfo (fname , 0 , vsize , vinfo )) {
102+ free (vinfo );
103+ return -1 ;
104+ }
105+
106+ if (!VerQueryValue (vinfo , "\\" , & vp , & ui )) {
107+ free (vinfo );
108+ return -1 ;
109+ }
110+
111+ res = ( ((HIWORD (vp -> dwFileVersionLS ) - 10 ) * 10000 ) + LOWORD (vp -> dwFileVersionLS ) ) / 100.0 ;
112+
113+ free (vinfo );
114+ return res ;
115+ }
116+
40117#endif
0 commit comments