diff options
Diffstat (limited to 'hereiam/here_i_am.adb')
-rw-r--r-- | hereiam/here_i_am.adb | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/hereiam/here_i_am.adb b/hereiam/here_i_am.adb new file mode 100644 index 0000000..879e07e --- /dev/null +++ b/hereiam/here_i_am.adb @@ -0,0 +1,89 @@ + + +-- Programmed by Jedidiah Barber +-- Released into the public domain + + +with + + Ada.Assertions, + Interfaces.C.Strings, + System.Storage_Elements; + +use type + + Interfaces.C.int; + + +package body Here_I_Am is + + + package Storage renames System.Storage_Elements; + + Null_Pointer : constant Storage.Integer_Address := Storage.To_Integer (System.Null_Address); + + + + + function wai_getExecutablePath + (Buffer : in Interfaces.C.Strings.chars_ptr; + Length : in Interfaces.C.int; + Dir : in Storage.Integer_Address) + return Interfaces.C.int; + pragma Import (C, wai_getExecutablePath, "wai_getExecutablePath"); + pragma Inline (wai_getExecutablePath); + + function wai_getModulePath + (Buffer : in Interfaces.C.Strings.chars_ptr; + Length : in Interfaces.C.int; + Dir : in Storage.Integer_Address) + return Interfaces.C.int; + pragma Import (C, wai_getModulePath, "wai_getModulePath"); + pragma Inline (wai_getModulePath); + + + + + function Executable + return String + is + Path_Length : constant Interfaces.C.int := + wai_getExecutablePath (Interfaces.C.Strings.Null_Ptr, 0, Null_Pointer); + Data_Buffer : aliased Interfaces.C.char_array := + (1 .. Interfaces.C.size_t (Path_Length) => Interfaces.C.nul); + Code : constant Interfaces.C.int := wai_getExecutablePath + (Interfaces.C.Strings.To_Chars_Ptr (Data_Buffer'Unchecked_Access), + Path_Length, + Null_Pointer); + begin + pragma Assert (Code >= 0); + return Interfaces.C.To_Ada (Data_Buffer, False); + exception + when Ada.Assertions.Assertion_Error => raise Where_Is_Error with + "wai_getExecutablePath returned int value of " & Interfaces.C.int'Image (Code); + end Executable; + + + function Module + return String + is + Path_Length : constant Interfaces.C.int := + wai_getModulePath (Interfaces.C.Strings.Null_Ptr, 0, Null_Pointer); + Data_Buffer : aliased Interfaces.C.char_array := + (1 .. Interfaces.C.size_t (Path_Length) => Interfaces.C.nul); + Code : constant Interfaces.C.int := wai_getModulePath + (Interfaces.C.Strings.To_Chars_Ptr (Data_Buffer'Unchecked_Access), + Path_Length, + Null_Pointer); + begin + pragma Assert (Code >= 0); + return Interfaces.C.To_Ada (Data_Buffer, False); + exception + when Ada.Assertions.Assertion_Error => raise Where_Is_Error with + "wai_getModulePath returned int value of " & Interfaces.C.int'Image (Code); + end Module; + + +end Here_I_Am; + + |