Add NullFS
Signed-off-by: Thomas Heijligen <src@posteo.de>
diff --git a/src/filo-fs-nullfs.adb b/src/filo-fs-nullfs.adb
new file mode 100644
index 0000000..105e985
--- /dev/null
+++ b/src/filo-fs-nullfs.adb
@@ -0,0 +1,99 @@
+package body FILO.FS.NullFS is
+
+ Global_NullFS : NullFS_Type := (
+ State => Unmounted
+ );
+
+ procedure Mount
+ (Item : in out NullFS_Type;
+ Success : out Boolean)
+ is
+ begin
+ Success := True;
+ Item.State := Mounted;
+ end Mount;
+
+ procedure Open
+ (Item : in out NullFS_Type;
+ Path : in String;
+ Success : out Boolean)
+ is
+ begin
+ Success := True;
+ Item.State := File_Open;
+ end Open;
+
+ procedure Read
+ (Item : in out NullFS_Type;
+ Buffer : in out Buffer_Type;
+ Offset : in Natural;
+ Success : out Boolean)
+ is
+ begin
+ Success := True;
+ null;
+ end Read;
+
+ procedure Close
+ (Item : in out NullFS_Type;
+ Success : out Boolean)
+ is
+ begin
+ Success := True;
+ Item.State := Mounted;
+ end Close;
+
+ ---------------------------------------------------------------------A
+
+ function To_Int (Success : Boolean) return Interfaces.C.int is
+ (if Success then 1 else 0);
+
+ function C_Mount return Interfaces.C.int
+ is
+ Success : Boolean;
+ begin
+ Mount(Global_NullFS, Success);
+ return To_Int (Success);
+ end C_Mount;
+
+ function C_Read
+ (buf : System.Address;
+ len : Interfaces.C.int)
+ return Interfaces.C.int
+ with SPARK_Mode => Off
+ is
+ use FILO.FS;
+ Buffer : Buffer_Type (0 .. Integer(len) - 1) with Address => buf;
+ Offset : Natural := Natural(File_Pos);
+ Success : Boolean;
+ begin
+ Read (Global_NullFS, Buffer, Offset, Success);
+ if Success then
+ Set_File_Pos (File_Length (Offset + Buffer'Length));
+ end if;
+ return To_Int (Success);
+
+ end C_Read;
+
+ function C_Dir
+ (Path : Interfaces.C.Strings.chars_ptr)
+ return Interfaces.C.int
+ with SPARK_Mode => Off
+ is
+ use Interfaces.C.Strings;
+ Success : Boolean;
+ begin
+ Open (Global_NullFS, Value (Path), Success);
+ return To_Int (Success);
+ end C_Dir;
+
+ function C_Close return Interfaces.C.int
+ with SPARK_Mode => Off
+ is
+ Success : Boolean;
+ begin
+ Close (Global_NullFS, Success);
+ return To_Int (Success);
+ end C_Close;
+
+end FILO.FS.NullFS;
diff --git a/src/filo-fs-nullfs.ads b/src/filo-fs-nullfs.ads
new file mode 100644
index 0000000..5f0bd5b
--- /dev/null
+++ b/src/filo-fs-nullfs.ads
@@ -0,0 +1,66 @@
+with Interfaces.C;
+with Interfaces.C.Strings;
+with System;
+
+package FILO.FS.NullFS is
+ type NullFS_Type is private;
+
+
+ procedure Mount
+ (Item : in out NullFS_Type;
+ Success : out Boolean);
+
+ procedure Open
+ (Item : in out NullFS_Type;
+ Path : in String;
+ Success : out Boolean);
+
+ procedure Read
+ (Item : in out NullFS_Type;
+ Buffer : in out Buffer_Type;
+ Offset : in Natural;
+ Success : out Boolean);
+
+ procedure Close
+ (Item : in out NullFS_Type;
+ Success : out Boolean);
+
+ ---------------------------------------------------------------------
+
+ function C_Mount return Interfaces.C.int
+ with
+ Export,
+ Convention => C,
+ External_Name => "nullfs_mount";
+
+ function C_Read
+ (buf : System.Address;
+ len : Interfaces.C.int)
+ return Interfaces.C.int
+ with
+ Export,
+ Convention => C,
+ External_Name => "nullfs_read";
+
+ function C_Dir
+ (Path : Interfaces.C.Strings.chars_ptr)
+ return Interfaces.C.int
+ with
+ Export,
+ Convention => C,
+ External_Name => "nullfs_dir";
+
+ function C_Close return Interfaces.C.int
+ with
+ Export,
+ Convention => C,
+ External_Name => "nullfs_close";
+
+private
+ type State_Type is (Unmounted, Mounted, File_Open);
+
+ type NullFS_Type is record
+ State : State_Type;
+ end record;
+
+end FILO.FS.NullFS;