| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- 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
|