FileIO.LST 3.8 KB

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