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