added experimental stream handling code
This commit is contained in:
		@ -1,6 +1,9 @@
 | 
			
		||||
with H2.Scheme;
 | 
			
		||||
with H2.Pool;
 | 
			
		||||
with Storage;
 | 
			
		||||
with Stream;
 | 
			
		||||
with Ada.Text_IO;
 | 
			
		||||
with Ada.Unchecked_Deallocation;
 | 
			
		||||
 | 
			
		||||
procedure scheme is
 | 
			
		||||
	package S renames H2.Scheme;
 | 
			
		||||
@ -10,12 +13,62 @@ procedure scheme is
 | 
			
		||||
 | 
			
		||||
	I: S.Object_Pointer;
 | 
			
		||||
	O: S.Object_Pointer;
 | 
			
		||||
 | 
			
		||||
	--String: aliased S.Object_String := "(car '(1 2 3))";
 | 
			
		||||
	String: aliased S.Object_String := "((lambda (x y) (+ x y))  9  7)";
 | 
			
		||||
	String_Stream: Stream.String_Input_Stream_Record (String'Unchecked_Access);
 | 
			
		||||
	--String_Stream: Stream.String_Input_Stream_Record := (Len => String'Length, Str => String, Pos => 0);
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	File_Name: aliased S.Object_String := "test.adb";
 | 
			
		||||
	--File_Stream: Stream.File_Stream_Record (File_Name'Unchecked_Access);
 | 
			
		||||
	--File_Stream: Stream.File_Stream_Record := (Name => File_Name'Unchecked_Access);
 | 
			
		||||
	File_Stream: Stream.File_Stream_Record;
 | 
			
		||||
 | 
			
		||||
	procedure Allocate_Stream (Interp: in out S.Interpreter_Record;
 | 
			
		||||
	                           Name:   access S.Object_String;
 | 
			
		||||
	                           Result: in out S.Stream_Pointer) is
 | 
			
		||||
		subtype FSR is Stream.File_Stream_Record;
 | 
			
		||||
		type FSP is access all FSR;
 | 
			
		||||
		package P is new H2.Pool (FSR, FSP);
 | 
			
		||||
 | 
			
		||||
		X: FSP;
 | 
			
		||||
		for X'Address use Result'Address;
 | 
			
		||||
		pragma Import (Ada, X);
 | 
			
		||||
	begin
 | 
			
		||||
		X := P.Allocate (S.Get_Storage_Pool(Interp));
 | 
			
		||||
		X.Name := Stream.Object_String_Pointer(Name);
 | 
			
		||||
	end Allocate_Stream;
 | 
			
		||||
 | 
			
		||||
	procedure Deallocate_Stream (Interp: in out S.Interpreter_Record;
 | 
			
		||||
	                             Source: in out S.Stream_Pointer) is
 | 
			
		||||
		subtype FSR is Stream.File_Stream_Record;
 | 
			
		||||
		type FSP is access all FSR;
 | 
			
		||||
		package P is new H2.Pool (FSR, FSP);
 | 
			
		||||
 | 
			
		||||
		X: FSP;
 | 
			
		||||
		for X'Address use Source'Address;
 | 
			
		||||
		pragma Import (Ada, X);
 | 
			
		||||
	begin
 | 
			
		||||
		P.Deallocate (X, S.Get_Storage_Pool(Interp));
 | 
			
		||||
	end Deallocate_Stream;
 | 
			
		||||
 | 
			
		||||
--   --procedure Dealloc_Stream is new Ada.Unchecked_Deallocation (Stream_Record'Class, Stream_Pointer);
 | 
			
		||||
--   --procedure Destroy_Stream (Stream: in out Stream_Pointer) renames Dealloc_Stream;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
begin
 | 
			
		||||
	Ada.Text_Io.Put_Line (S.Object_Word'Image(S.Object_Pointer_Bytes));
 | 
			
		||||
 | 
			
		||||
	S.Open (SI, 2_000_000, Pool'Unchecked_Access);
 | 
			
		||||
	--S.Open (SI, null);
 | 
			
		||||
 | 
			
		||||
File_Stream.Name := File_Name'Unchecked_Access;
 | 
			
		||||
S.Set_Input_Stream (SI, File_Stream); -- specify main input stream
 | 
			
		||||
--S.Set_Output_Stream (SI, Stream); -- specify main output stream.
 | 
			
		||||
S.Read (SI, I);
 | 
			
		||||
S.Make_Test_Object (SI, I);
 | 
			
		||||
 | 
			
		||||
	S.Evaluate (SI, I, O);
 | 
			
		||||
S.Print (SI, I);
 | 
			
		||||
Ada.Text_IO.Put_Line ("-------------------------------------------");
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
 | 
			
		||||
with "@abs_builddir@/../lib/libh2";
 | 
			
		||||
 | 
			
		||||
project H2_Scheme is
 | 
			
		||||
project Scheme is
 | 
			
		||||
 | 
			
		||||
	for Main use ("scheme");
 | 
			
		||||
 | 
			
		||||
@ -15,13 +15,15 @@ project H2_Scheme is
 | 
			
		||||
	for Source_Files use (
 | 
			
		||||
		"storage.ads",
 | 
			
		||||
		"storage.adb",
 | 
			
		||||
		"stream.ads",
 | 
			
		||||
		"stream.adb",
 | 
			
		||||
		"scheme.adb"
 | 
			
		||||
	);
 | 
			
		||||
	for Object_Dir use "@ADA_OBJDIR@";
 | 
			
		||||
 | 
			
		||||
	package Compiler is
 | 
			
		||||
		for Default_Switches ("Ada") use (
 | 
			
		||||
			"-gnata", "-gnato", "-gnatN",  "-gnatwl",
 | 
			
		||||
			"-gnata", "-gnato", "-gnatN",  "-gnatwl", "-gnat95"
 | 
			
		||||
			"-I@abs_srcdir@/../lib"
 | 
			
		||||
		);
 | 
			
		||||
	end Compiler;
 | 
			
		||||
@ -30,6 +32,6 @@ project H2_Scheme is
 | 
			
		||||
		for Executable ("scheme.adb") use "h2scm";
 | 
			
		||||
	end Builder;
 | 
			
		||||
 | 
			
		||||
end H2_Scheme;
 | 
			
		||||
end Scheme;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										87
									
								
								cmd/stream.adb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								cmd/stream.adb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,87 @@
 | 
			
		||||
 | 
			
		||||
package body Stream is
 | 
			
		||||
 | 
			
		||||
	------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
	procedure Open (Stream: in out String_Input_Stream_Record) is
 | 
			
		||||
	begin
 | 
			
		||||
Ada.Text_IO.Put_Line ("OPEN STRING STREAM");
 | 
			
		||||
		Stream.Pos := 0;
 | 
			
		||||
	end Open;
 | 
			
		||||
 | 
			
		||||
	procedure Close (Stream: in out String_Input_Stream_Record) is
 | 
			
		||||
	begin
 | 
			
		||||
Ada.Text_IO.Put_Line ("CLOSE STRING STREAM");
 | 
			
		||||
		Stream.Pos := Stream.Str'Last;
 | 
			
		||||
	end Close;
 | 
			
		||||
 | 
			
		||||
	procedure Read (Stream: in out String_Input_Stream_Record;
 | 
			
		||||
	                Data:   out    S.Object_String;
 | 
			
		||||
	                Last:   out    Standard.Natural) is
 | 
			
		||||
		Avail: Standard.Natural;
 | 
			
		||||
	begin
 | 
			
		||||
		Avail := Stream.Str'Last - Stream.Pos;
 | 
			
		||||
		if Avail <= 0 then
 | 
			
		||||
			-- EOF
 | 
			
		||||
			Last := Data'First - 1;
 | 
			
		||||
		else
 | 
			
		||||
			if Avail > Data'Length then
 | 
			
		||||
				Avail := Data'Length;
 | 
			
		||||
			end if;
 | 
			
		||||
 | 
			
		||||
			Data(Data'First .. Avail) := Stream.Str(Stream.Pos + 1..Stream.Pos + Avail);
 | 
			
		||||
			Stream.Pos := Stream.Pos + Avail;
 | 
			
		||||
			Last := Data'First + Avail - 1;
 | 
			
		||||
		end if;
 | 
			
		||||
	end Read;
 | 
			
		||||
 | 
			
		||||
	procedure Write (Stream: in out String_Input_Stream_Record;
 | 
			
		||||
	                 Data:   out    S.Object_String;
 | 
			
		||||
	                 Last:   out    Standard.Natural) is
 | 
			
		||||
	begin
 | 
			
		||||
		--raise S.Stream_Error;
 | 
			
		||||
		Last := Data'First - 1;
 | 
			
		||||
	end Write;
 | 
			
		||||
 | 
			
		||||
	------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
	procedure Open (Stream: in out File_Stream_Record) is
 | 
			
		||||
	begin
 | 
			
		||||
Ada.Text_IO.Put_Line ("OPEN File STREAM");
 | 
			
		||||
		Ada.Text_IO.Open (Stream.Handle, Ada.Text_IO.In_File, Stream.Name.all);
 | 
			
		||||
	end Open;
 | 
			
		||||
 | 
			
		||||
	procedure Close (Stream: in out File_Stream_Record) is
 | 
			
		||||
	begin
 | 
			
		||||
Ada.Text_IO.Put_Line ("CLOSE File STREAM");
 | 
			
		||||
		Ada.Text_IO.Close (Stream.Handle);
 | 
			
		||||
	end Close;
 | 
			
		||||
 | 
			
		||||
	procedure Read (Stream: in out File_Stream_Record;
 | 
			
		||||
	                Data:   out    S.Object_String;
 | 
			
		||||
	                Last:   out    Standard.Natural) is
 | 
			
		||||
	begin
 | 
			
		||||
		for I in Data'First .. Data'Last loop
 | 
			
		||||
			begin
 | 
			
		||||
				Ada.Text_IO.Get_Immediate (Stream.Handle, Data(I));
 | 
			
		||||
			exception
 | 
			
		||||
				when Ada.Text_IO.End_Error =>
 | 
			
		||||
					Last := I - 1;
 | 
			
		||||
					return;
 | 
			
		||||
				-- other exceptions must be just raised to indicate errors
 | 
			
		||||
			end;
 | 
			
		||||
		end loop;
 | 
			
		||||
		Last := Data'Last;
 | 
			
		||||
	end Read;
 | 
			
		||||
 | 
			
		||||
	procedure Write (Stream: in out File_Stream_Record;
 | 
			
		||||
	                 Data:   out    S.Object_String;
 | 
			
		||||
	                 Last:   out    Standard.Natural) is
 | 
			
		||||
	begin
 | 
			
		||||
		--raise S.Stream_Error;
 | 
			
		||||
		Last := Data'First - 1;
 | 
			
		||||
	end Write;
 | 
			
		||||
 | 
			
		||||
	------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
end Stream;
 | 
			
		||||
							
								
								
									
										48
									
								
								cmd/stream.ads
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								cmd/stream.ads
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,48 @@
 | 
			
		||||
with H2.Scheme;
 | 
			
		||||
with Ada.Text_IO;
 | 
			
		||||
 | 
			
		||||
package Stream is
 | 
			
		||||
 | 
			
		||||
	package S renames H2.Scheme;
 | 
			
		||||
 | 
			
		||||
	------------------------------------------------------------
 | 
			
		||||
	type Object_String_Pointer is access all S.Object_String;
 | 
			
		||||
	type String_Input_Stream_Record(Str: Object_String_Pointer) is new S.Stream_Record with record
 | 
			
		||||
		Pos: Standard.Natural := 0;	
 | 
			
		||||
	end record;
 | 
			
		||||
 | 
			
		||||
	--type String_Input_Stream_Record(Len: Standard.Natural) is new S.Stream_Record with record
 | 
			
		||||
	--	Pos: Standard.Natural := 0;	
 | 
			
		||||
	--	Str: S.Object_String (1 .. Len) := (others => ' ');
 | 
			
		||||
	--end record;
 | 
			
		||||
 | 
			
		||||
	procedure Open (Stream: in out String_Input_Stream_Record);
 | 
			
		||||
	procedure Close (Stream: in out String_Input_Stream_Record);
 | 
			
		||||
	procedure Read (Stream: in out String_Input_Stream_Record;
 | 
			
		||||
	                Data:   out    S.Object_String;
 | 
			
		||||
	                Last:   out    Standard.Natural);
 | 
			
		||||
	procedure Write (Stream: in out String_Input_Stream_Record;
 | 
			
		||||
	                 Data:   out    S.Object_String;
 | 
			
		||||
	                 Last:   out    Standard.Natural);
 | 
			
		||||
 | 
			
		||||
	------------------------------------------------------------
 | 
			
		||||
	--type File_Stream_Record(Name: Object_String_Pointer) is new S.Stream_Record with record
 | 
			
		||||
	--	Handle: Ada.Text_IO.File_Type;
 | 
			
		||||
	--end record;
 | 
			
		||||
 | 
			
		||||
	type File_Stream_Record is new S.Stream_Record with record
 | 
			
		||||
		Name:   Object_String_Pointer;
 | 
			
		||||
		Handle: Ada.Text_IO.File_Type;
 | 
			
		||||
	end record;
 | 
			
		||||
 | 
			
		||||
	procedure Open (Stream: in out File_Stream_Record);
 | 
			
		||||
	procedure Close (Stream: in out File_Stream_Record);
 | 
			
		||||
	procedure Read (Stream: in out File_Stream_Record;
 | 
			
		||||
	                Data:   out    S.Object_String;
 | 
			
		||||
	                Last:   out    Standard.Natural);
 | 
			
		||||
	procedure Write (Stream: in out File_Stream_Record;
 | 
			
		||||
	                 Data:   out    S.Object_String;
 | 
			
		||||
	                 Last:   out    Standard.Natural);
 | 
			
		||||
 | 
			
		||||
end Stream;
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user