FileIO.mod 2.9 KB

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