blob: 660a1cf06a5d6198d73198fa085cbfd3a219e019 [file] [log] [blame]
with Interfaces.C;
with Interfaces.C.Strings;
use Interfaces.C;
package body FS.FILO.VFS
with
SPARK_Mode => Off,
Convention => C
is
State : T := Initial;
function C_Mount return int
is
Success : Boolean;
begin
if not Is_Mounted (State) then
State := Initial; -- Work around not having an unmount in FILO.
end if;
Mount (State, Part_Len, Success);
return (if Success then 1 else 0);
end C_Mount;
function C_Open (File_Path : Strings.chars_ptr) return int
is
File_Len : File_Length;
Success : Boolean;
begin
if Is_Mounted (State) and not Is_Open (State) then
Open (State, File_Len, Strings.Value (File_Path), Success);
Set_File_Max (File_Len);
else
Success := False;
end if;
return (if Success then 1 else 0);
end C_Open;
procedure C_Close is
begin
if Is_Open (State) then
Close (State);
end if;
end C_Close;
function C_Read (Buf : System.Address; Len : int) return int
is
subtype Buffer_Range is Natural range 0 .. Integer (Len) - 1;
Buffer : Buffer_Type (Buffer_Range)
with
Convention => C,
Address => Buf;
File_Pos : File_Offset := FILO.File_Pos;
Read_Len : Natural;
begin
if Is_Open (State) then
Read (State, File_Max, File_Pos, Buffer, Read_Len);
Set_File_Pos (File_Pos);
else
Read_Len := 0;
end if;
return int (Read_Len);
end C_Read;
end FS.FILO.VFS;