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

+ 10 - 0
Programs/Dijkstra.Mod

@@ -0,0 +1,10 @@
+MODULE Dijkstra;
+IMPORT Out;
+VAR x, y: INTEGER;
+BEGIN
+  x := 50; y := 15;
+  WHILE x > y DO DEC(x, y)
+  ELSIF x < y DO DEC(y, x)
+  END;
+  Out.Int(x, 0); Out.Ln
+END Dijkstra.

+ 52 - 0
Programs/ShiftGCD.Mod

@@ -0,0 +1,52 @@
+MODULE ShiftGCD;
+IMPORT In, Out;
+CONST maxN = 100;
+VAR m: ARRAY maxN OF INTEGER;
+  N, K: INTEGER;
+  Z: INTEGER;
+
+PROCEDURE Show;
+VAR i: INTEGER;
+  s: ARRAY 10 OF CHAR;
+BEGIN
+  FOR i := 0 TO N - 1 DO Out.Int(m[i], 3) END; Out.Ln;
+  IF Z = 19 THEN Z := 0;
+    Out.String('Нажмите клавишу [Ввод] для продолжения. . . ');
+    In.Line(s)
+  ELSE INC(Z)
+  END
+END Show;
+
+PROCEDURE Shift;
+VAR i, i2, stop, tmp, count: INTEGER;
+BEGIN
+  Show;
+  i := 0; count := 0;
+  WHILE count # N DO
+    stop := i; tmp := m[i];   (*   0 -> 10 -> 5 -> 0 *)
+    i2 := (i + K) MOD N;
+    WHILE i2 # stop DO
+      m[i] := m[i2]; INC(count);
+      i := i2;
+      i2 := (i + K) MOD N
+    END;
+    m[i] := tmp; INC(count);
+    INC(i);
+    Show
+  END
+END Shift;
+
+PROCEDURE Do;
+VAR i: INTEGER;
+BEGIN
+  Out.String('Программа циклически сдвигает массив влево на K элементов.'); Out.Ln;
+  Out.String('Введите N - длину массива: '); In.Int(N);
+  Out.String('Введите K: '); In.Int(K);
+  FOR i := 0 TO N - 1 DO m[i] := i END;
+  Z := 0;
+  Shift
+END Do;
+
+BEGIN
+  Do
+END ShiftGCD.

+ 9 - 2
Programs/TestWriter.Mod

@@ -7,7 +7,14 @@ VAR
 BEGIN
   NEW(T); Texts.Open(T, 'MYTEXT.TXT');
   Texts.OpenWriter(W);
-  Texts.WriteString(W, 'HELLO'); Texts.WriteLn(W);
-  Texts.Append(T, W.buf);
+  Texts.WriteString(W, 'HELLO');
+  Texts.WriteLn(W);
+  Texts.WriteString(W, 'WORLD');
+  Texts.WriteInt(W, 1512, 6);
+  Texts.Write(W, '*');
+  Texts.WriteInt(W, -1512, 6);
+  Texts.Write(W, '*');
+  Texts.WriteLn(W);
+  Texts.Insert(T, 17, W.buf);
   Texts.Close(T)
 END TestWriter.

+ 16 - 9
src/Files.Mod

@@ -30,6 +30,8 @@ CONST
 TYPE
   SBYTE* = BYTE;
   BYTE* = UBYTE;
+  INT64 = LONGINT;
+  LONGINT = INTEGER; (* For larger version of Files, i.e. Files64 *)
 
   FileName = ARRAY 256 OF CHAR;
   File* = POINTER TO FileDesc;
@@ -288,7 +290,7 @@ BEGIN i := 0; ch := name[0];
 RETURN ch = PathDelimiter END HasDir;
 
 PROCEDURE CacheEntry(identity: Platform.FileIdentity): File;
-VAR f: File; i: INTEGER; error: Platform.ErrorCode;
+VAR f: File; i: INTEGER; error: Platform.ErrorCode; n: INT64;
 BEGIN f := files;
   WHILE f # NIL DO
     IF Platform.SameFile(identity, f.identity) THEN
@@ -298,7 +300,7 @@ BEGIN f := files;
           INC(i)
         END;
         f.swapper := -1; f.identity := identity;
-        error := Platform.FileSize(f.fd, f.len)
+        error := Platform.FileSize(f.fd, n); f.len := SHORT(n)
       END;
       RETURN f
     END;
@@ -316,6 +318,7 @@ VAR f: File;
   error: Platform.ErrorCode;
   identity: Platform.FileIdentity;
   q: ARRAY 4096 OF SHORTCHAR;
+  n: INT64;
 BEGIN
   IF name # '' THEN
     IF HasDir(name) THEN dir := ''; path := name$
@@ -342,7 +345,7 @@ BEGIN
           RETURN f
         ELSE NEW(f); Heap.RegisterFinalizer(f, Finalize);
           f.fd := fd; f.state := open; f.pos := 0; f.swapper := -1;
-          error := Platform.FileSize(fd, f.len);
+          error := Platform.FileSize(fd, n); f.len := SHORT(n);
           f.workName := name$; f.registerName := ''; f.tempFile := FALSE;
           f.identity := identity;
           f.next := files; files := f; INC(Heap.FileCount);
@@ -522,6 +525,10 @@ BEGIN
   r.res := 0
 END WriteBytes;
 
+PROCEDURE Truncate*(F: File; pos: INTEGER);
+BEGIN F.len := pos (*!FIXME*)
+END Truncate;
+
 PROCEDURE Delete*(IN name: ARRAY OF CHAR; VAR res: INTEGER);
 VAR pos: INTEGER;
   dir, path: ARRAY 2048 OF CHAR;
@@ -650,8 +657,8 @@ BEGIN ReadBytes(R, SYSTEM.THISARR(SYSTEM.ADR(b), 4), 4);
     ORD(b[3]) * 1000000H
 END ReadInt;
 
-PROCEDURE ReadLInt*(VAR R: Rider; VAR x: LONGINT);
-VAR b: ARRAY 8 OF SHORTCHAR; n: INTEGER; s: LONGINT;
+PROCEDURE ReadLInt*(VAR R: Rider; VAR x: INT64);
+VAR b: ARRAY 8 OF SHORTCHAR; n: INTEGER; s: INT64;
 BEGIN ReadBytes(R, SYSTEM.THISARR(SYSTEM.ADR(b), 8), 8);
   x := ORD(b[0]); s := 100H;
   FOR n := 1 TO 7 DO INC(x, ORD(b[n]) * s); s := s * 100H END
@@ -699,7 +706,7 @@ BEGIN i := 0; b := FALSE;
   UNTIL b
 END ReadLine;
 
-PROCEDURE ReadNum*(VAR R: Rider; VAR x: LONGINT);
+PROCEDURE ReadNum*(VAR R: Rider; VAR x: INTEGER);
 VAR n: INTEGER; b: BYTE;
 BEGIN n := 0; x := 0; Read(R, b);
   WHILE b >= 128 DO
@@ -737,8 +744,8 @@ BEGIN b[0] := SHORT(CHR(x)); b[1] := SHORT(CHR(x DIV 100H));
   WriteBytes(R, SYSTEM.THISARR(SYSTEM.ADR(b), 4), 4)
 END WriteInt;
 
-PROCEDURE WriteLInt*(VAR R: Rider; x: LONGINT);
-VAR b: ARRAY 8 OF SHORTCHAR; n: INTEGER; s: LONGINT;
+PROCEDURE WriteLInt*(VAR R: Rider; x: INT64);
+VAR b: ARRAY 8 OF SHORTCHAR; n: INTEGER; s: INT64;
 BEGIN b[0] := SHORT(CHR(x)); s := 100H;
   FOR n := 0 TO 7 DO b[n] := SHORT(CHR(x DIV s)); s := s*100H END;
   WriteBytes(R, SYSTEM.THISARR(SYSTEM.ADR(b), 8), 8)
@@ -776,7 +783,7 @@ BEGIN i := -1;
   REPEAT INC(i); WriteChar(R, s[i]) UNTIL (i = LEN(s)) OR (s[i] = 0X)
 END WriteString;
 
-PROCEDURE WriteNum*(VAR R: Rider; x: LONGINT);
+PROCEDURE WriteNum*(VAR R: Rider; x: INTEGER);
 BEGIN
   WHILE (x < - 64) OR (x > 63) DO
     Write(R, SYSTEM.VAL(BYTE, x MOD 128 + 128)); x := x DIV 128

+ 1 - 3
src/FreeOberon.Mod

@@ -823,9 +823,7 @@ BEGIN res := NIL; ok := TRUE;
         AddUniqueToList(list2, res);
         p := p.next
       END
-    ELSE
-      Strings.Copy(fname, errFname);
-      ;;;;;Out.String('Не могу разобраться с '); Out.String(modname); Out.Ln;;;;;
+    ELSE Strings.Copy(fname, errFname)
     END
   END;
   IF ok THEN

+ 30 - 26
src/Texts.Mod

@@ -9,11 +9,9 @@ CONST
   isWindows = Platform.Windows;
 
 TYPE
-  LONGINT* = SYSTEM.INT64;
-
   Text* = POINTER TO TextDesc;
   TextDesc* = RECORD
-    len*: LONGINT;
+    len*: INTEGER;
     f: Files.File;
     changed: BOOLEAN
   END;
@@ -30,13 +28,13 @@ TYPE
     i*: INTEGER;
     x*: REAL;
     (*y*: LONGREAL;*)
-    len*: LONGINT;
+    len*: INTEGER;
     s*: ARRAY 1900 OF CHAR
   END;
 
   Buffer* = POINTER TO BufDesc;
   BufDesc* = RECORD
-    len*: LONGINT;
+    len*: INTEGER;
     f: Files.File
   END;
 
@@ -48,14 +46,14 @@ TYPE
 PROCEDURE Open*(T: Text; fname: ARRAY OF CHAR);
 BEGIN T.f := Files.Old(fname);
   IF T.f = NIL THEN T.f := Files.New(fname) END;
-  T.len := Files.Length(T.f); T.changed := FALSE
+  T.len := SYSTEM.SHORT(Files.Length(T.f)); T.changed := FALSE
 END Open;
 
 PROCEDURE Close*(T: Text);
 BEGIN IF (T.f # NIL) & T.changed 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: INTEGER);
 BEGIN Files.Set(R.rider, T.f, pos); R.eot := FALSE
 END OpenReader;
 
@@ -72,7 +70,7 @@ BEGIN Files.ReadChar(S.rider, S.nextCh);
   IF ~S.rider.eof & (S.nextCh = 0AX) THEN INC(S.line) END
 END Next;
 
-PROCEDURE OpenScanner*(VAR S: Scanner; T: Text; pos: LONGINT);
+PROCEDURE OpenScanner*(VAR S: Scanner; T: Text; pos: INTEGER);
 BEGIN OpenReader(S, T, pos); S.line := 0; S.nextCh := ' '
 END OpenScanner;
 
@@ -136,7 +134,10 @@ BEGIN NEW(W.buf); OpenBuf(W.buf); Files.Set(W.rider, W.buf.f, 0)
 END OpenWriter;
 
 PROCEDURE Write*(VAR W: Writer; ch: CHAR);
-BEGIN Files.WriteChar(W.rider, ch); INC(W.buf.len)
+VAR t: INTEGER;
+BEGIN t := Files.Pos(W.rider);
+  Files.WriteChar(W.rider, ch);
+  INC(W.buf.len, Files.Pos(W.rider) - t)
 END Write;
 
 PROCEDURE WriteLn*(VAR W: Writer);
@@ -159,8 +160,8 @@ BEGIN IntToStr.Str(x, s);
   WriteString(W, s)
 END WriteInt;
 
-PROCEDURE WriteHex* (VAR W: Writer; x: LONGINT);
-VAR i: INTEGER; y: LONGINT;
+PROCEDURE WriteHex* (VAR W: Writer; x: INTEGER);
+VAR i: INTEGER; y: INTEGER;
   a: ARRAY 10 OF CHAR;
 BEGIN i := 0; Write(W, ' ');
   REPEAT y := x MOD 10H;
@@ -221,41 +222,44 @@ BEGIN
   END
 END WriteRealFix;
 
-PROCEDURE Save*(T: Text; beg, end: LONGINT; B: Buffer);
+PROCEDURE Save*(T: Text; beg, end: INTEGER; B: Buffer);
 VAR R, W: Files.Rider;
   ch: CHAR;
 BEGIN
   IF end > T.len THEN end := T.len END;
   Files.Set(R, T.f, beg); Files.Set(W, B.f, B.len);
-  DEC(end, beg);
-  WHILE end > 0 DO Files.ReadChar(R, ch); Files.WriteChar(W, ch) END;
-  INC(B.len, end - beg)
+  DEC(end, beg); INC(B.len, end);
+  WHILE end > 0 DO Files.ReadChar(R, ch); Files.WriteChar(W, ch); DEC(end) END
 END Save;
 
 PROCEDURE Copy*(SB, DB: Buffer);
 VAR R, W: Files.Rider;
   ch: CHAR;
-BEGIN Files.Set(R, SB.f, 0); Files.Set(W, DB.f, DB.len);
-  Files.ReadChar(R, ch);
-  WHILE ~R.eof DO Files.WriteChar(W, ch); Files.ReadChar(R, ch) END;
+  n: INTEGER;
+BEGIN Files.Set(R, SB.f, 0); Files.Set(W, DB.f, DB.len); n := SB.len;
+  WHILE n # 0 DO Files.ReadChar(R, ch); Files.WriteChar(W, ch); DEC(n) END;
   INC(DB.len, SB.len)
 END Copy;
 
-PROCEDURE Insert*(T: Text; pos: LONGINT; B: Buffer);
+PROCEDURE Insert*(T: Text; pos: INTEGER; B: Buffer);
 VAR R, W: Files.Rider;
   ch: CHAR;
-  n, q: LONGINT;
+  n, q: INTEGER;
+  P: Buffer;
 BEGIN n := T.len - pos;
   IF n > 0 THEN q := B.len - n;
     IF q > 0 THEN Files.Set(W, T.f, T.len);
-      WHILE q # 0 DO Files.WriteChar(W, ' '); DEC(q) END
-    END;
-    Files.Set(R, T.f, pos); Files.Set(W, T.f, pos + B.len);
-    WHILE n > 0 DO Files.ReadChar(R, ch); Files.WriteChar(W, ch) END
+      WHILE q # 0 DO Files.WriteChar(W, ' '); DEC(q) END;
+      Files.Set(R, T.f, pos);
+      WHILE n # 0 DO Files.ReadChar(R, ch); Files.WriteChar(W, ch); DEC(n) END
+    ELSE NEW(P); OpenBuf(P); Save(T, pos, pos + n, P);
+      Files.Set(R, P.f, 0); Files.Set(W, T.f, pos + B.len);
+      WHILE n # 0 DO Files.ReadChar(R, ch); Files.WriteChar(W, ch); DEC(n) END
+    END
   END;
   n := B.len; Files.Set(R, B.f, 0); Files.Set(W, T.f, pos);
-  WHILE n # 0 DO Files.ReadChar(R, ch); Files.WriteChar(W, ch) END;
-  INC(T.len, B.len); T.changed := TRUE
+  WHILE n # 0 DO Files.ReadChar(R, ch); Files.WriteChar(W, ch); DEC(n) END;
+  INC(T.len, B.len); T.changed := TRUE; B.len := 0
 END Insert;
 
 PROCEDURE Append*(T: Text; B: Buffer);

+ 1 - 1
src/edit.sh

@@ -1,2 +1,2 @@
 #!/bin/bash
-vim -p FreeOberon.Mod FoStrings.Mod ../Data/Texts/ru.dat Texts.Mod OV.Mod
+vim -p Files.Mod Texts.Mod FreeOberon.Mod FoStrings.Mod ../Data/Texts/ru.dat Texts.Mod OV.Mod