2
0
Arthur Yefimov 3 жил өмнө
parent
commit
92caf6f369
1 өөрчлөгдсөн 26 нэмэгдсэн , 16 устгасан
  1. 26 16
      src/In.Mod

+ 26 - 16
src/In.Mod

@@ -1,5 +1,9 @@
 MODULE In;
 MODULE In;
 
 
+(*!FIXME From the Oakwood guidlines:
+  An unsuccessful input operation sets Done to FALSE;
+  it remains FALSE until the next call to Open. *)
+
 IMPORT Platform, SYSTEM, Strings, Out, Utf8;
 IMPORT Platform, SYSTEM, Strings, Out, Utf8;
 
 
 CONST
 CONST
@@ -43,6 +47,10 @@ BEGIN
   RETURN x
   RETURN x
 END GetByte;
 END GetByte;
 
 
+PROCEDURE Byte*(VAR x: UBYTE);
+BEGIN x := SYSTEM.VAL(UBYTE, SHORT(SHORT(GetByte())))
+END Byte;
+
 PROCEDURE ReadChar;
 PROCEDURE ReadChar;
 VAR x, y: INTEGER;
 VAR x, y: INTEGER;
 BEGIN
 BEGIN
@@ -75,17 +83,19 @@ END StartAndSkip;
 
 
 PROCEDURE Char*(VAR ch: CHAR);
 PROCEDURE Char*(VAR ch: CHAR);
 BEGIN StartRead;
 BEGIN StartRead;
-  IF readstate = ready THEN Done := TRUE; ch := nextch;
+  IF readstate = ready THEN ch := nextch;
+    ;;;;;;;;;Out.String('readstate was ready. ch = '); Out.Int(ORD(ch), 0); Out.Ln;
     IF ch = 0AX THEN readstate := pending ELSE ReadChar END
     IF ch = 0AX THEN readstate := pending ELSE ReadChar END
   ELSE Done := FALSE; ch := 0X
   ELSE Done := FALSE; ch := 0X
+    ;;;;;;;;;Out.String('readstate was not ready. ch = '); Out.Int(ORD(ch), 0); Out.Ln;
   END
   END
 END Char;
 END Char;
 
 
 PROCEDURE HugeInt*(VAR h: HUGEINT);
 PROCEDURE HugeInt*(VAR h: HUGEINT);
-VAR neg, hex, endofnum: BOOLEAN;
+VAR ok, neg, hex, endofnum: BOOLEAN;
   decacc, hexacc, digit: HUGEINT;
   decacc, hexacc, digit: HUGEINT;
 BEGIN StartAndSkip;
 BEGIN StartAndSkip;
-  Done := FALSE;
+  ok := FALSE;
   IF readstate = ready THEN
   IF readstate = ready THEN
     neg := nextch = '-'; IF neg THEN ReadChar END;
     neg := nextch = '-'; IF neg THEN ReadChar END;
     hex := FALSE;
     hex := FALSE;
@@ -101,7 +111,7 @@ BEGIN StartAndSkip;
         digit := ORD(nextch) MOD 16 + 9; hex := TRUE
         digit := ORD(nextch) MOD 16 + 9; hex := TRUE
       END;
       END;
       IF digit >= 0 THEN
       IF digit >= 0 THEN
-        Done := TRUE;
+        ok := TRUE;
         decacc := decacc * 10 + digit;
         decacc := decacc * 10 + digit;
         hexacc := hexacc * 16 + digit;
         hexacc := hexacc * 16 + digit;
         ReadChar
         ReadChar
@@ -111,12 +121,13 @@ BEGIN StartAndSkip;
         endofnum := TRUE
         endofnum := TRUE
       END
       END
     END;
     END;
-    IF Done THEN
+    IF ok THEN
       IF hex THEN h := hexacc ELSE h := decacc END;
       IF hex THEN h := hexacc ELSE h := decacc END;
       IF neg THEN h := -h END
       IF neg THEN h := -h END
     ELSE h := 0
     ELSE h := 0
     END
     END
-  END
+  END;
+  IF ~ok THEN Done := FALSE END
 END HugeInt;
 END HugeInt;
 
 
 PROCEDURE Int16*(VAR i: SHORTINT);
 PROCEDURE Int16*(VAR i: SHORTINT);
@@ -136,7 +147,8 @@ END Int;
 
 
 PROCEDURE Line*(VAR line: ARRAY OF CHAR);
 PROCEDURE Line*(VAR line: ARRAY OF CHAR);
 VAR i: INTEGER;
 VAR i: INTEGER;
-BEGIN StartRead; i := 0; Done := readstate = ready;
+BEGIN StartRead; i := 0;
+  IF readstate # ready THEN Done := FALSE END;
   WHILE (readstate = ready) & (nextch # 0DX) & (nextch # 0AX) &
   WHILE (readstate = ready) & (nextch # 0DX) & (nextch # 0AX) &
         (i < LEN(line) - 1) DO
         (i < LEN(line) - 1) DO
     line[i] := nextch; INC(i); ReadChar
     line[i] := nextch; INC(i); ReadChar
@@ -156,9 +168,9 @@ BEGIN StartAndSkip; i := 0;
       s[i] := nextch; ReadChar; INC(i)
       s[i] := nextch; ReadChar; INC(i)
     END
     END
   END;
   END;
-  Done := (readstate = ready) & (i < LEN(s) - 1) & (nextch = '"');
-  IF Done THEN ReadChar; s[i] := 0X
-  ELSE s[0] := 0X
+  IF (readstate = ready) & (i < LEN(s) - 1) & (nextch = '"') THEN
+    ReadChar; s[i] := 0X
+  ELSE s[0] := 0X; Done := FALSE
   END
   END
 END String;
 END String;
 
 
@@ -168,18 +180,16 @@ END Name;
 
 
 PROCEDURE Real*(VAR x: REAL);
 PROCEDURE Real*(VAR x: REAL);
 VAR s: ARRAY 16 OF CHAR;
 VAR s: ARRAY 16 OF CHAR;
-BEGIN
-  StartAndSkip;
-  Line(s);
+BEGIN StartAndSkip; Line(s);
   Strings.StrToReal(s, x)
   Strings.StrToReal(s, x)
+  (*!FIXME Set Done*)
 END Real;
 END Real;
 
 
 PROCEDURE LongReal*(VAR y: LONGREAL);
 PROCEDURE LongReal*(VAR y: LONGREAL);
 VAR s: ARRAY 16 OF CHAR;
 VAR s: ARRAY 16 OF CHAR;
-BEGIN
-  StartAndSkip;
-  Line(s);
+BEGIN StartAndSkip; Line(s);
   Strings.StrToLongReal(s, y)
   Strings.StrToLongReal(s, y)
+  (*!FIXME Set Done*)
 END LongReal;
 END LongReal;
 
 
 BEGIN
 BEGIN