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;