ソースを参照

added a small tool with platform-independent interface for managing dynamic libraries in HOST OS

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7775 8c9fc860-2736-0410-a75d-ab315db34111
eth.morozova 7 年 前
コミット
f0473f56ad
2 ファイル変更147 行追加0 行削除
  1. 79 0
      source/Unix.HostLibs.Mod
  2. 68 0
      source/Win.HostLibs.Mod

+ 79 - 0
source/Unix.HostLibs.Mod

@@ -0,0 +1,79 @@
+(**
+	AUTHOR: Alexey Morozov
+	PURPOSE: Dynamic library tools for Unix platforms
+*)
+MODULE HostLibs;
+
+IMPORT
+	Unix;
+
+TYPE
+	LibHandle* = ADDRESS; (** dynamic library handle type *)
+
+CONST
+	NilLibHandle* = NIL; (** invalid library handle *)
+	
+(*
+	dlopen flags
+	
+	#define RTLD_LAZY     0x0001
+	#define RTLD_NOW      0x0002
+	#define RTLD_GLOBAL   0x0100
+	#define RTLD_LOCAL    0x0000
+	#define RTLD_NOSHARE  0x1000
+	#define RTLD_EXE      0x2000
+	#define RTLD_SCRIPT   0x4000
+*)
+
+	(**
+		Load a dynamic library
+
+		fileName: library file name
+		lib: returned loaded library handle; NilLibHandle in case of an error
+
+		Return: TRUE in case of success
+	*)
+	PROCEDURE LoadLibrary*(CONST fileName: ARRAY OF CHAR; VAR lib: LibHandle): BOOLEAN;
+	BEGIN
+		lib := Unix.Dlopen(fileName, 0x0002);
+		RETURN (lib # NilLibHandle);
+	FINALLY
+		RETURN FALSE;
+	END LoadLibrary;
+
+	(**
+		Free a previously loaded dynamic library
+
+		lib: library handle
+		
+		Return: TRUE in case of success
+	*)
+	PROCEDURE FreeLibrary*(CONST lib: LibHandle): BOOLEAN;
+	BEGIN
+		Unix.Dlclose(lib);
+		RETURN TRUE;
+	FINALLY
+		RETURN FALSE;
+	END FreeLibrary;
+
+	(**
+		Get a procedure from a loaded dynamic library
+
+		lib: library handle
+		name: name of the procedure
+		procAddr: address of the destination procedure pointer (e.g. ADDRESSOF(procedureVariable))
+
+		Return: TRUE in case of success
+	*)
+	PROCEDURE GetProcedure*(CONST lib: LibHandle; CONST name: ARRAY OF CHAR; CONST procAddr: ADDRESS): BOOLEAN;
+	VAR addr: ADDRESS;
+	BEGIN
+		ASSERT(procAddr # NIL);
+		Unix.Dlsym(lib,name,procAddr);
+		SYSTEM.GET(procAddr,addr);
+		RETURN addr # NIL;
+	FINALLY
+		RETURN FALSE;
+	END GetProcedure;
+
+END HostLibs.

+ 68 - 0
source/Win.HostLibs.Mod

@@ -0,0 +1,68 @@
+(**
+	AUTHOR: Alexey Morozov
+	PURPOSE: Dynamic library tools for Windows platforms
+*)
+MODULE HostLibs;
+
+IMPORT
+	SYSTEM, Kernel32;
+
+TYPE
+	LibHandle* = Kernel32.HANDLE; (** dynamic library handle type *)
+
+CONST
+	NilLibHandle* = Kernel32.NULL; (** invalid library handle *)
+
+	(**
+		Load a dynamic library
+
+		fileName: library file name
+		lib: returned loaded library handle; NilLibHandle in case of an error
+
+		Return: TRUE in case of success
+	*)
+	PROCEDURE LoadLibrary*(CONST fileName: ARRAY OF CHAR; VAR lib: LibHandle): BOOLEAN;
+	BEGIN
+		lib := Kernel32.LoadLibrary(fileName);
+		RETURN (lib # NilLibHandle);
+	FINALLY
+		RETURN FALSE;
+	END LoadLibrary;
+
+	(**
+		Free a previously loaded dynamic library
+
+		lib: library handle
+		
+		Return: TRUE in case of success
+	*)
+	PROCEDURE FreeLibrary*(CONST lib: LibHandle): BOOLEAN;
+	BEGIN
+		RETURN (Kernel32.FreeLibrary(lib) # 0);
+	FINALLY
+		RETURN FALSE;
+	END FreeLibrary;
+
+	(**
+		Get a procedure from a loaded dynamic library
+
+		lib: library handle
+		name: name of the procedure
+		procAddr: address of the destination procedure pointer (e.g. ADDRESSOF(procedureVariable))
+
+		Return: TRUE in case of success
+	*)
+	PROCEDURE GetProcedure*(CONST lib: LibHandle; CONST name: ARRAY OF CHAR; CONST procAddr: ADDRESS): BOOLEAN;
+	VAR addr: ADDRESS;
+	BEGIN
+		ASSERT(procAddr # NIL);
+		Kernel32.GetProcAddress(lib,name,addr);
+		IF addr # NIL THEN
+			SYSTEM.PUT(procAddr,addr);
+			RETURN TRUE;
+		END;
+	FINALLY
+		RETURN FALSE;
+	END GetProcedure;
+
+END HostLibs.