implemented some functions h2-io-file.
renamed h2-sysapi to h2-os
This commit is contained in:
		@ -8,9 +8,9 @@ EXTRA_DIST =  \
 | 
			
		||||
	h2-ascii.ads  \
 | 
			
		||||
	h2-utf8.ads \
 | 
			
		||||
	h2-utf8.adb  \
 | 
			
		||||
	h2-sysapi.ads \
 | 
			
		||||
	h2-sysapi.adb \
 | 
			
		||||
	posix/h2-sysapi-file.adb \
 | 
			
		||||
	h2-os.ads \
 | 
			
		||||
	h2-os.adb \
 | 
			
		||||
	posix/h2-os-file.adb \
 | 
			
		||||
	h2-io.ads \
 | 
			
		||||
	h2-io.adb \
 | 
			
		||||
	h2-io-file.adb \
 | 
			
		||||
 | 
			
		||||
@ -178,9 +178,9 @@ EXTRA_DIST = \
 | 
			
		||||
	h2-ascii.ads  \
 | 
			
		||||
	h2-utf8.ads \
 | 
			
		||||
	h2-utf8.adb  \
 | 
			
		||||
	h2-sysapi.ads \
 | 
			
		||||
	h2-sysapi.adb \
 | 
			
		||||
	posix/h2-sysapi-file.adb \
 | 
			
		||||
	h2-os.ads \
 | 
			
		||||
	h2-os.adb \
 | 
			
		||||
	posix/h2-os-file.adb \
 | 
			
		||||
	h2-io.ads \
 | 
			
		||||
	h2-io.adb \
 | 
			
		||||
	h2-io-file.adb \
 | 
			
		||||
 | 
			
		||||
@ -1,3 +1,5 @@
 | 
			
		||||
with H2.Ascii;
 | 
			
		||||
 | 
			
		||||
separate (H2.IO)
 | 
			
		||||
 | 
			
		||||
package body File is
 | 
			
		||||
@ -7,7 +9,10 @@ package body File is
 | 
			
		||||
	                Flag: in     Flag_Record;
 | 
			
		||||
	                Pool: in     Storage_Pool_Pointer := null) is
 | 
			
		||||
	begin
 | 
			
		||||
		Sysapi.File.Open (File.File, Name, flag, Pool => Pool);
 | 
			
		||||
		OS.File.Open (File.File, Name, Flag, Pool => Pool);
 | 
			
		||||
		File.Rbuf.Length := 0;
 | 
			
		||||
		File.Wbuf.Length := 0;
 | 
			
		||||
		File.EOF := Standard.False;
 | 
			
		||||
	end Open;
 | 
			
		||||
 | 
			
		||||
	procedure Open (File: in out File_Record;
 | 
			
		||||
@ -15,41 +20,226 @@ package body File is
 | 
			
		||||
	                Flag: in     Flag_Record;
 | 
			
		||||
	                Pool: in     Storage_Pool_Pointer := null) is
 | 
			
		||||
	begin
 | 
			
		||||
		Sysapi.File.Open (File.File, Name, flag, Pool => Pool);
 | 
			
		||||
		OS.File.Open (File.File, Name, Flag, Pool => Pool);
 | 
			
		||||
		File.Rbuf.Length := 0;
 | 
			
		||||
		File.Wbuf.Length := 0;
 | 
			
		||||
		File.EOF := Standard.False;
 | 
			
		||||
	end Open;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	procedure Close (File: in out File_Record) is
 | 
			
		||||
	begin
 | 
			
		||||
		Sysapi.File.Close (File.File);
 | 
			
		||||
		OS.File.Close (File.File);
 | 
			
		||||
		File.File := null;
 | 
			
		||||
		File.Last := System_Length'First;
 | 
			
		||||
	end Close;
 | 
			
		||||
 | 
			
		||||
	procedure OS_Read_File (File:   in out File_Record;
 | 
			
		||||
	                        Buffer: in out System_Byte_Array;
 | 
			
		||||
	                        Length: out    System_Length) is
 | 
			
		||||
	begin
 | 
			
		||||
		OS.File.Read (File.File, Buffer, Length);
 | 
			
		||||
		File.EOF := (Length <= 0);
 | 
			
		||||
	end OS_Read_File;
 | 
			
		||||
 | 
			
		||||
	procedure Read (File:   in out File_Record; 
 | 
			
		||||
	                Buffer: in out Slim_String;
 | 
			
		||||
	                Last:   out    System_Length) is
 | 
			
		||||
	                Length: out    System_Length) is
 | 
			
		||||
		pragma Assert (Buffer'Length > 0);
 | 
			
		||||
 | 
			
		||||
		Outbuf: System_Byte_Array (Buffer'Range);
 | 
			
		||||
		for Outbuf'Address use Buffer'Address;
 | 
			
		||||
 | 
			
		||||
		Rbuf: File_Buffer renames File.Rbuf;
 | 
			
		||||
		L1, L2: System_Length;
 | 
			
		||||
	begin
 | 
			
		||||
		null;
 | 
			
		||||
		if Rbuf.Length <= 0 and then File.EOF then
 | 
			
		||||
			-- raise EOF EXCEPTION. ???
 | 
			
		||||
			Length := 0;
 | 
			
		||||
			return;
 | 
			
		||||
		end if;
 | 
			
		||||
 | 
			
		||||
		if Outbuf'Length >= Rbuf.Data'Length then
 | 
			
		||||
			-- The output buffer size if greater than the internal buffer size.
 | 
			
		||||
 | 
			
		||||
			L1 := Rbuf.Length;
 | 
			
		||||
			if L1 < Outbuf'Length then
 | 
			
		||||
				-- Read into the tail of the output buffer if insufficient
 | 
			
		||||
				-- data is available in the internal buffer.
 | 
			
		||||
				OS_Read_File (File, Outbuf(Outbuf'First + L1 .. Outbuf'Last), L2);
 | 
			
		||||
			end if;
 | 
			
		||||
 | 
			
		||||
			-- Fill the head of the output buffer with the internal buffer contents
 | 
			
		||||
			Outbuf(Outbuf'First .. Outbuf'First + L1 - 1) := Rbuf.Data(Rbuf.Data'First .. Rbuf.Data'First + L1 - 1);
 | 
			
		||||
 | 
			
		||||
			-- Empty the internal buffer.
 | 
			
		||||
			Rbuf.Length := 0;
 | 
			
		||||
 | 
			
		||||
			-- Set the output length
 | 
			
		||||
			Length := L1 + L2;
 | 
			
		||||
		else
 | 
			
		||||
			if Rbuf.Length < Rbuf.Data'Length then
 | 
			
		||||
				-- Attempt to fill the internal buffer. It may not get full with a single read.
 | 
			
		||||
				OS_Read_File (File, Rbuf.Data(Rbuf.Data'First + Rbuf.Length .. Rbuf.Data'Last), L1);
 | 
			
		||||
				Rbuf.Length := RBuf.Length + L1;
 | 
			
		||||
			end if;
 | 
			
		||||
 | 
			
		||||
			-- Determine how much need to be copied to the output buffer.
 | 
			
		||||
			If Outbuf'Length < Rbuf.Length then
 | 
			
		||||
				L2 := Outbuf'Length;
 | 
			
		||||
			else
 | 
			
		||||
				L2 := Rbuf.Length;
 | 
			
		||||
			end if;
 | 
			
		||||
 | 
			
		||||
			-- Copy the head of the internal buffer to the output buffer
 | 
			
		||||
			Outbuf(Outbuf'First .. Outbuf'First + L2 - 1) := Rbuf.Data(Rbuf.Data'First .. Rbuf.Data'First + L2 - 1);
 | 
			
		||||
 | 
			
		||||
			-- Move the residue of the internal buffer to the head
 | 
			
		||||
			Rbuf.Length := Rbuf.Length - L2;
 | 
			
		||||
			Rbuf.Data(Rbuf.Data'First .. Rbuf.Data'First + Rbuf.Length - 1) := Rbuf.Data(Rbuf.Data'First + L2 .. Rbuf.Data'First + L2 + Rbuf.Length - 1);
 | 
			
		||||
			
 | 
			
		||||
			-- Set the output length
 | 
			
		||||
			Length := L2;
 | 
			
		||||
		end if;
 | 
			
		||||
 | 
			
		||||
	end Read;
 | 
			
		||||
 | 
			
		||||
	procedure Read (File:   in out File_Record; 
 | 
			
		||||
	                Buffer: in out Wide_String;
 | 
			
		||||
	                Last:   out    System_Length) is
 | 
			
		||||
	                Length: out    System_Length) is
 | 
			
		||||
		pragma Assert (Buffer'Length > 0);
 | 
			
		||||
		Outbuf: Wide_String renames Buffer;
 | 
			
		||||
 | 
			
		||||
		Rbuf: File_Buffer renames File.Rbuf;
 | 
			
		||||
		Inbuf: Slim_String (Rbuf.Data'Range);
 | 
			
		||||
		for Inbuf'Address use Rbuf.Data'Address;
 | 
			
		||||
		
 | 
			
		||||
		L1, L2, L3, I, J, K: System_Length;
 | 
			
		||||
 | 
			
		||||
	begin
 | 
			
		||||
		if Rbuf.Length <= 0 and then File.EOF then
 | 
			
		||||
			-- raise EOF EXCEPTION. ???
 | 
			
		||||
			Length := 0;
 | 
			
		||||
			return;
 | 
			
		||||
		end if;
 | 
			
		||||
 | 
			
		||||
		K := Outbuf'First - 1;
 | 
			
		||||
 | 
			
		||||
		outer: loop
 | 
			
		||||
			if Rbuf.Length < Rbuf.Data'Length then
 | 
			
		||||
				-- Attempt to fill the internal buffer. It may not get full with a single read.
 | 
			
		||||
				OS_Read_File (File, Rbuf.Data(Rbuf.Data'First + Rbuf.Length .. Rbuf.Data'Last), L1);
 | 
			
		||||
				File.EOF := (L1 <= 0);
 | 
			
		||||
				Rbuf.Length := Rbuf.Length + L1;
 | 
			
		||||
			end if;
 | 
			
		||||
 | 
			
		||||
			if Rbuf.Length <= 0 then
 | 
			
		||||
				exit outer;
 | 
			
		||||
			end if;
 | 
			
		||||
 | 
			
		||||
			L2 := Rbuf.Data'First + Rbuf.Length - 1; -- Last index of the internal buffer
 | 
			
		||||
			I := Rbuf.Data'First;
 | 
			
		||||
			loop
 | 
			
		||||
				L3 := Sequence_Length (Inbuf(I));
 | 
			
		||||
				if L2 - I + 1 < L3 then
 | 
			
		||||
					exit;
 | 
			
		||||
				end if;
 | 
			
		||||
 | 
			
		||||
				K := K + 1;
 | 
			
		||||
				J := I + L3;
 | 
			
		||||
				Outbuf(K..K) := Slim_To_Wide(Inbuf(I .. J - 1));
 | 
			
		||||
				I := J;
 | 
			
		||||
				
 | 
			
		||||
				--if K >= Outbuf'Last or else Outbuf(K) = Ascii.Pos.LF then -- TODO: different line terminator
 | 
			
		||||
				--	L1 := I - Rbuf.Data'First + 1; -- Length of data copied to the output buffer.
 | 
			
		||||
				--	Rbuf.Length := Rbuf.Length - L1; -- Residue length
 | 
			
		||||
				--	Rbuf.Data(Rbuf.Data'First .. RBuf.Data'First + Rbuf.Length - 1) := Rbuf.Data(I + 1 .. L2); -- Copy residue
 | 
			
		||||
				--	exit outer; -- Done
 | 
			
		||||
				--end if;
 | 
			
		||||
			end loop;
 | 
			
		||||
 | 
			
		||||
			-- Empty the internal buffer;
 | 
			
		||||
			Rbuf.Length := 0;
 | 
			
		||||
		end loop outer;
 | 
			
		||||
 | 
			
		||||
		Length := K + 1 - Outbuf'First;
 | 
			
		||||
	end Read;
 | 
			
		||||
 | 
			
		||||
	procedure Read_Line (File:   in out File_Record;
 | 
			
		||||
	                     Buffer: in out Slim_String;
 | 
			
		||||
	                     Length: out   System_Length) is
 | 
			
		||||
 | 
			
		||||
		pragma Assert (Buffer'Length > 0);
 | 
			
		||||
 | 
			
		||||
		Outbuf: System_Byte_Array (Buffer'Range);
 | 
			
		||||
		for Outbuf'Address use Buffer'Address;
 | 
			
		||||
 | 
			
		||||
		Rbuf: File_Buffer renames File.Rbuf;
 | 
			
		||||
		L1, L2, K: System_Length;
 | 
			
		||||
 | 
			
		||||
		package Ascii is new H2.Ascii (Slim_Character);
 | 
			
		||||
	begin
 | 
			
		||||
		-- Unlike Read, this procedure should use the internal buffer
 | 
			
		||||
		-- regardless of the output buffer size as the position of
 | 
			
		||||
		-- the line terminator is unknown. 
 | 
			
		||||
		--
 | 
			
		||||
		-- If the buffer is not large enough to hold a line, the output
 | 
			
		||||
		-- is just truncated truncated to the buffer size.
 | 
			
		||||
 | 
			
		||||
		if Rbuf.Length <= 0 and then File.EOF then
 | 
			
		||||
			-- raise EOF EXCEPTION. ???
 | 
			
		||||
			Length := 0;
 | 
			
		||||
			return;
 | 
			
		||||
		end if;
 | 
			
		||||
 | 
			
		||||
		K := Outbuf'First - 1;
 | 
			
		||||
 | 
			
		||||
		outer: loop
 | 
			
		||||
			if Rbuf.Length < Rbuf.Data'Length then
 | 
			
		||||
				-- Attempt to fill the internal buffer. It may not get full with a single read.
 | 
			
		||||
				OS_Read_File (File, Rbuf.Data(Rbuf.Data'First + Rbuf.Length .. Rbuf.Data'Last), L1);
 | 
			
		||||
				File.EOF := (L1 <= 0);
 | 
			
		||||
				Rbuf.Length := Rbuf.Length + L1;
 | 
			
		||||
			end if;
 | 
			
		||||
 | 
			
		||||
			if Rbuf.Length <= 0 then
 | 
			
		||||
				exit outer;
 | 
			
		||||
			end if;
 | 
			
		||||
 | 
			
		||||
			L2 := Rbuf.Data'First + Rbuf.Length - 1; -- Last index of the internal buffer
 | 
			
		||||
			for I in Rbuf.Data'First .. L2 loop
 | 
			
		||||
				K := K + 1;
 | 
			
		||||
				Outbuf(K) := Rbuf.Data(I);
 | 
			
		||||
				if K >= Outbuf'Last or else Outbuf(K) = Ascii.Pos.LF then -- TODO: different line terminator
 | 
			
		||||
					L1 := I - Rbuf.Data'First + 1; -- Length of data copied to the output buffer.
 | 
			
		||||
					Rbuf.Length := Rbuf.Length - L1; -- Residue length
 | 
			
		||||
					Rbuf.Data(Rbuf.Data'First .. RBuf.Data'First + Rbuf.Length - 1) := Rbuf.Data(I + 1 .. L2); -- Copy residue
 | 
			
		||||
					exit outer; -- Done
 | 
			
		||||
				end if;
 | 
			
		||||
			end loop;
 | 
			
		||||
 | 
			
		||||
			-- Empty the internal buffer;
 | 
			
		||||
			Rbuf.Length := 0;
 | 
			
		||||
		end loop outer;
 | 
			
		||||
 | 
			
		||||
		Length := K + 1 - Outbuf'First;
 | 
			
		||||
	end Read_Line;
 | 
			
		||||
 | 
			
		||||
	procedure Read_Line (File:   in out File_Record;
 | 
			
		||||
	                     Buffer: in out Wide_String;
 | 
			
		||||
	                     Length: out   System_Length) is
 | 
			
		||||
	begin
 | 
			
		||||
		null;
 | 
			
		||||
	end Read;
 | 
			
		||||
	end Read_Line;
 | 
			
		||||
 | 
			
		||||
	procedure Write (File:   in out File_Record; 
 | 
			
		||||
	                 Buffer: in     Slim_String;
 | 
			
		||||
	                 Last:   out    System_Length) is
 | 
			
		||||
	                 Length: out    System_Length) is
 | 
			
		||||
	begin
 | 
			
		||||
		null;
 | 
			
		||||
	end Write;
 | 
			
		||||
 | 
			
		||||
	procedure Write (File:   in out File_Record; 
 | 
			
		||||
	                 Buffer: in     Wide_String;
 | 
			
		||||
	                 Last:   out    System_Length) is
 | 
			
		||||
	                 Length: out    System_Length) is
 | 
			
		||||
	begin
 | 
			
		||||
		null;
 | 
			
		||||
	end Write;
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
with H2.Sysapi;
 | 
			
		||||
with H2.OS;
 | 
			
		||||
 | 
			
		||||
generic
 | 
			
		||||
	type Slim_Character is (<>);
 | 
			
		||||
@ -7,31 +7,36 @@ generic
 | 
			
		||||
	type Wide_String is array(System_Index range<>) of Wide_Character;
 | 
			
		||||
	with function Slim_To_Wide (Slim: in Slim_String) return Wide_String;
 | 
			
		||||
	with function Wide_To_Slim (Wide: in Wide_String) return Slim_String;
 | 
			
		||||
 | 
			
		||||
	with function Sequence_Length (Slim: in Slim_Character) return System_Length;
 | 
			
		||||
 | 
			
		||||
package H2.IO is
 | 
			
		||||
 | 
			
		||||
	package Sysapi is new H2.Sysapi (Slim_Character, Wide_Character, Slim_String, Wide_String, Slim_To_Wide, Wide_To_Slim);
 | 
			
		||||
	package OS is new H2.OS (Slim_Character, Wide_Character, Slim_String, Wide_String, Slim_To_Wide, Wide_To_Slim);
 | 
			
		||||
 | 
			
		||||
	package File is
 | 
			
		||||
 | 
			
		||||
		subtype Flag_Record is Sysapi.File.Flag_Record;
 | 
			
		||||
		subtype Flag_Record is OS.File.Flag_Record;
 | 
			
		||||
		subtype Flag_Bits is OS.File.Flag_Bits;
 | 
			
		||||
 | 
			
		||||
		FLAG_READ:       constant := Sysapi.File.FLAG_READ;
 | 
			
		||||
		FLAG_WRITE:      constant := Sysapi.File.FLAG_WRITE;
 | 
			
		||||
		FLAG_CREATE:     constant := Sysapi.File.FLAG_CREATE;
 | 
			
		||||
		FLAG_EXCLUSIVE:  constant := Sysapi.File.FLAG_EXCLUSIVE;
 | 
			
		||||
		FLAG_TRUNCATE:   constant := Sysapi.File.FLAG_TRUNCATE;
 | 
			
		||||
		FLAG_APPEND:     constant := Sysapi.File.FLAG_APPEND;
 | 
			
		||||
		FLAG_NONBLOCK:   constant := Sysapi.File.FLAG_NONBLOCK;
 | 
			
		||||
		FLAG_SYNC:       constant := Sysapi.File.FLAG_SYNC;
 | 
			
		||||
		FLAG_NOFOLLOW:   constant := Sysapi.File.FLAG_NOFOLLOW;
 | 
			
		||||
		FLAG_READ:       constant Flag_Bits := OS.File.FLAG_READ;
 | 
			
		||||
		FLAG_WRITE:      constant Flag_Bits := OS.File.FLAG_WRITE;
 | 
			
		||||
		FLAG_CREATE:     constant Flag_Bits := OS.File.FLAG_CREATE;
 | 
			
		||||
		FLAG_EXCLUSIVE:  constant Flag_Bits := OS.File.FLAG_EXCLUSIVE;
 | 
			
		||||
		FLAG_TRUNCATE:   constant Flag_Bits := OS.File.FLAG_TRUNCATE;
 | 
			
		||||
		FLAG_APPEND:     constant Flag_Bits := OS.File.FLAG_APPEND;
 | 
			
		||||
		FLAG_NONBLOCK:   constant Flag_Bits := OS.File.FLAG_NONBLOCK;
 | 
			
		||||
		FLAG_SYNC:       constant Flag_Bits := OS.File.FLAG_SYNC;
 | 
			
		||||
		FLAG_NOFOLLOW:   constant Flag_Bits := OS.File.FLAG_NOFOLLOW;
 | 
			
		||||
 | 
			
		||||
		type File_Record is limited record
 | 
			
		||||
			File: Sysapi.File.File_Pointer := null;
 | 
			
		||||
			Buffer: System_Byte_Array (1 .. 2048);
 | 
			
		||||
			Last: System_Length := System_Length'First;
 | 
			
		||||
		end record;
 | 
			
		||||
		type File_Buffer is private;
 | 
			
		||||
		type File_Record is limited private;
 | 
			
		||||
			
 | 
			
		||||
 | 
			
		||||
		procedure Set_Flag_Bits (Flag: in out Flag_Record; 
 | 
			
		||||
		                         Bits: in     Flag_Bits) renames OS.File.Set_Flag_Bits;
 | 
			
		||||
 | 
			
		||||
		procedure Clear_Flag_Bits (Flag: in out Flag_Record;
 | 
			
		||||
		                           Bits: in     Flag_Bits) renames OS.File.Clear_Flag_Bits;
 | 
			
		||||
 | 
			
		||||
		procedure Open (File: in out File_Record; 
 | 
			
		||||
					 Name: in     Slim_String;
 | 
			
		||||
@ -47,21 +52,43 @@ package H2.IO is
 | 
			
		||||
 | 
			
		||||
		procedure Read (File:   in out File_Record; 
 | 
			
		||||
					 Buffer: in out Slim_String;
 | 
			
		||||
					 Last:   out    System_Length);
 | 
			
		||||
					 Length: out    System_Length);
 | 
			
		||||
 | 
			
		||||
		procedure Read (File:   in out File_Record;
 | 
			
		||||
					 Buffer: in out Wide_String;
 | 
			
		||||
					 Last:   out    System_Length);
 | 
			
		||||
					 Length: out    System_Length);
 | 
			
		||||
 | 
			
		||||
		procedure Read_Line (File:   in out File_Record; 
 | 
			
		||||
					      Buffer: in out Slim_String;
 | 
			
		||||
					      Length: out    System_Length);
 | 
			
		||||
 | 
			
		||||
		procedure Read_Line (File:   in out File_Record;
 | 
			
		||||
					      Buffer: in out Wide_String;
 | 
			
		||||
					      Length: out    System_Length);
 | 
			
		||||
 | 
			
		||||
		procedure Write (File:   in out File_Record; 
 | 
			
		||||
					  Buffer: in     Slim_String;
 | 
			
		||||
					  Last:   out    System_Length);
 | 
			
		||||
					  Length: out    System_Length);
 | 
			
		||||
 | 
			
		||||
		procedure Write (File:   in out File_Record;
 | 
			
		||||
					  Buffer: in     Wide_String;
 | 
			
		||||
					  Last:   out    System_Length);
 | 
			
		||||
					  Length: out    System_Length);
 | 
			
		||||
 | 
			
		||||
		procedure Flush (File: in out File_Record);
 | 
			
		||||
 | 
			
		||||
	private
 | 
			
		||||
		type File_Buffer is record
 | 
			
		||||
			Data: System_Byte_Array (1 .. 2048); -- TODO: determine the best size
 | 
			
		||||
			Length: System_Length := 0;
 | 
			
		||||
		end record;
 | 
			
		||||
 | 
			
		||||
		type File_Record is limited record
 | 
			
		||||
			File: OS.File.File_Pointer := null;
 | 
			
		||||
			Rbuf: File_Buffer;
 | 
			
		||||
			Wbuf: File_Buffer;
 | 
			
		||||
			EOF: Standard.Boolean := false;
 | 
			
		||||
		end record;
 | 
			
		||||
 | 
			
		||||
	end File;
 | 
			
		||||
 | 
			
		||||
end H2.IO;
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
package body H2.Sysapi is
 | 
			
		||||
package body H2.OS is
 | 
			
		||||
 | 
			
		||||
	package body File is separate;
 | 
			
		||||
 | 
			
		||||
@ -12,4 +12,4 @@ package body H2.Sysapi is
 | 
			
		||||
		Flag.Bits := Flag.Bits and not Bits;
 | 
			
		||||
	end Clear_File_Flag_Bits;
 | 
			
		||||
 | 
			
		||||
end H2.Sysapi;
 | 
			
		||||
end H2.OS;
 | 
			
		||||
@ -7,7 +7,7 @@ generic
 | 
			
		||||
	with function Slim_To_Wide (Slim: in Slim_String) return Wide_String;
 | 
			
		||||
	with function Wide_To_Slim (Wide: in Wide_String) return Slim_String;
 | 
			
		||||
 | 
			
		||||
package H2.Sysapi is
 | 
			
		||||
package H2.OS is
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -21,17 +21,20 @@ package H2.Sysapi is
 | 
			
		||||
		Bits: File_Mode_Bits := 0;
 | 
			
		||||
	end record;
 | 
			
		||||
 | 
			
		||||
	procedure Set_File_Flag_Bits (Flag: in out File_Flag_Record; Bits: in File_Flag_Bits);
 | 
			
		||||
	procedure Clear_File_Flag_Bits (Flag: in out File_Flag_Record; Bits: in File_Flag_Bits);
 | 
			
		||||
	procedure Set_File_Flag_Bits (Flag: in out File_Flag_Record; 
 | 
			
		||||
	                              Bits: in     File_Flag_Bits);
 | 
			
		||||
 | 
			
		||||
	procedure Clear_File_Flag_Bits (Flag: in out File_Flag_Record;
 | 
			
		||||
	                                Bits: in     File_Flag_Bits);
 | 
			
		||||
 | 
			
		||||
	package File is
 | 
			
		||||
		type File_Record is tagged null record;
 | 
			
		||||
		type File_Pointer is access all File_Record'Class;
 | 
			
		||||
 | 
			
		||||
		subtype Flag_Bits is Sysapi.File_Flag_Bits;
 | 
			
		||||
		subtype Mode_Bits is Sysapi.File_Mode_Bits;
 | 
			
		||||
		subtype Flag_Record is Sysapi.File_Flag_Record;
 | 
			
		||||
		subtype Mode_Record is Sysapi.File_Mode_Record;
 | 
			
		||||
		subtype Flag_Bits is OS.File_Flag_Bits;
 | 
			
		||||
		subtype Mode_Bits is OS.File_Mode_Bits;
 | 
			
		||||
		subtype Flag_Record is OS.File_Flag_Record;
 | 
			
		||||
		subtype Mode_Record is OS.File_Mode_Record;
 | 
			
		||||
 | 
			
		||||
		FLAG_READ:       constant Flag_Bits := 2#0000_0000_0000_0001#;
 | 
			
		||||
		FLAG_WRITE:      constant Flag_Bits := 2#0000_0000_0000_0010#;
 | 
			
		||||
@ -59,10 +62,10 @@ package H2.Sysapi is
 | 
			
		||||
		DEFAULT_MODE: constant Mode_Record := ( Bits => 2#110_100_100# );
 | 
			
		||||
 | 
			
		||||
		procedure Set_Flag_Bits (Flag: in out Flag_Record;
 | 
			
		||||
		                         Bits: in     Flag_Bits) renames Sysapi.Set_File_Flag_Bits;
 | 
			
		||||
		                         Bits: in     Flag_Bits) renames OS.Set_File_Flag_Bits;
 | 
			
		||||
 | 
			
		||||
		procedure Clear_Flag_Bits (Flag: in out Flag_Record;
 | 
			
		||||
		                           Bits: in     Flag_Bits) renames Sysapi.Clear_File_Flag_Bits;
 | 
			
		||||
		                           Bits: in     Flag_Bits) renames OS.Clear_File_Flag_Bits;
 | 
			
		||||
 | 
			
		||||
		function Get_Stdin return File_Pointer;
 | 
			
		||||
		function Get_Stdout return File_Pointer;
 | 
			
		||||
@ -84,11 +87,11 @@ package H2.Sysapi is
 | 
			
		||||
 | 
			
		||||
		procedure Read (File:   in     File_Pointer; 
 | 
			
		||||
		                Buffer: in out System_Byte_Array; 
 | 
			
		||||
		                Last:   out    System_Length);
 | 
			
		||||
		                Length: out    System_Length);
 | 
			
		||||
 | 
			
		||||
		procedure Write (File:   in  File_Pointer; 
 | 
			
		||||
		                 Buffer: in  System_Byte_Array; 
 | 
			
		||||
		                 Last:   out System_Length);
 | 
			
		||||
		                 Length: out System_Length);
 | 
			
		||||
 | 
			
		||||
		pragma Inline (Get_Stdin);
 | 
			
		||||
		pragma Inline (Get_Stdout);
 | 
			
		||||
@ -100,4 +103,4 @@ package H2.Sysapi is
 | 
			
		||||
	--                Mode: in  Mode_Record) renames File.Open;
 | 
			
		||||
	--procedure Close_File (File: in out File_Pointer) renames File.Close;
 | 
			
		||||
 | 
			
		||||
end H2.Sysapi;
 | 
			
		||||
end H2.OS;
 | 
			
		||||
@ -6,6 +6,9 @@ generic
 | 
			
		||||
package H2.Utf8 is
 | 
			
		||||
	pragma Preelaborate (Utf8);
 | 
			
		||||
 | 
			
		||||
	--Invalid_Unicode_Character: exception renames Invalid_Wide_Character;
 | 
			
		||||
	--Invalid_Utf8_Sequence: exception renames Invalid_Slim_Sequence;
 | 
			
		||||
	--Insufficient_Utf8_Sequence: exception renames Insifficient_Slim_Sequence;
 | 
			
		||||
	Invalid_Unicode_Character: exception;
 | 
			
		||||
	Invalid_Utf8_Sequence: exception;
 | 
			
		||||
	Insufficient_Utf8_Sequence: exception;
 | 
			
		||||
 | 
			
		||||
@ -1,10 +1,14 @@
 | 
			
		||||
project Lib is
 | 
			
		||||
 | 
			
		||||
	type Platform_Type is ("posix", "win32");
 | 
			
		||||
	Platform: Platform_Type := external ("platform", "posix");
 | 
			
		||||
 | 
			
		||||
	for Source_Dirs use (
 | 
			
		||||
		"@abs_srcdir@",
 | 
			
		||||
		"@abs_srcdir@/posix",
 | 
			
		||||
		"@abs_builddir@/posix"
 | 
			
		||||
		"@abs_srcdir@/" & Platform,
 | 
			
		||||
		"@abs_builddir@/" & Platform
 | 
			
		||||
	);
 | 
			
		||||
 | 
			
		||||
	for Library_Name use "h2";
 | 
			
		||||
	for Library_Kind use "dynamic";
 | 
			
		||||
	for Library_Dir use ".";
 | 
			
		||||
@ -13,10 +17,13 @@ project Lib is
 | 
			
		||||
 | 
			
		||||
	for Source_Files use (
 | 
			
		||||
		"h2.ads",
 | 
			
		||||
		"h2-sysdef.ads",
 | 
			
		||||
		"h2-ascii.ads",
 | 
			
		||||
		"h2-pool.adb",
 | 
			
		||||
		"h2-pool.ads",
 | 
			
		||||
		"h2-os.adb",
 | 
			
		||||
		"h2-os.ads",
 | 
			
		||||
		"h2-os-file.adb",
 | 
			
		||||
		"h2-sysdef.ads",
 | 
			
		||||
		"h2-io.ads",
 | 
			
		||||
		"h2-io.adb",
 | 
			
		||||
		"h2-io-file.adb",
 | 
			
		||||
@ -28,9 +35,6 @@ project Lib is
 | 
			
		||||
		"h2-scheme-execute-evaluate.adb",
 | 
			
		||||
		"h2-scheme-token.adb",
 | 
			
		||||
		"h2-slim.ads",
 | 
			
		||||
		"h2-sysapi.adb",
 | 
			
		||||
		"h2-sysapi.ads",
 | 
			
		||||
		"h2-sysapi-file.adb",
 | 
			
		||||
		"h2-utf8.adb",
 | 
			
		||||
		"h2-utf8.ads",
 | 
			
		||||
		"h2-wide.ads",
 | 
			
		||||
@ -43,8 +47,8 @@ project Lib is
 | 
			
		||||
		"h2.pool",
 | 
			
		||||
		"h2.scheme",
 | 
			
		||||
		"h2.slim",
 | 
			
		||||
		"h2.sysapi",
 | 
			
		||||
		"h2.sysdef",
 | 
			
		||||
		"h2.os",
 | 
			
		||||
		"h2.utf8",
 | 
			
		||||
		"h2.wide",
 | 
			
		||||
		"h2.wide_wide"
 | 
			
		||||
@ -56,6 +60,15 @@ project Lib is
 | 
			
		||||
		);
 | 
			
		||||
	end Compiler;
 | 
			
		||||
 | 
			
		||||
	--package Naming is
 | 
			
		||||
	--	case Platform is
 | 
			
		||||
	--		when "posix" =>
 | 
			
		||||
	--			for Body ("H2.OS.File") use "h2-os-file-posix.adb";
 | 
			
		||||
	--		when "win32" =>
 | 
			
		||||
	--			for Body ("H2.OS.File") use "h2-os-file-win32.adb";
 | 
			
		||||
	--	end case;
 | 
			
		||||
	--end Naming;
 | 
			
		||||
 | 
			
		||||
	--package Install is
 | 
			
		||||
	--	for Prefix use "@prefix@";
 | 
			
		||||
	--end Install;
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
with H2.Pool;
 | 
			
		||||
with H2.Sysdef;
 | 
			
		||||
 | 
			
		||||
separate (H2.Sysapi)
 | 
			
		||||
separate (H2.OS)
 | 
			
		||||
 | 
			
		||||
package body File is
 | 
			
		||||
 | 
			
		||||
@ -131,32 +131,35 @@ package body File is
 | 
			
		||||
		end if;
 | 
			
		||||
	end Close;
 | 
			
		||||
 | 
			
		||||
	procedure Read (File: in File_Pointer; Buffer: in out System_Byte_Array; Last: out System_Length) is
 | 
			
		||||
	procedure Read (File:   in     File_Pointer; 
 | 
			
		||||
	                Buffer: in out System_Byte_Array;
 | 
			
		||||
	                Length: out    System_Length) is
 | 
			
		||||
		pragma Assert (Buffer'Length > 0);
 | 
			
		||||
		F: Posix_File_Pointer := Posix_File_Pointer(File);
 | 
			
		||||
		N: Sysdef.ssize_t;
 | 
			
		||||
	begin
 | 
			
		||||
		N := Sys_Read (F.Handle, Buffer'Address, Buffer'Length);
 | 
			
		||||
		if Sysdef."<=" (N, ERROR_RETURN) then
 | 
			
		||||
			raise Constraint_Error; -- TODO rename exception
 | 
			
		||||
		elsif Sysdef."=" (N, 0) then
 | 
			
		||||
			Last := Buffer'First - 1;
 | 
			
		||||
		else
 | 
			
		||||
			Last := Buffer'First + System_Length(N) - 1;
 | 
			
		||||
			Length := System_Length(N);
 | 
			
		||||
		end if;
 | 
			
		||||
	end Read;
 | 
			
		||||
 | 
			
		||||
	procedure Write (File: in File_Pointer; Buffer: in System_Byte_Array; Last: out System_Length) is
 | 
			
		||||
	procedure Write (File:   in  File_Pointer; 
 | 
			
		||||
	                 Buffer: in  System_Byte_Array;
 | 
			
		||||
	                 Length: out System_Length) is
 | 
			
		||||
		pragma Assert (Buffer'Length > 0);
 | 
			
		||||
		F: Posix_File_Pointer := Posix_File_Pointer(File);
 | 
			
		||||
		N: Sysdef.ssize_t;
 | 
			
		||||
	begin
 | 
			
		||||
		N := Sys_Write (F.Handle, Buffer'Address, Buffer'Length);
 | 
			
		||||
		if Sysdef."<=" (N, ERROR_RETURN) then
 | 
			
		||||
			raise Constraint_Error; -- TODO rename exception
 | 
			
		||||
		elsif Sysdef."=" (N, 0) then
 | 
			
		||||
			Last := Buffer'First - 1;
 | 
			
		||||
		else
 | 
			
		||||
			Last := Buffer'First + System_Length(N) - 1;
 | 
			
		||||
			Length := System_Length(N);
 | 
			
		||||
		end if;
 | 
			
		||||
 | 
			
		||||
	end Write;
 | 
			
		||||
 | 
			
		||||
end File;
 | 
			
		||||
		Reference in New Issue
	
	Block a user