Ver Fonte

Autodoc: Fix error checking

Arthur Yefimov há 2 anos atrás
pai
commit
c7ed989127
3 ficheiros alterados com 55 adições e 32 exclusões
  1. 13 12
      src/Autodoc/Autodoc.Mod
  2. 40 16
      src/Autodoc/AutodocParser.Mod
  3. 2 4
      src/Strings.Mod

+ 13 - 12
src/Autodoc/Autodoc.Mod

@@ -29,11 +29,11 @@ BEGIN
   IF OpenFile(in, r) THEN
     P.SetFname(in);
     module := P.ParseModule(r, err);
-    IF indexTitle[0] = 0X THEN Strings.Copy(module.name, indexTitle) END;
-    IF indexComment[0] = 0X THEN
-      Strings.Copy(module.comment, indexComment)
-    END;
     IF module # NIL THEN
+      IF indexTitle[0] = 0X THEN Strings.Copy(module.name, indexTitle) END;
+      IF indexComment[0] = 0X THEN
+        Strings.Copy(module.comment, indexComment)
+      END;
       IF H.Save(module, out) THEN
         Out.String('## Created "'); Out.String(out);
         Out.String('".'); Out.Ln
@@ -196,24 +196,25 @@ BEGIN
 RETURN ok END CreateIndex;
 
 PROCEDURE Do;
-VAR i, len: INTEGER;
+VAR i, count, len: INTEGER;
   out, s: ARRAY 256 OF CHAR;
   fnames: ARRAY 64, 256 OF CHAR;
   fnameCount: INTEGER;
   createIndex: BOOLEAN;
 BEGIN
-  IF Args.Count = 0 THEN
+  count := Args.Count();
+  IF count = 0 THEN
     Usage
   ELSE
     out[0] := 0X; i := 1; fnameCount := 0;
     indexTitle[0] := 0X; indexComment[0] := 0X;
     H.ClearLinkMods; createIndex := TRUE;
-    WHILE i <= Args.Count DO
+    WHILE i <= count DO
       Args.Get(i, s);
       IF s = '-o' THEN (* Output file or dir *)
-        IF i < Args.Count THEN INC(i); Args.Get(i, out) END
+        IF i < count THEN INC(i); Args.Get(i, out) END
       ELSIF s = '-L' THEN (* Link directory *)
-        IF i < Args.Count THEN INC(i); Args.Get(i, s); ParseLinkDir(s) END
+        IF i < count THEN INC(i); Args.Get(i, s); ParseLinkDir(s) END
       ELSIF s = '-a' THEN (* All *)
         P.SetExportedOnly(FALSE)
       ELSIF s = '-k' THEN (* Keep module aliases *)
@@ -225,11 +226,11 @@ BEGIN
       ELSIF (s = '--no-index') OR (s = '-n') THEN
         createIndex := FALSE
       ELSIF (s = '--title') OR (s = '-t') THEN
-        IF i < Args.Count THEN INC(i); Args.Get(i, indexTitle); END
+        IF i < count THEN INC(i); Args.Get(i, indexTitle); END
       ELSIF s = '--pal' THEN
-        IF i < Args.Count THEN INC(i); Args.Get(i, s); H.SetPalette(s) END
+        IF i < count THEN INC(i); Args.Get(i, s); H.SetPalette(s) END
       ELSIF s = '--lang' THEN (* Output language *)
-        IF i < Args.Count THEN INC(i); Args.Get(i, s); H.SetLang(s) END
+        IF i < count THEN INC(i); Args.Get(i, s); H.SetLang(s) END
       ELSE (* One of the Oberon module file names *)
         IF fnameCount < LEN(fnames) THEN
           Strings.Copy(s, fnames[fnameCount]); INC(fnameCount);

+ 40 - 16
src/Autodoc/AutodocParser.Mod

@@ -413,31 +413,55 @@ RETURN x END ToHex;
 (** Reads a decimal or hexadecimal number (or a hexadecimal char literal),
     puts it in id, len, ival, sym. *)
 PROCEDURE ReadNumber;
-VAR hex, isChar: BOOLEAN;
+VAR hex, allDec, isChar: BOOLEAN;
   i: INTEGER;
 BEGIN
-  len := 0;
+  len := 0; allDec := TRUE;
   REPEAT
+    IF ~IsDec(c) THEN allDec := FALSE END;
     IF len < LEN(id) - 1 THEN id[len] := c; INC(len) END;
     Read
   UNTIL ~IsHex(c);
-  id[len] := 0X;
-
-  isChar := c = 'X';
-  IF (c = 'H') OR (c = 'X') THEN hex := TRUE; Read ELSE hex := FALSE END;
 
-  ival := 0; i := 0;
-  IF hex THEN
-    WHILE id[i] # 0X DO ival := ival * 16 + FromHex(id[i]); INC(i) END;
-    IF isChar THEN sym := char ELSE sym := int END
-  ELSE
-    WHILE id[i] # 0X DO
-      IF IsDec(id[i]) THEN ival := ival * 10 + ORD(id[i]) - ORD('0')
-      ELSE Mark('Not a hexadecimal number')
+  IF c = '.' THEN (* Real number *)
+    IF len < LEN(id) - 1 THEN id[len] := '.'; INC(len) END;
+    Read;
+    WHILE IsDec(c) DO
+      IF len < LEN(id) - 1 THEN id[len] := c; INC(len) END;
+      Read
+    END;
+    IF (c = 'E') OR (c = 'e') OR (c = 'D') OR (c = 'd') THEN
+      IF len < LEN(id) - 1 THEN id[len] := c; INC(len) END;
+      Read;
+      IF (c = '+') OR (c = '-') THEN
+        IF len < LEN(id) - 1 THEN id[len] := c; INC(len) END;
+        Read
       END;
-      INC(i)
+      WHILE IsDec(c) DO
+        IF len < LEN(id) - 1 THEN id[len] := c; INC(len) END;
+        Read
+      END
     END;
-    sym := int
+    id[len] := 0X;
+    sym := real
+  ELSE (* Integer *)
+    id[len] := 0X;
+    isChar := c = 'X';
+    IF (c = 'H') OR (c = 'X') THEN hex := TRUE; Read ELSE hex := FALSE END;
+
+    ival := 0; i := 0;
+    IF hex THEN
+      WHILE id[i] # 0X DO ival := ival * 16 + FromHex(id[i]); INC(i) END;
+      IF isChar THEN sym := char ELSE sym := int END
+    ELSE
+      WHILE id[i] # 0X DO
+        IF IsDec(id[i]) THEN ival := ival * 10 + ORD(id[i]) - ORD('0')
+        ELSE Mark('Not a hexadecimal number')
+        END;
+        INC(i)
+      END;
+      sym := int
+    END
   END
 END ReadNumber;
 

+ 2 - 4
src/Strings.Mod

@@ -3,7 +3,7 @@ MODULE Strings;
     constants and character arrays, both of which contain the character
     0X as a terminator).
      All positions in strings start at 0. *)
-IMPORT Reals, SYSTEM;
+IMPORT Reals, SYSTEM, Out;
 
 TYPE
   REAL = SYSTEM.REAL32;
@@ -108,9 +108,7 @@ END Extract;
 PROCEDURE Copy*(IN src: ARRAY OF CHAR; VAR dst: ARRAY OF CHAR);
 VAR i, len: INTEGER;
 BEGIN
-  IF LEN(src) < LEN(dst) THEN len := LEN(src) - 1
-  ELSE len := LEN(dst) - 1
-  END;
+  IF LEN(src) < LEN(dst) THEN len := LEN(src) - 1 ELSE len := LEN(dst) - 1 END;
   i := 0;
   WHILE (i # len) & (src[i] # 0X) DO dst[i] := src[i]; INC(i) END;
   dst[i] := 0X