Jelajahi Sumber

Int.Val rewritten, Int.Str fixed, --size argument added

Patrik 3 tahun lalu
induk
melakukan
cf89f6bfc7
3 mengubah file dengan 49 tambahan dan 71 penghapusan
  1. 21 33
      src/FreeOberon.Mod
  2. 24 36
      src/Int.Mod
  3. 4 2
      src/Terminal.Mod

+ 21 - 33
src/FreeOberon.Mod

@@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License
 along with Free Oberon.  If not, see <http://www.gnu.org/licenses/>.
 *)
 IMPORT G := Graph, T := Terminal, Files, Args,
-       OV, Editor, Term, Config, Strings, Out;
+       OV, Editor, Term, Config, Strings, Int, Out;
 CONST
   version* = '1.0.4';
 
@@ -66,30 +66,8 @@ VAR
   needWindowed: BOOLEAN;
   sysModules: StrList;
   workDir: ARRAY 256 OF CHAR; (* Directory of main file of compiled program *)
-
   app: OV.App;
 
-PROCEDURE IntToStr*(n: INTEGER; VAR s: ARRAY OF CHAR); (* !TODO move out *)
-(* LEN(s) > 1 *)
-VAR i, j: INTEGER; tmp: CHAR; neg: BOOLEAN;
-BEGIN
-  IF n = 0 THEN
-    s[0] := '0'; i := 1
-  ELSE i := 0; neg := n < 0;
-    IF neg THEN n := -n END;
-    WHILE (n > 0) & (i < LEN(s) - 1) DO
-      s[i] := CHR(ORD('0') + n MOD 10);
-      n := n DIV 10; INC(i)
-    END;
-    IF neg & (i < LEN(s) - 1) THEN s[i] := '-'; INC(i) END
-  END;
-  s[i] := 0X; j := 0; DEC(i);
-  WHILE j < i DO
-    tmp := s[j]; s[j] := s[i]; s[i] := tmp;
-    INC(j); DEC(i)
-  END
-END IntToStr;
-
 PROCEDURE CountLines(s: ARRAY OF CHAR; width: INTEGER): INTEGER;
 VAR i, x, lines: INTEGER;
 BEGIN
@@ -315,9 +293,7 @@ BEGIN
       IF tempWindowed THEN G.SwitchToFullscreen END;
       IF err = 0 THEN
         T.WriteString(' Press any key to return to IDE')
-      ELSE
-        s := ' Runtime error ';
-        IntToStr(err, sN); Strings.Append(sN, s);
+      ELSE s := ' Runtime error '; Int.Append(err, s);
         T.WriteString(s)
       END
     ELSE
@@ -509,14 +485,12 @@ BEGIN
   success := (Term.RunProcess(cmd, buf, bufLen, len, err) # 0) &
              (err = 0);
   IF ~success THEN
-    s := ' Command returned ';
-    IntToStr(err, sN); Strings.Append(sN, s);
+    s := ' Command returned '; Int.Append(err, s);
     Strings.Append(' exit status ', s);
     IF (len > 0) & (len < bufLen) THEN
       IF buf[len - 1] = 0AX THEN buf[len - 1] := 0X
       ELSE buf[len] := 0X
       END;
-
       ParseErrors(buf, fname, line, col);
       FocusOrOpenFile(fname);
       e := app.windows(Editor.Editor);
@@ -1058,14 +1032,26 @@ BEGIN
   END
 END ParseFileNameArg;
 
-PROCEDURE ParseArgs(VAR fs, sw: BOOLEAN; VAR fnames: Fnames);
+PROCEDURE ParseSize(IN s: ARRAY OF CHAR; VAR w, h: INTEGER);
+VAR i: INTEGER;
+  x: ARRAY 30 OF CHAR;
+BEGIN i := 0; w := 0; h := 0;
+  WHILE (s[i] # 0X) & (s[i] # 'x') DO INC(i) END;
+  Strings.Extract(s, 0, i, x); w := Int.Val(x);
+  Strings.Extract(s, i + 1, 30, x); h := Int.Val(x)
+END ParseSize;
+
+PROCEDURE ParseArgs(VAR fs, sw: BOOLEAN; VAR w, h: INTEGER;
+    VAR fnames: Fnames);
 VAR i, nofnames: INTEGER;
   s: ARRAY 256 OF CHAR;
-BEGIN fs := TRUE; sw := FALSE; i := 1; nofnames := 0;
+BEGIN fs := TRUE; sw := FALSE; i := 1; nofnames := 0; w := -1; h := -1;
   WHILE i # Args.argc DO
     Args.Get(i, s);
     IF s = '--window' THEN fs := FALSE
     ELSIF s = '--software' THEN sw := TRUE
+    ELSIF s = '--size' THEN
+      IF i + 1 # Args.argc THEN INC(i); Args.Get(i, s); ParseSize(s, w, h) END
     ELSIF nofnames < LEN(fnames) THEN
       ParseFileNameArg(s);
       fnames[nofnames] := s$;
@@ -1079,11 +1065,13 @@ END ParseArgs;
 
 PROCEDURE Init(): BOOLEAN;
 VAR success, fs, sw: BOOLEAN;
+  w, h: INTEGER;
   fnames: Fnames;
 BEGIN
   success := FALSE;
-  ParseArgs(fs, sw, fnames);
-  IF T.Init(fs, sw) THEN
+  ParseArgs(fs, sw, w, h, fnames);
+  ;Out.String('SIZE '); Out.Int(w, 0); Out.Int(h, 5); Out.Ln;
+  IF T.Init(fs, sw, w, h) THEN
     InitIDE;
     needWindowed := TRUE;
     ResetSysModules;

+ 24 - 36
src/Int.Mod

@@ -6,49 +6,37 @@ TYPE CHAR = SHORTCHAR;
 PROCEDURE Str*(n: INTEGER; VAR s: ARRAY OF CHAR);
 VAR i, j: INTEGER; tmp: CHAR; neg: BOOLEAN;
 BEGIN
-  IF n = 0 THEN
-    s[0] := '0'; i := 1
-  ELSE i := 0; neg := n < 0; 
-    IF neg THEN n := -n END;
-    WHILE (n > 0) & (i < LEN(s) - 1) DO
+  IF n = 0 THEN s := '0'
+  ELSIF n = MIN(LONGINT) THEN s := '-2147483648'
+  ELSE i := 0;
+    IF n < 0 THEN neg := TRUE; n := -n ELSE neg := FALSE END;
+    WHILE (n # 0) & (i # LEN(s) - 1) DO
       s[i] := CHR(ORD('0') + n MOD 10);
       n := n DIV 10; INC(i)
     END;
-    IF neg & (i < LEN(s) - 1) THEN s[i] := '-'; INC(i) END
-  END;
-  s[i] := 0X; j := 0; DEC(i);
-  WHILE j < i DO
-    tmp := s[j]; s[j] := s[i]; s[i] := tmp;
-    INC(j); DEC(i)
+    IF neg & (i # LEN(s) - 1) THEN s[i] := '-'; INC(i) END;
+    s[i] := 0X; j := 0; DEC(i);
+    WHILE j < i DO
+      tmp := s[j]; s[j] := s[i]; s[i] := tmp;
+      INC(j); DEC(i)
+    END
   END
 END Str;
 
-PROCEDURE Val*(int: LONGINT; VAR str: ARRAY OF CHAR);
-CONST maxLength = 11;
-VAR
-  b: ARRAY maxLength + 1 OF CHAR;
-  s, e: INTEGER;
-  h: CHAR;
-BEGIN
-  IF int = MIN(LONGINT) THEN b := '-2147483648'; e := 11
-  ELSE
-    IF int < 0 THEN b[0] := '-'; int := -int; s := 1 ELSE s := 0 END;
-    e := s; (* 's' holds starting position of string *)
-    REPEAT
-      b[e] := CHR(int MOD 10 + ORD('0'));
-      int := int DIV 10;
-      INC(e)
-    UNTIL int = 0;
-    b[e] := 0X;
-
-    DEC(e);
-    WHILE s < e DO
-      h := str[s]; str[s] := str[e]; str[e] := h;
-      INC(s); DEC(e)
-    END
+PROCEDURE Val*(IN s: ARRAY OF CHAR): INTEGER;
+VAR i, n: INTEGER;
+  c: CHAR;
+  neg: BOOLEAN;
+BEGIN n := 0; c := s[0];
+  IF c = '-' THEN neg := TRUE; i := 1; c := s[1]
+  ELSE neg := FALSE
+  END;
+  WHILE ('0' <= c) & (c <= '9') DO
+    n := n * 10 + ORD(c) - ORD('0');
+    INC(i); c := s[i]
   END;
-  str := b$
-END Val;
+  IF neg THEN n := -n END ;
+RETURN n END Val;
 
 PROCEDURE Append*(n: INTEGER; VAR s: ARRAY OF CHAR);
 VAR sn: ARRAY 30 OF CHAR;

+ 4 - 2
src/Terminal.Mod

@@ -317,14 +317,16 @@ PROCEDURE LoadMedia(): BOOLEAN;
 BEGIN font := G.LoadFont('data/images/font.bmp', charW, charH) ;
 RETURN font # NIL END LoadMedia;
 
-PROCEDURE Init*(fullscreen, software: BOOLEAN): BOOLEAN;
+PROCEDURE Init*(fullscreen, software: BOOLEAN; w, h: INTEGER): BOOLEAN;
 VAR success: BOOLEAN; options: SET;
 BEGIN
   success := FALSE; isFullscreen := fullscreen;
   options := {G.buffered, G.initMouse, G.spread};
   IF fullscreen THEN INCL(options, G.fullscreen) END;
   IF software THEN INCL(options, G.software) END;
-  G.Settings(768, 432, options);
+  IF w < 0 THEN w := 96 ELSIF (w # 0) & (w < 10) THEN w := 10 END;
+  IF h < 0 THEN h := 27 ELSIF (h # 0) & (h < 10) THEN h := 10 END;
+  G.Settings(w * 8, h * 16, options);
   G.SetSizeStep(charW, charH);
   screen := G.Init();
   IF screen # NIL THEN