Pārlūkot izejas kodu

Made argument stream reader positionable (required, for example, for the compiler)

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6934 8c9fc860-2736-0410-a75d-ab315db34111
felixf 8 gadi atpakaļ
vecāks
revīzija
537293c8d9
1 mainītis faili ar 35 papildinājumiem un 31 dzēšanām
  1. 35 31
      source/Unix.StdIO.Mod

+ 35 - 31
source/Unix.StdIO.Mod

@@ -6,36 +6,41 @@ IMPORT S := SYSTEM, Modules, Commands, Streams, Unix;
 
 CONST 
 	AddrSize = SIZEOF( ADDRESS );
+TYPE
+	String=POINTER TO ARRAY OF CHAR;
 VAR 
 	env-: Commands.Context;
-	argc-: LONGINT;
-	
-	
-	argv: ADDRESS;
-	iarg: LONGINT;
-	addr: ADDRESS; 
-	ch: CHAR;
-	
 
-PROCEDURE ReceiveArg( VAR data: ARRAY OF CHAR;  ofs, size, min: LONGINT;  VAR len, res: LONGINT );
+PROCEDURE Args(): String;
+VAR size, pos: SIZE; i,j: LONGINT; str: String;
+	argc: LONGINT;
+	argv {UNTRACED}: POINTER {UNSAFE} TO ARRAY OF POINTER {UNSAFE} TO ARRAY OF CHAR;
 BEGIN
-	len := 0;
-	REPEAT
-		IF ch = 0X THEN
-			IF iarg >= argc THEN  
-				IF len >= min THEN  res := Streams.Ok  ELSE  res := Streams.EOF  END;
-				RETURN
-			END;
-			S.GET( argv + iarg*AddrSize, addr );
-			INC( iarg );
+	argc := Unix.argc;
+	argv := Unix.argv;
+	pos := 0;
+	FOR i := 0 TO argc-1 DO
+		j := 0; 
+		WHILE argv[i,j] # 0X DO
+			INC(pos); INC(j);
 		END;
-		REPEAT
-			S.GET( addr, ch );  data[ofs] := ch;  INC( addr );  INC( ofs );  INC( len );  DEC( size )
-		UNTIL (ch = 0X) OR (size <= 0);
-		IF ch = 0X THEN  data[ofs-1] := ' '  END
-	UNTIL (size <= 0) OR (ofs >= LEN(data));
-	res := Streams.Ok
-END ReceiveArg;
+		INC(pos);
+	END;
+	size := pos + 1;
+	NEW(str, size);
+	pos := 0;
+	FOR i := 0 TO argc-1 DO
+		j := 0; 
+		WHILE argv[i,j] # 0X DO
+			str[pos] := argv[i,j];
+			INC(pos); INC(j);
+		END;
+		str[pos] := " ";
+		INC(pos);
+	END;
+	str[pos] := 0X;
+	RETURN str;
+END Args;
 
 PROCEDURE ReceiveStdin( VAR data: ARRAY OF CHAR;  ofs, size, min: LONGINT;  VAR len, res: LONGINT );
 VAR ures: LONGINT;
@@ -69,19 +74,18 @@ END Cleanup;
 
 PROCEDURE Setup;
 VAR
-	arg: Streams.Reader;
+	arg: Streams.StringReader;
 	stdin: Streams.Reader;
 	stdout: Streams.Writer;
-	errout: Streams.Writer
+	errout: Streams.Writer;
+	str: String;
 BEGIN
-	NEW( arg, ReceiveArg, 512 );
+	str := Args();
+	NEW( arg, LEN(str) ); arg.Set(str^);
 	NEW( stdin, ReceiveStdin, 1024 );
 	NEW( stdout, SendStdout, 1024 );
 	NEW( errout, SendErrout, 512 );
 	NEW( env, stdin, arg, stdout, errout, NIL );
-	argc := Unix.argc;
-	argv := Unix.argv;
-	iarg := 0; ch := 0X;
 	Modules.InstallTermHandler( Cleanup )
 END Setup