M2makeOS_gm2.mod 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. IMPLEMENTATION MODULE M2makeOS;
  2. (* GNU Modula-2 implementation: binds the NUL-string (_s) half of
  3. m2make_os.c plus the shared m2osBye/m2osClose via M2makeC.
  4. Arguments come from the host FileIO (which already skips argv[0])
  5. and are cached in a static table. Compiled only by gm2 (staged
  6. as M2makeOS.mod). *)
  7. FROM SYSTEM IMPORT ADDRESS;
  8. IMPORT M2makeC, FileIO, IOChan, StdChans;
  9. TYPE
  10. AStr = ARRAY [0..255] OF CHAR;
  11. VAR
  12. argTab: ARRAY [0..63] OF AStr;
  13. argN: CARDINAL;
  14. argDrained: BOOLEAN;
  15. PROCEDURE CopyArg(src: ARRAY OF CHAR; VAR dst: ARRAY OF CHAR);
  16. VAR i: CARDINAL;
  17. BEGIN
  18. i := 0;
  19. WHILE (i <= HIGH(src)) AND (i <= HIGH(dst)) DO
  20. dst[i] := src[i];
  21. IF src[i] = CHR(0) THEN RETURN END;
  22. INC(i)
  23. END;
  24. dst[HIGH(dst)] := CHR(0)
  25. END CopyArg;
  26. PROCEDURE Drain;
  27. VAR s: AStr; i: CARDINAL;
  28. BEGIN
  29. IF argDrained THEN RETURN END;
  30. argDrained := TRUE;
  31. argN := 0;
  32. i := 0;
  33. WHILE i <= HIGH(s) DO s[i] := CHR(0); INC(i) END;
  34. LOOP
  35. FileIO.NextParameter(s);
  36. IF s[0] = CHR(0) THEN EXIT END;
  37. IF argN > HIGH(argTab) THEN EXIT END;
  38. CopyArg(s, argTab[argN]);
  39. INC(argN)
  40. END
  41. END Drain;
  42. PROCEDURE FileExists(VAR name: ARRAY OF CHAR): BOOLEAN;
  43. BEGIN
  44. RETURN M2makeC.m2osExistS(name)
  45. END FileExists;
  46. PROCEDURE FileMTime(VAR name: ARRAY OF CHAR; VAR t: LONGINT): BOOLEAN;
  47. BEGIN
  48. RETURN M2makeC.m2osMtimeS(name, t)
  49. END FileMTime;
  50. PROCEDURE ExecCmd(VAR cmd: ARRAY OF CHAR): INTEGER;
  51. BEGIN
  52. RETURN M2makeC.m2osSystemS(cmd)
  53. END ExecCmd;
  54. PROCEDURE ExitNow(code: INTEGER);
  55. BEGIN
  56. (* Flush gm2's channel buffers: raw exit() would drop the tail. *)
  57. IOChan.Flush(StdChans.StdOutChan());
  58. M2makeC.m2osBye(code)
  59. END ExitNow;
  60. PROCEDURE OpenRead(VAR name: ARRAY OF CHAR): RdFile;
  61. BEGIN
  62. RETURN M2makeC.m2osOpenreadS(name)
  63. END OpenRead;
  64. PROCEDURE ArgCount(): CARDINAL;
  65. BEGIN
  66. Drain;
  67. RETURN argN
  68. END ArgCount;
  69. PROCEDURE ZeroArg(VAR s: ARRAY OF CHAR);
  70. VAR k: CARDINAL;
  71. BEGIN
  72. k := 0;
  73. WHILE k <= HIGH(s) DO s[k] := CHR(0); INC(k) END
  74. END ZeroArg;
  75. PROCEDURE GetArg(i: CARDINAL; VAR s: ARRAY OF CHAR;
  76. cap: CARDINAL): BOOLEAN;
  77. VAR k: CARDINAL; done: BOOLEAN;
  78. BEGIN
  79. Drain;
  80. IF cap = 0 THEN RETURN FALSE END;
  81. IF i >= argN THEN RETURN FALSE END;
  82. ZeroArg(s);
  83. k := 0;
  84. done := FALSE;
  85. WHILE (NOT done) AND (k + 1 < cap) AND (k <= HIGH(argTab[i]))
  86. AND (k <= HIGH(s)) DO
  87. IF argTab[i][k] = CHR(0) THEN done := TRUE
  88. ELSE s[k] := argTab[i][k]; INC(k)
  89. END
  90. END;
  91. RETURN TRUE
  92. END GetArg;
  93. PROCEDURE ReadLine(h: RdFile; VAR buf: ARRAY OF CHAR;
  94. cap: CARDINAL): BOOLEAN;
  95. BEGIN
  96. RETURN M2makeC.m2osReadlineS(h, buf, cap)
  97. END ReadLine;
  98. PROCEDURE CloseRead(h: RdFile);
  99. BEGIN
  100. M2makeC.m2osClose(h)
  101. END CloseRead;
  102. BEGIN
  103. argDrained := FALSE;
  104. argN := 0
  105. END M2makeOS.