2
0
Эх сурвалжийг харах

Fix Texts.Open for new files

Arthur Yefimov 3 жил өмнө
parent
commit
4c0a2cbb5f

+ 3 - 2
Data/Texts/en.dat

@@ -188,8 +188,9 @@
 244 "cyclic type definition not allowed"
 265 "unsupported string operation"
 401 "file contains wrong module name"
-421 "linking failed"
-422 "compilation failed"
+421 "compilation failed"
+422 "linking failed"
+423 "execution failed"
 
 menuFile "&File"
 menuNew "&New"

+ 3 - 2
Data/Texts/ru.dat

@@ -188,8 +188,9 @@
 244 "циклическое определение типа не допускается"
 265 "строковая операция не поддерживается"
 401 "файл содержит неверное имя модуля"
-421 "компоновка не удалась"
-422 "компиляция не удалась"
+421 "не удалось скомпилировать программу"
+422 "не удалось скомпоновать программу"
+423 "не удалось запустить программу"
 
 menuFile "&Файл"
 menuNew "&Новый"

+ 1 - 1
Data/bin/link_console.bat

@@ -28,7 +28,7 @@ GOTO START
 REM END Put all ARGS.
 ECHO ON
 
-@%CC% -g3 -O0 -fno-exceptions ^
+@%CC% -O0 -fno-exceptions ^
   -I %FOBDIR%\src ^
   -I %OFRDIR%\Mod\Lib ^
   -I %OFRTAR%\Lib\Obj ^

+ 1 - 1
Data/bin/link_graph.bat

@@ -26,7 +26,7 @@ GOTO START
 REM END Put all ARGS.
 ECHO ON
 
-%CC% -g3 -O0 -fno-exceptions ^
+%CC% -O0 -fno-exceptions ^
   -I %CURDIR%..\..\src ^
   -I %OFRDIR%\..\..\Mod\Lib ^
   -I %OFRDIR%\Lib\Obj ^

+ 1 - 1
Programs/ATest.Mod

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

+ 22 - 0
Programs/ReadText.Mod

@@ -0,0 +1,22 @@
+MODULE ReadText;
+IMPORT Tx := Texts, Out;
+VAR T: Tx.Text; S: Tx.Scanner;
+  n: INTEGER;
+BEGIN
+  NEW(T); Tx.Open(T, 'TEXT.DAT');
+  IF T.len >= 0 THEN
+    Tx.OpenScanner(S, T, 0);
+    Tx.Scan(S);
+    Out.Int(S.class, 5); Out.String('   ---> ');
+    Out.String(S.s); Out.Ln;
+    Tx.Scan(S);
+    Out.Int(S.class, 5); Out.String('   ---> ');
+    n := S.i; Out.Int(S.i, 0); Out.Ln;
+    Tx.Scan(S); INC(n, S.i);
+    Out.Int(S.class, 5); Out.String('   ---> ');
+    Out.Int(S.i, 0); Out.Ln; Out.Int(n, 20); Out.Ln;
+
+    Tx.Open(T, 'OUT.DAT'); Tx.Close(T)
+  ELSE Out.String('Файл не найден.'); Out.Ln
+  END
+END ReadText.

+ 1 - 1
src/Editor.Mod

@@ -363,7 +363,7 @@ PROCEDURE GetCharClass(ch: CHAR): INTEGER;
 VAR class: INTEGER;
 BEGIN
   CASE ch OF
-    'a'..'z', 'A'..'Z': class := charAlpha
+    'a'..'z', 'A'..'Z', '_': class := charAlpha
   | '0'..'9': class := charDigit
   | '-', '+': class := charMinusPlus
   | '"', "'": class := charQuote

+ 16 - 35
src/FreeOberon.Mod

@@ -93,14 +93,9 @@ BEGIN
   END ;
 RETURN lines END CountLines;
 
-PROCEDURE ShowErrors(s: ARRAY OF CHAR);
-VAR lines, width, x0, x, y, i: INTEGER;
-  e: Editor.Editor;
-BEGIN
-  (*;;;;;;Out.String('ERROR STRING: ['); Out.String(s); Out.String('] END.'); Out.Ln;;;;;;*)
-  e := app.windows(Editor.Editor);
-  Editor.SetMsg(e, s)
-END ShowErrors;
+PROCEDURE ShowError(s: ARRAY OF CHAR);
+BEGIN Editor.SetMsg(app.windows(Editor.Editor), s)
+END ShowError;
 
 (* !TODO move out, rewrite *)
 PROCEDURE StringsFindNext*(what, where: ARRAY OF CHAR;
@@ -489,7 +484,6 @@ BEGIN
   ELSIF graph THEN command := 'link_graph'
   ELSE command := 'link_console'
   END;
-      ;;;;;;;;Out.String('--- RUN --- ');Out.String(command);;;;Out.Ln;;;;
   IF Config.isWindows THEN
     IF Term.SearchPath('cmd.exe', q) # 0 THEN
       Utf8.Decode(q, cmd);
@@ -521,7 +515,6 @@ BEGIN
       p := p.next
     END
   END;
-  (*Out.String('Running:'); Out.Ln; Out.String(cmd); Out.Ln;*)
   Utf8.Encode(cmd, q);
   success := (Term.RunProcess(q, buf, bufLen, len, err) # 0) &
              (err = 0);
@@ -534,7 +527,6 @@ BEGIN
       END;
       Utf8.Decode(buf, z);
       ParseErrors(z, fname, line, col, error);
-      (*;;;;;;;;Out.String('Место ошибки: '); Out.Int(line, 0);Out.Char(':');Out.Int(col, 0);Out.Ln;;;;;;;*)
       FocusOrOpenFile(fname);
       e := app.windows(Editor.Editor);
       IF (col = 1) & (line # 1) THEN
@@ -542,12 +534,11 @@ BEGIN
       ELSE e.text.MoveToLineCol(line, col, e.h - 2)
       END;
       Editor.PrintText(app.windows(Editor.Editor))
-    ELSIF link THEN FoStrings.GetErrorStr(421, z)
-    ELSE FoStrings.GetErrorStr(422, z)
+    ELSIF link THEN FoStrings.GetErrorStr(422, z)
+    ELSE FoStrings.GetErrorStr(421, z)
     END;
-    IF z[0] = 0X THEN ShowErrors(s) ELSE ShowErrors(z) END
+    IF z[0] = 0X THEN ShowError(s) ELSE ShowError(z) END
   END ;
-      ;;;;;;;;Out.String('--- END --- ');Out.String(command);;;;Out.Ln;;;;
 RETURN success END RunCommand;
 
 PROCEDURE Compile(IN fname, mod: ARRAY OF CHAR; main: BOOLEAN): BOOLEAN;
@@ -613,27 +604,17 @@ BEGIN exename[0] := 0X;
 RETURN ok END CompileAll;
 
 PROCEDURE RunProgram(IN prg: ARRAY OF CHAR);
-VAR dir: ARRAY 256 OF CHAR;
+VAR dir, err: ARRAY 256 OF CHAR;
   s, d: ARRAY 2048 OF SHORTCHAR;
   i: INTEGER;
   tW, tH: INTEGER;
-BEGIN dir := prg$;
-  curX := 0; curY := 0; curFg := 7; curBg := 0;
+BEGIN dir := prg$; curX := 0; curY := 0; curFg := 7; curBg := 0;
   T.SetCursor(0, 0); T.Size(tW, tH);
   i := 0; WHILE dir[i] # 0X DO INC(i) END;
-  WHILE (i # -1) & (dir[i] # '/') & (dir[i] # '\') DO DEC(i) END; INC(i);
-  dir[i] := 0X;
-  Utf8.Encode(prg, s);
-  Utf8.Encode(dir, d);
-  ;;;;;;;;;;Out.String('STARTING EXECUTION');Out.Ln;;;;;;;;;
-  IF Term.StartProcessIn(s, d) THEN
-    ;;;;;;;;;;Out.String('EXECUTION SUCCESSFUL');Out.Ln;;;;;;;;;
-    programFinished := FALSE;
-    RunTerminal
-  ELSE
-    ;;;;;;;;;;Out.String('EXECUTION FAILED');Out.Ln;;;;;;;;;
-    (*T.Print(0, tH - 1, -1, ' Program execution failed ', 15, 4);
-    T.Flush; T.Pause !FIXME*)
+  WHILE (i # -1) & (dir[i] # '/') & (dir[i] # '\') DO DEC(i) END;
+  INC(i); dir[i] := 0X; Utf8.Encode(prg, s); Utf8.Encode(dir, d);
+  IF Term.StartProcessIn(s, d) THEN programFinished := FALSE; RunTerminal
+  ELSE FoStrings.GetErrorStr(423, err); ShowError(err)
   END
 END RunProgram;
 
@@ -724,17 +705,17 @@ BEGIN
       ELSE s[i] := ch; INC(i)
       END
     END;
-    IF ('A' <= CAP(ch)) & (CAP(ch) <= 'Z') THEN
+    IF ('A' <= CAP(ch)) & (CAP(ch) <= 'Z') OR (ch = '_') THEN
       WHILE ~R.eof &
             (('A' <= CAP(ch)) & (CAP(ch) <= 'Z') OR
-             ('0' <= ch) & (ch <= '9')) DO
+             ('0' <= ch) & (ch <= '9') OR (ch = '_')) DO
         IF i < LEN(s) - 1 THEN s[i] := ch; INC(i) END;
         ReadCh(R, ch, line, col)
       END
     ELSE
       WHILE ~R.eof & (ch > ' ') &
             ~(('A' <= CAP(ch)) & (CAP(ch) <= 'Z') OR
-              ('0' <= ch) & (ch <= '9')) DO
+              ('0' <= ch) & (ch <= '9') OR (ch = '_')) DO
         IF i < LEN(s) - 1 THEN s[i] := ch; INC(i) END;
         ReadCh(R, ch, line, col)
       END
@@ -876,7 +857,7 @@ BEGIN w := c.app.windows;
         e := app.windows(Editor.Editor);
         e.text.MoveToLineCol(errLine, errCol, e.h - 2);
         FoStrings.MakeErrorStr(401(*file contains wrong module name*), s);
-        ShowErrors(s)
+        ShowError(s)
       END
     END
   END

+ 6 - 4
src/Texts.Mod

@@ -33,12 +33,14 @@ TYPE
 
 PROCEDURE Open*(T: Text; fname: ARRAY OF CHAR);
 BEGIN T.F := Files.Old(fname);
-  IF T.F # NIL THEN
-    T.len := Files.Length(T.F)
-  ELSE T.len := 0
-  END
+  IF T.F = NIL THEN T.F := Files.New(fname) END;
+  T.len := Files.Length(T.F)
 END Open;
 
+PROCEDURE Close*(T: Text);
+BEGIN IF T.F # NIL THEN Files.Register(T.F) END
+END Close;
+
 PROCEDURE OpenReader*(VAR R: Reader; T: Text; pos: LONGINT);
 BEGIN Files.Set(R.rider, T.F, pos); R.eot := FALSE
 END OpenReader;

+ 1 - 0
src/make.bat

@@ -105,6 +105,7 @@ windres resources.rc resources.o
   -I..\Data\bin\mingw32\include ^
   -Wl,-e_WinMain@16 ^
   -nostartfiles %OFRDIR%\..\..\Mod\Lib\crt1.c
+REM  -Wl,-subsystem,windows
 
 @GOTO QUIT
 :ERR