aboutsummaryrefslogtreecommitdiff
path: root/hereiam/here_i_am.adb
diff options
context:
space:
mode:
Diffstat (limited to 'hereiam/here_i_am.adb')
-rw-r--r--hereiam/here_i_am.adb89
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;
+
+