|
@@ -0,0 +1,137 @@
|
|
|
|
|
+Listing:
|
|
|
|
|
+
|
|
|
|
|
+ 1 IMPLEMENTATION MODULE FileIO;
|
|
|
|
|
+ 2 (* Self-hosted file I/O: SysShim only. *)
|
|
|
|
|
+ 3
|
|
|
|
|
+ 4 IMPORT SysShim;
|
|
|
|
|
+ 5
|
|
|
|
|
+ 6 VAR
|
|
|
|
|
+ 7 argIdx: CARDINAL;
|
|
|
|
|
+ 8
|
|
|
|
|
+ 9 PROCEDURE NextParameter (VAR s: ARRAY OF CHAR);
|
|
|
|
|
+ 10 BEGIN
|
|
|
|
|
+ 11 IF SysShim.arg(argIdx, s, LEN(s)) THEN
|
|
|
|
|
+ 12 INC(argIdx)
|
|
|
|
|
+ 13 ELSE
|
|
|
|
|
+ 14 s[0] := CHR(0)
|
|
|
|
|
+ 15 END
|
|
|
|
|
+ 16 END NextParameter;
|
|
|
|
|
+ 17
|
|
|
|
|
+ 18 PROCEDURE Open (VAR f: File; fileName: ARRAY OF CHAR; newFile: BOOLEAN);
|
|
|
|
|
+ 19 BEGIN
|
|
|
|
|
+ 20 IF newFile THEN f := SysShim.fopenwrite(fileName)
|
|
|
|
|
+ 21 ELSE f := SysShim.fopenread(fileName)
|
|
|
|
|
+ 22 END;
|
|
|
|
|
+ 23 Okay := f # NIL
|
|
|
|
|
+ 24 END Open;
|
|
|
|
|
+ 25
|
|
|
|
|
+ 26 PROCEDURE Close (VAR f: File);
|
|
|
|
|
+ 27 BEGIN
|
|
|
|
|
+ 28 SysShim.fclose(f);
|
|
|
|
|
+ 29 f := NIL
|
|
|
|
|
+ 30 END Close;
|
|
|
|
|
+ 31
|
|
|
|
|
+ 32 PROCEDURE ReadBytes (f: File; VAR buf: ARRAY OF CHAR; VAR len: CARDINAL);
|
|
|
|
|
+ 33 BEGIN
|
|
|
|
|
+ 34 len := SysShim.fread(f, buf, len)
|
|
|
|
|
+ 35 END ReadBytes;
|
|
|
|
|
+ 36
|
|
|
|
|
+ 37 PROCEDURE Write (f: File; ch: CHAR);
|
|
|
|
|
+ 38 BEGIN
|
|
|
|
|
+ 39 IF ch = EOL THEN SysShim.fwriteln(f) ELSE SysShim.fputc(f, ch) END
|
|
|
|
|
+ 40 END Write;
|
|
|
|
|
+ 41
|
|
|
|
|
+ 42 PROCEDURE WriteLn (f: File);
|
|
|
|
|
+ 43 BEGIN
|
|
|
|
|
+ 44 SysShim.fwriteln(f)
|
|
|
|
|
+ 45 END WriteLn;
|
|
|
|
|
+ 46
|
|
|
|
|
+ 47 PROCEDURE WriteString (f: File; str: ARRAY OF CHAR);
|
|
|
|
|
+ 48 BEGIN
|
|
|
|
|
+ 49 SysShim.fputs(f, str)
|
|
|
|
|
+ 50 END WriteString;
|
|
|
|
|
+ 51
|
|
|
|
|
+ 52 PROCEDURE WriteInt (f: File; int: INTEGER; wid: CARDINAL);
|
|
|
|
|
+ 53 BEGIN
|
|
|
|
|
+ 54 SysShim.fwriteintw(f, int, wid)
|
|
|
|
|
+ 55 END WriteInt;
|
|
|
|
|
+ 56
|
|
|
|
|
+ 57 PROCEDURE WriteCard (f: File; card, wid: CARDINAL);
|
|
|
|
|
+ 58 BEGIN
|
|
|
|
|
+ 59 SysShim.fwriteintw(f, card, wid)
|
|
|
|
|
+ 60 END WriteCard;
|
|
|
|
|
+ 61
|
|
|
|
|
+ 62 PROCEDURE SLENGTH (stringVal: ARRAY OF CHAR): CARDINAL;
|
|
|
|
|
+ 63 BEGIN
|
|
|
|
|
+ 64 RETURN LEN(stringVal)
|
|
|
|
|
+ 65 END SLENGTH;
|
|
|
|
|
+ 66
|
|
|
|
|
+ 67 PROCEDURE Assign (source: ARRAY OF CHAR; VAR destination: ARRAY OF CHAR);
|
|
|
|
|
+ 68 VAR i, n: CARDINAL;
|
|
|
|
|
+ 69 BEGIN
|
|
|
|
|
+ 70 n := LEN(source);
|
|
|
|
|
+ 71 IF n > LEN(destination) THEN n := LEN(destination) END;
|
|
|
|
|
+ 72 i := 0;
|
|
|
|
|
+ 73 WHILE i < n DO
|
|
|
|
|
+ 74 destination[i] := source[i];
|
|
|
|
|
+ 75 INC(i)
|
|
|
|
|
+ 76 END
|
|
|
|
|
+ 77 END Assign;
|
|
|
|
|
+ 78
|
|
|
|
|
+ 79 PROCEDURE Extract (source: ARRAY OF CHAR;
|
|
|
|
|
+ 80 startIndex, numberToExtract: CARDINAL;
|
|
|
|
|
+ 81 VAR destination: ARRAY OF CHAR);
|
|
|
|
|
+ 82 VAR i, n, k: CARDINAL;
|
|
|
|
|
+ 83 BEGIN
|
|
|
|
|
+ 84 n := LEN(source);
|
|
|
|
|
+ 85 k := 0;
|
|
|
|
|
+ 86 i := startIndex;
|
|
|
|
|
+ 87 WHILE (i < n) AND (k < numberToExtract) AND (k < LEN(destination)) DO
|
|
|
|
|
+ 88 destination[k] := source[i];
|
|
|
|
|
+ 89 INC(k); INC(i)
|
|
|
|
|
+ 90 END
|
|
|
|
|
+ 91 END Extract;
|
|
|
|
|
+ 92
|
|
|
|
|
+ 93 PROCEDURE Concat (stringVal1, stringVal2: ARRAY OF CHAR;
|
|
|
|
|
+ 94 VAR destination: ARRAY OF CHAR);
|
|
|
|
|
+ 95 VAR i, k: CARDINAL;
|
|
|
|
|
+ 96 BEGIN
|
|
|
|
|
+ 97 k := 0; i := 0;
|
|
|
|
|
+ 98 WHILE (i < LEN(stringVal1)) AND (k < LEN(destination)) DO
|
|
|
|
|
+ 99 destination[k] := stringVal1[i]; INC(k); INC(i)
|
|
|
|
|
+ 100 END;
|
|
|
|
|
+ 101 i := 0;
|
|
|
|
|
+ 102 WHILE (i < LEN(stringVal2)) AND (k < LEN(destination)) DO
|
|
|
|
|
+ 103 destination[k] := stringVal2[i]; INC(k); INC(i)
|
|
|
|
|
+ 104 END
|
|
|
|
|
+ 105 END Concat;
|
|
|
|
|
+ 106
|
|
|
|
|
+ 107 PROCEDURE Compare (stringVal1, stringVal2: ARRAY OF CHAR): INTEGER;
|
|
|
|
|
+ 108 VAR i, n, m: CARDINAL;
|
|
|
|
|
+ 109 BEGIN
|
|
|
|
|
+ 110 n := LEN(stringVal1); m := LEN(stringVal2);
|
|
|
|
|
+ 111 i := 0;
|
|
|
|
|
+ 112 WHILE (i < n) AND (i < m) DO
|
|
|
|
|
+ 113 IF stringVal1[i] < stringVal2[i] THEN RETURN -1
|
|
|
|
|
+ 114 ELSIF stringVal1[i] > stringVal2[i] THEN RETURN 1
|
|
|
|
|
+ 115 END;
|
|
|
|
|
+ 116 INC(i)
|
|
|
|
|
+ 117 END;
|
|
|
|
|
+ 118 IF n < m THEN RETURN -1
|
|
|
|
|
+ 119 ELSIF n > m THEN RETURN 1
|
|
|
|
|
+ 120 END;
|
|
|
|
|
+ 121 RETURN 0
|
|
|
|
|
+ 122 END Compare;
|
|
|
|
|
+ 123
|
|
|
|
|
+ 124 BEGIN
|
|
|
|
|
+ 125 argIdx := 0;
|
|
|
|
|
+ 126 Okay := TRUE;
|
|
|
|
|
+ 127 StdOut := SysShim.stdout();
|
|
|
|
|
+ 128 con := StdOut;
|
|
|
|
|
+ 129 StdIn := NIL;
|
|
|
|
|
+ 130 err := SysShim.stderr()
|
|
|
|
|
+ 131 END FileIO.
|
|
|
|
|
+
|
|
|
|
|
+ 0 errors
|
|
|
|
|
+
|
|
|
|
|
+
|