瀏覽代碼

Fix Texts.Open for new files

Arthur Yefimov 3 年之前
父節點
當前提交
4c0a2cbb5f
共有 10 個文件被更改,包括 55 次插入47 次删除
  1. 3 2
      Data/Texts/en.dat
  2. 3 2
      Data/Texts/ru.dat
  3. 1 1
      Data/bin/link_console.bat
  4. 1 1
      Data/bin/link_graph.bat
  5. 1 1
      Programs/ATest.Mod
  6. 22 0
      Programs/ReadText.Mod
  7. 1 1
      src/Editor.Mod
  8. 16 35
      src/FreeOberon.Mod
  9. 6 4
      src/Texts.Mod
  10. 1 0
      src/make.bat

+ 3 - 2
Data/Texts/en.dat

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

+ 3 - 2
Data/Texts/ru.dat

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

+ 1 - 1
Data/bin/link_console.bat

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

+ 1 - 1
Data/bin/link_graph.bat

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

+ 1 - 1
Programs/ATest.Mod

@@ -3,7 +3,7 @@ IMPORT In, Out;
 VAR i, j, n: INTEGER;
 VAR i, j, n: INTEGER;
 BEGIN
 BEGIN
   Out.String('Пр.;'); Out.Ln;
   Out.String('Пр.;'); Out.Ln;
-  In.Int(n);
+  In.Int(n); n := 4;
   FOR i := 1 TO n DO
   FOR i := 1 TO n DO
     FOR j := 1 TO 1 + i MOD 40 DO Out.Int(i, 5) END;
     FOR j := 1 TO 1 + i MOD 40 DO Out.Int(i, 5) END;
     Out.Ln
     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;
 VAR class: INTEGER;
 BEGIN
 BEGIN
   CASE ch OF
   CASE ch OF
-    'a'..'z', 'A'..'Z': class := charAlpha
+    'a'..'z', 'A'..'Z', '_': class := charAlpha
   | '0'..'9': class := charDigit
   | '0'..'9': class := charDigit
   | '-', '+': class := charMinusPlus
   | '-', '+': class := charMinusPlus
   | '"', "'": class := charQuote
   | '"', "'": class := charQuote

+ 16 - 35
src/FreeOberon.Mod

@@ -93,14 +93,9 @@ BEGIN
   END ;
   END ;
 RETURN lines END CountLines;
 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 *)
 (* !TODO move out, rewrite *)
 PROCEDURE StringsFindNext*(what, where: ARRAY OF CHAR;
 PROCEDURE StringsFindNext*(what, where: ARRAY OF CHAR;
@@ -489,7 +484,6 @@ BEGIN
   ELSIF graph THEN command := 'link_graph'
   ELSIF graph THEN command := 'link_graph'
   ELSE command := 'link_console'
   ELSE command := 'link_console'
   END;
   END;
-      ;;;;;;;;Out.String('--- RUN --- ');Out.String(command);;;;Out.Ln;;;;
   IF Config.isWindows THEN
   IF Config.isWindows THEN
     IF Term.SearchPath('cmd.exe', q) # 0 THEN
     IF Term.SearchPath('cmd.exe', q) # 0 THEN
       Utf8.Decode(q, cmd);
       Utf8.Decode(q, cmd);
@@ -521,7 +515,6 @@ BEGIN
       p := p.next
       p := p.next
     END
     END
   END;
   END;
-  (*Out.String('Running:'); Out.Ln; Out.String(cmd); Out.Ln;*)
   Utf8.Encode(cmd, q);
   Utf8.Encode(cmd, q);
   success := (Term.RunProcess(q, buf, bufLen, len, err) # 0) &
   success := (Term.RunProcess(q, buf, bufLen, len, err) # 0) &
              (err = 0);
              (err = 0);
@@ -534,7 +527,6 @@ BEGIN
       END;
       END;
       Utf8.Decode(buf, z);
       Utf8.Decode(buf, z);
       ParseErrors(z, fname, line, col, error);
       ParseErrors(z, fname, line, col, error);
-      (*;;;;;;;;Out.String('Место ошибки: '); Out.Int(line, 0);Out.Char(':');Out.Int(col, 0);Out.Ln;;;;;;;*)
       FocusOrOpenFile(fname);
       FocusOrOpenFile(fname);
       e := app.windows(Editor.Editor);
       e := app.windows(Editor.Editor);
       IF (col = 1) & (line # 1) THEN
       IF (col = 1) & (line # 1) THEN
@@ -542,12 +534,11 @@ BEGIN
       ELSE e.text.MoveToLineCol(line, col, e.h - 2)
       ELSE e.text.MoveToLineCol(line, col, e.h - 2)
       END;
       END;
       Editor.PrintText(app.windows(Editor.Editor))
       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;
     END;
-    IF z[0] = 0X THEN ShowErrors(s) ELSE ShowErrors(z) END
+    IF z[0] = 0X THEN ShowError(s) ELSE ShowError(z) END
   END ;
   END ;
-      ;;;;;;;;Out.String('--- END --- ');Out.String(command);;;;Out.Ln;;;;
 RETURN success END RunCommand;
 RETURN success END RunCommand;
 
 
 PROCEDURE Compile(IN fname, mod: ARRAY OF CHAR; main: BOOLEAN): BOOLEAN;
 PROCEDURE Compile(IN fname, mod: ARRAY OF CHAR; main: BOOLEAN): BOOLEAN;
@@ -613,27 +604,17 @@ BEGIN exename[0] := 0X;
 RETURN ok END CompileAll;
 RETURN ok END CompileAll;
 
 
 PROCEDURE RunProgram(IN prg: ARRAY OF CHAR);
 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;
   s, d: ARRAY 2048 OF SHORTCHAR;
   i: INTEGER;
   i: INTEGER;
   tW, tH: 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);
   T.SetCursor(0, 0); T.Size(tW, tH);
   i := 0; WHILE dir[i] # 0X DO INC(i) END;
   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
 END RunProgram;
 END RunProgram;
 
 
@@ -724,17 +705,17 @@ BEGIN
       ELSE s[i] := ch; INC(i)
       ELSE s[i] := ch; INC(i)
       END
       END
     END;
     END;
-    IF ('A' <= CAP(ch)) & (CAP(ch) <= 'Z') THEN
+    IF ('A' <= CAP(ch)) & (CAP(ch) <= 'Z') OR (ch = '_') THEN
       WHILE ~R.eof &
       WHILE ~R.eof &
             (('A' <= CAP(ch)) & (CAP(ch) <= 'Z') OR
             (('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;
         IF i < LEN(s) - 1 THEN s[i] := ch; INC(i) END;
         ReadCh(R, ch, line, col)
         ReadCh(R, ch, line, col)
       END
       END
     ELSE
     ELSE
       WHILE ~R.eof & (ch > ' ') &
       WHILE ~R.eof & (ch > ' ') &
             ~(('A' <= CAP(ch)) & (CAP(ch) <= 'Z') OR
             ~(('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;
         IF i < LEN(s) - 1 THEN s[i] := ch; INC(i) END;
         ReadCh(R, ch, line, col)
         ReadCh(R, ch, line, col)
       END
       END
@@ -876,7 +857,7 @@ BEGIN w := c.app.windows;
         e := app.windows(Editor.Editor);
         e := app.windows(Editor.Editor);
         e.text.MoveToLineCol(errLine, errCol, e.h - 2);
         e.text.MoveToLineCol(errLine, errCol, e.h - 2);
         FoStrings.MakeErrorStr(401(*file contains wrong module name*), s);
         FoStrings.MakeErrorStr(401(*file contains wrong module name*), s);
-        ShowErrors(s)
+        ShowError(s)
       END
       END
     END
     END
   END
   END

+ 6 - 4
src/Texts.Mod

@@ -33,12 +33,14 @@ TYPE
 
 
 PROCEDURE Open*(T: Text; fname: ARRAY OF CHAR);
 PROCEDURE Open*(T: Text; fname: ARRAY OF CHAR);
 BEGIN T.F := Files.Old(fname);
 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;
 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);
 PROCEDURE OpenReader*(VAR R: Reader; T: Text; pos: LONGINT);
 BEGIN Files.Set(R.rider, T.F, pos); R.eot := FALSE
 BEGIN Files.Set(R.rider, T.F, pos); R.eot := FALSE
 END OpenReader;
 END OpenReader;

+ 1 - 0
src/make.bat

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