Procházet zdrojové kódy

Module Reals, In.Int and In.Real now can read in sequential manner

Arthur Yefimov před 3 roky
rodič
revize
31078fa93f
4 změnil soubory, kde provedl 119 přidání a 88 odebrání
  1. 22 9
      src/In.Mod
  2. 86 0
      src/Reals.Mod
  3. 0 71
      src/Strings.Mod
  4. 11 8
      src/make.sh

+ 22 - 9
src/In.Mod

@@ -4,7 +4,7 @@ MODULE In;
   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, Reals, Out, Utf8;
 
 CONST
   pending = 0; (* readstate when at start of input or end of line. Implies nextch undefined. *)
@@ -40,7 +40,6 @@ VAR error: Platform.ErrorCode; x, n: INTEGER;
   m: ARRAY 1 OF SBYTE;
 BEGIN
   error := Platform.ReadBuf(Platform.StdIn, m, n); x := m[0] MOD 256;
-  Out.String('READ ');Out.Int(x, 0);Out.Ln;
   IF (error = 0) & (n = 1) THEN readstate := ready
   ELSE readstate := eof; x := 0
   END;
@@ -84,10 +83,8 @@ END StartAndSkip;
 PROCEDURE Char*(VAR ch: CHAR);
 BEGIN StartRead;
   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
   ELSE Done := FALSE; ch := 0X
-    ;;;;;;;;;Out.String('readstate was not ready. ch = '); Out.Int(ORD(ch), 0); Out.Ln;
   END
 END Char;
 
@@ -127,6 +124,8 @@ BEGIN StartAndSkip;
     ELSE h := 0
     END
   END;
+  WHILE (readstate = ready) & (nextch <= ' ') & (nextch # 0AX) DO ReadChar END;
+  IF (readstate = ready) & (nextch = 0AX) THEN readstate := pending END;
   IF ~ok THEN Done := FALSE END
 END HugeInt;
 
@@ -158,6 +157,20 @@ BEGIN StartRead; i := 0;
   IF (readstate = ready) & (nextch = 0AX) THEN readstate := pending END
 END Line;
 
+(** Skip whitespaces, read characters until a whitespace, skip whitespaces
+    until a new line character. *)
+PROCEDURE Word*(VAR s: ARRAY OF CHAR);
+VAR i: INTEGER;
+BEGIN StartRead; i := 0;
+  IF readstate # ready THEN Done := FALSE END;
+  WHILE (readstate = ready) & (nextch > ' ') & (i < LEN(s) - 1) DO
+    s[i] := nextch; INC(i); ReadChar
+  END;
+  s[i] := 0X;
+  WHILE (readstate = ready) & (nextch <= ' ') & (nextch # 0AX) DO ReadChar END;
+  IF (readstate = ready) & (nextch = 0AX) THEN readstate := pending END
+END Word;
+
 PROCEDURE String*(VAR s: ARRAY OF CHAR);
 VAR i: INTEGER;
 BEGIN StartAndSkip; i := 0;
@@ -189,15 +202,15 @@ END Name;
 
 PROCEDURE Real*(VAR x: SHORTREAL);
 VAR s: ARRAY 16 OF CHAR;
-BEGIN StartAndSkip; Line(s);
-  Strings.StrToReal(s, x)
+BEGIN StartAndSkip; Word(s);
+  x := Reals.Val(s)
   (*!FIXME Set Done*)
 END Real;
 
-PROCEDURE LongReal*(VAR y: REAL);
+PROCEDURE LongReal*(VAR x: REAL);
 VAR s: ARRAY 16 OF CHAR;
-BEGIN StartAndSkip; Line(s);
-  Strings.StrToLongReal(s, y)
+BEGIN StartAndSkip; Word(s);
+  x := Reals.LongVal(s)
   (*!FIXME Set Done*)
 END LongReal;
 

+ 86 - 0
src/Reals.Mod

@@ -0,0 +1,86 @@
+MODULE Reals;
+
+VAR Done-: BOOLEAN;
+
+PROCEDURE Ten(e: INTEGER): SHORTREAL;
+VAR r, power: REAL;
+BEGIN r := 1.0; power := 10.0;
+  WHILE e > 0 DO
+    IF ODD(e) THEN r := r * power END;
+    power := power * power; e := e DIV 2
+  END ;
+RETURN SHORT(r) END Ten;
+
+PROCEDURE Val*(IN s: ARRAY OF CHAR): SHORTREAL;
+VAR p, e: SHORTINT; y, g: SHORTREAL; neg, negE: BOOLEAN;
+BEGIN
+  p := 0;
+  WHILE (s[p] = ' ') OR (s[p] = '0') DO INC(p) END;
+  IF s[p] = '-' THEN neg := TRUE; INC(p) ELSE neg := FALSE END;
+  WHILE (s[p] = ' ') OR (s[p] = '0') DO INC(p) END;
+  
+  y := 0;
+  WHILE ('0' <= s[p]) & (s[p] <= '9') DO
+    y := y * 10 + (ORD(s[p]) - 30H);
+    INC(p)
+  END;
+  IF s[p] = '.' THEN
+    INC(p); g := 1; 
+    WHILE ('0' <= s[p]) & (s[p] <= '9') DO
+      g := g / 10; y := y + g * (ORD(s[p]) - 30H);
+      INC(p)
+    END
+  END;
+  IF (s[p] = 'D') OR (s[p] = 'E') THEN
+    INC(p); e := 0;
+    IF s[p] = '-' THEN negE := TRUE; INC(p) ELSE negE := FALSE END;
+    WHILE (s[p] = '0') DO INC(p) END;
+    WHILE ('0' <= s[p]) & (s[p] <= '9') DO
+      e := SHORT(e * 10 + (ORD(s[p]) - 30H));
+      INC(p)
+    END;
+    IF negE THEN y := y / Ten(e)
+    ELSE y := y * Ten(e)
+    END
+  END;
+  IF neg THEN y := -y END;
+  Done := TRUE ; (*!FIXME*)
+RETURN y END Val;
+
+PROCEDURE LongVal*(IN s: ARRAY OF CHAR): REAL;
+VAR p, e: INTEGER; y, g: REAL; neg, negE: BOOLEAN;
+BEGIN
+  p := 0;
+  WHILE (s[p] = ' ') OR (s[p] = '0') DO INC(p) END;
+  IF s[p] = '-' THEN neg := TRUE; INC(p) ELSE neg := FALSE END;
+  WHILE (s[p] = ' ') OR (s[p] = '0') DO INC(p) END;
+  y := 0;
+  WHILE ('0' <= s[p]) & (s[p] <= '9') DO
+    y := y * 10 + (ORD(s[p]) - 30H);
+    INC(p)
+  END;
+  IF s[p] = '.' THEN
+    INC(p); g := 1; 
+    WHILE ('0' <= s[p]) & (s[p] <= '9') DO
+      g := g / 10; y := y + g * (ORD(s[p]) - 30H);
+      INC(p)
+    END
+  END;
+  IF (s[p] = 'D') OR (s[p] = 'E') THEN
+    INC(p); e := 0;
+    IF s[p] = '-' THEN negE := TRUE; INC(p) ELSE negE := FALSE END;
+    WHILE (s[p] = '0') DO INC(p) END;
+    WHILE ('0' <= s[p]) & (s[p] <= '9') DO
+      e := e * 10 + ORD(s[p]) - 30H;
+      INC(p)
+    END;
+    IF negE THEN y := y / Ten(e)
+    ELSE y := y * Ten(e)
+    END
+  END;
+  IF neg THEN y := -y END;
+  Done := TRUE ; (*!FIXME*)
+RETURN y END LongVal;
+
+BEGIN Done := TRUE
+END Reals.

+ 0 - 71
src/Strings.Mod

@@ -154,75 +154,4 @@ BEGIN
   RETURN M(string, pattern, Length(string) - 1, Length(pattern) - 1)
 END Match;
 
-PROCEDURE StrToReal*(IN s: ARRAY OF CHAR; VAR r: REAL);
-VAR p, e: SHORTINT; y, g: REAL; neg, negE: BOOLEAN;
-BEGIN
-  p := 0;
-  WHILE (s[p] = ' ') OR (s[p] = '0') DO INC(p) END;
-  IF s[p] = '-' THEN neg := TRUE; INC(p) ELSE neg := FALSE END;
-  WHILE (s[p] = ' ') OR (s[p] = '0') DO INC(p) END;
-  
-  y := 0;
-  WHILE ('0' <= s[p]) & (s[p] <= '9') DO
-    y := y * 10 + (ORD(s[p]) - 30H);
-    INC(p)
-  END;
-  IF s[p] = '.' THEN
-    INC(p); g := 1; 
-    WHILE ('0' <= s[p]) & (s[p] <= '9') DO
-      g := g / 10; y := y + g * (ORD(s[p]) - 30H);
-      INC(p)
-    END
-  END;
-  IF (s[p] = 'D') OR (s[p] = 'E') THEN
-    INC(p); e := 0;
-    IF s[p] = '-' THEN negE := TRUE; INC(p) ELSE negE := FALSE END;
-    WHILE (s[p] = '0') DO INC(p) END;
-    WHILE ('0' <= s[p]) & (s[p] <= '9') DO
-      e := SHORT(e * 10 + (ORD(s[p]) - 30H));
-      INC(p)
-    END;
-    IF negE THEN y := y / Reals.Ten(e)
-    ELSE y := y * Reals.Ten(e)
-    END
-  END;
-  IF neg THEN y := -y END;
-  r := y
-END StrToReal;
-
-PROCEDURE StrToLongReal*(IN s: ARRAY OF CHAR; VAR r: LONGREAL);
-VAR p, e: INTEGER; y, g: LONGREAL; neg, negE: BOOLEAN;
-BEGIN
-  p := 0;
-  WHILE (s[p] = ' ') OR (s[p] = '0') DO INC(p) END;
-  IF s[p] = '-' THEN neg := TRUE; INC(p) ELSE neg := FALSE END;
-  WHILE (s[p] = ' ') OR (s[p] = '0') DO INC(p) END;
-  y := 0;
-  WHILE ('0' <= s[p]) & (s[p] <= '9') DO
-    y := y * 10 + (ORD(s[p]) - 30H);
-    INC(p)
-  END;
-  IF s[p] = '.' THEN
-    INC(p); g := 1; 
-    WHILE ('0' <= s[p]) & (s[p] <= '9') DO
-      g := g / 10; y := y + g * (ORD(s[p]) - 30H);
-      INC(p)
-    END
-  END;
-  IF (s[p] = 'D') OR (s[p] = 'E') THEN
-    INC(p); e := 0;
-    IF s[p] = '-' THEN negE := TRUE; INC(p) ELSE negE := FALSE END;
-    WHILE (s[p] = '0') DO INC(p) END;
-    WHILE ('0' <= s[p]) & (s[p] <= '9') DO
-      e := e * 10 + ORD(s[p]) - 30H;
-      INC(p)
-    END;
-    IF negE THEN y := y / LONG(Reals.Ten(SHORT(e)))
-    ELSE y := y * LONG(Reals.Ten(SHORT(e)))
-    END
-  END;
-  IF neg THEN y := -y END;
-  r := y
-END StrToLongReal;
-
 END Strings.

+ 11 - 8
src/make.sh

@@ -16,14 +16,16 @@ $OFR -C Config_linux.Mod
 
 $OFR -C Utf8.Mod
 
-$OFR -C In.Mod
-
-$OFR -C Out.Mod
-
 $OFR -C Strings.Mod
 
+$OFR -C Reals.Mod
+
 $OFR -C Int.Mod
 
+$OFR -C In.Mod
+
+$OFR -C Out.Mod
+
 $OFR -C Files.Mod
 
 $OFR -7w StrList.Mod
@@ -49,21 +51,22 @@ $OFR -C -m FreeOberon.Mod
 
 
 $CCFULL -c Utf8.c
-$CCFULL -c In.c
-$CCFULL -c Out.c
 $CCFULL -c Strings.c
+$CCFULL -c Reals.c
 $CCFULL -c Int.c
+$CCFULL -c In.c
+$CCFULL -c Out.c
 $CCFULL -c Files.c
 $CCFULL -c StrList.c
 $CCFULL -c Dir.c
 $CCFULL -c SDL2.c
 $CCFULL -c Graph.c
 $AR -crs ../data/bin/libFreeOberon.a \
-  Utf8.o In.o Out.o Strings.o Int.o Files.o \
+  Utf8.o Strings.o Reals.o Int.o In.o Out.o Files.o \
   StrList.o Dir.o SDL2.o Graph.o
 
 $CCFULL Config.c term/term_linux.c \
-  Utf8.o In.o Out.o Strings.o Int.o Files.o \
+  Utf8.o Strings.o Reals.o Int.o In.o Out.o Files.o \
   StrList.o Dir.o SDL2.o Graph.o \
   Term.c Terminal.c OV.c EditorText.c Editor.c \
   $PROG.c -o ../$PROG \