2
0
Arthur Yefimov 3 жил өмнө
parent
commit
a3e003b7a6

+ 4 - 4
.gitignore

@@ -8,12 +8,12 @@
 /src/*.c
 /src/*.sym
 /src/term/*.o
-/data/bin/libFreeOberon.a
-/data/bin/FreeOberon.a
+/Data/bin/libFreeOberon.a
+/Data/bin/FreeOberon.a
+!/Data/bin/mingw32/bin/*.dll
+!/Data/bin/mingw32/libexec/gcc/i686-w64-mingw32/6.2.0/*.dll
 .*.swp
 *.dll
-!/data/bin/mingw32/bin/*.dll
-!/data/bin/mingw32/libexec/gcc/i686-w64-mingw32/6.2.0/*.dll
 
 /src/GTest
 /src/TTest

BIN
Data/bin/libFreeOberon.a


+ 1 - 1
Programs/ATest.Mod

@@ -2,7 +2,7 @@ MODULE ATest;
 IMPORT In, Out;
 VAR i, j, n: INTEGER;
 BEGIN
-  Out.String('CCCP'); Out.Ln;
+  Out.String('П;') Out.Ln;
   In.Int(n);
   FOR i := 1 TO n DO
     FOR j := 1 TO 1 + i MOD 40 DO Out.Int(i, 5) END;

+ 21 - 20
src/FreeOberon.Mod

@@ -90,6 +90,9 @@ RETURN lines END CountLines;
 PROCEDURE ShowErrors(s: ARRAY OF CHAR);
 VAR lines, width, x0, x, y, i: INTEGER;
 BEGIN
+  ;;;;;;Out.String('ERRORS:'); Out.Ln;;;;;;
+  ;;;;;;Out.String(s); Out.Ln;;;;;;
+  ;;;;;;Out.String('END ERRORS.'); Out.Ln;;;;;;
 (*
   width := T.charsX - 2;
   lines := CountLines(s, width);
@@ -281,7 +284,7 @@ BEGIN
 END Backspace;
 
 PROCEDURE ParseErrors(VAR s: ARRAY OF CHAR; fname: ARRAY OF CHAR;
-    VAR line, col: INTEGER);
+    VAR line, col, error: INTEGER);
 VAR i, j, st, len, skip: INTEGER; found: BOOLEAN;
 BEGIN fname[0] := 0X; line := 1; col := 1;
   StringsFindNext(' translating ', s, 0, found, i);
@@ -300,7 +303,14 @@ BEGIN fname[0] := 0X; line := 1; col := 1;
       IF s[i] = ':' THEN INC(i) END;
       IF ('0' <= s[i]) & (s[i] <= '9') THEN
         ReadInt(s, i, col)
-      END
+      END;
+      WHILE (s[i] # 0X) & (s[i] # 'e') DO INC(i) END;
+      IF (s[i + 1] = 'r') & (s[i + 2] = 'r') & (s[i + 3] = ' ') THEN
+        INC(i, 4); ReadInt(s, i, error)
+      ELSE error := 0
+      END;
+      s := 'Пропущена точка с запятой';;;;;;;
+      ;;;;;Out.String('error = ');Out.Int(error, 0);Out.Ln;;;;;;
     END
   END
 END ParseErrors;
@@ -311,22 +321,13 @@ VAR len, i: INTEGER;
     s, sN: ARRAY 120 OF CHAR;
 
   PROCEDURE WriteProgBuf;
-  VAR ch: CHAR; i: INTEGER;
+  VAR ch: SHORTCHAR; i: INTEGER;
+    z: ARRAY 16300 OF CHAR;
   BEGIN
-    i := 0;
-    WHILE i < len DO
-      ch := progBuf[i];
-      IF ch = 0D0X THEN
-        INC(i); ch := progBuf[i];
-        IF ch = 081X THEN ch := CHR(240) (* Big Yo *)
-        ELSE ch := CHR(ORD(ch) - 16)
-        END
-      ELSIF ch = 0D1X THEN
-        INC(i); ch := CHR(ORD(progBuf[i]) + 96)
-      ELSIF ch >= 080X THEN ch := '?'
-      END;
-      Write(ch); INC(i)
-    END
+    IF len < LEN(progBuf) THEN ch := progBuf[len]; progBuf[len] := 0X END;
+    Utf8.Decode(progBuf, z);
+    i := 0; WHILE z[i] # 0X DO Write(z[i]); INC(i) END;
+    IF len < LEN(progBuf) THEN progBuf[len] := ch END
   END WriteProgBuf;
 
   PROCEDURE Read(tillEnd: BOOLEAN);
@@ -350,7 +351,7 @@ BEGIN
     IF Term.ProcessFinished(err) THEN
       Read(TRUE); (* Read everything until pipe is empty *)
       programFinished := TRUE;
-      IF tempWindowed THEN (*T.SwitchToFullscreen !FIXME *) END;
+      IF tempWindowed THEN T.SwitchToFS END;
       IF err = 0 THEN
         WriteString(' Press any key to return to IDE')
       ELSE s := ' Runtime error '; Int.Append(err, s);
@@ -491,7 +492,7 @@ CONST bufLen = 20480;
 VAR buf: ARRAY bufLen OF SHORTCHAR;
   e: Editor.Editor;
   p: StrList;
-  len, err, line, col: INTEGER;
+  len, err, line, col, error: INTEGER;
   command: ARRAY 32 OF CHAR;
   q: ARRAY 1024 OF SHORTCHAR;
   z: ARRAY 1024 OF CHAR;
@@ -548,7 +549,7 @@ BEGIN
       ELSE buf[len] := 0X
       END;
       Utf8.Decode(buf, z);
-      ParseErrors(z, fname, line, col);
+      ParseErrors(z, fname, line, col, error);
       FocusOrOpenFile(fname);
       e := app.windows(Editor.Editor);
       e.text.MoveToLineCol(line, col, e.h - 2);

+ 1 - 1
src/Utf8.Mod

@@ -55,7 +55,7 @@ VAR n: INTEGER;
 BEGIN EncodeEx(in, -1, out, n)
 END Encode;
 
-PROCEDURE DecodeChar*(IN s: ARRAY OF CHAR): CHAR;
+PROCEDURE DecodeChar*(IN s: ARRAY OF (*!FIXME SHORT?*)CHAR): CHAR;
 VAR i, x, c: INTEGER;
 BEGIN c := ORD(s[0]);
   IF c > 80H THEN x := ORD(s[1]) MOD 64; (* Not 1 byte *)