WINFIO.MOD 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. (* Release 3.00 *)
  2. (* Copyright (C) 1987..1991 Jensen & Partners International *)
  3. (*# call(seg_name => null) *)
  4. (*# module(implementation=>off) *)
  5. (*# data(seg_name => null, near_ptr=>off) *)
  6. (*# call(o_a_copy => off, ds_eq_ss=>off, near_call=>off) *)
  7. (*# check(stack=>off,
  8. index=>off,
  9. range=>off,
  10. overflow=>off,
  11. nil_ptr=>off) *)
  12. IMPLEMENTATION MODULE WinFIO;
  13. IMPORT Lib, SYSTEM, CoreIO, CoreFile, CoreSig, CoreMain, Windows;
  14. VAR
  15. (* CoreFile.BufInf : ARRAY[0..MaxHandle] OF FileInf; *) (* NB in CoreFile *)
  16. IOR: CARDINAL;
  17. TYPE
  18. Str80 = ARRAY[0..79] OF CHAR;
  19. PathStr = ARRAY [0..128] OF CHAR;
  20. PROCEDURE ErrorCheck(Code: CARDINAL; ErrNum: CARDINAL; Msg, Name: ARRAY OF CHAR);
  21. VAR
  22. ErrMsg: ARRAY [0..119] OF CHAR;
  23. NumStr: ARRAY [0..19] OF CHAR;
  24. OK: BOOLEAN;
  25. BEGIN
  26. IF ErrNum = 0 THEN
  27. ErrNum := Lib.SysErrno();
  28. END;
  29. IF IOcheck THEN
  30. Str.Copy(ErrMsg, Msg);
  31. Str.Append(ErrMsg, Name);
  32. Str.Append(ErrMsg, '. Dos Error Code ');
  33. Str.CardToStr(LONGCARD(ErrNum), NumStr, 10, OK);
  34. Str.Append(ErrMsg, NumStr);
  35. (* Lib.WrDosError(SHORTCARD(ErrNum)); *)
  36. Lib.RunTimeError(CoreSig._FatalErrorPos(), Code+0A0H, ErrMsg);
  37. END;
  38. IOR := ErrNum;
  39. END ErrorCheck;
  40. PROCEDURE IOresult () : CARDINAL;
  41. BEGIN
  42. RETURN IOR;
  43. END IOresult;
  44. PROCEDURE WrBin(F: File; Buf: ARRAY OF BYTE; Count: CARDINAL);
  45. VAR
  46. NumWrit : CARDINAL;
  47. BEGIN
  48. IOR := 0;
  49. OK := TRUE;
  50. IF Count = 0 THEN RETURN END;
  51. NumWrit := Windows._lwrite(F, Buf, Count);
  52. IF NumWrit # Count THEN
  53. ErrorCheck(6, 0, 'WrBin : ', Lib.NilStr);
  54. OK := FALSE;
  55. END;
  56. END WrBin;
  57. PROCEDURE RdBin(F: File; VAR Buf: ARRAY OF BYTE; Count: CARDINAL) : CARDINAL;
  58. VAR
  59. NumRead: CARDINAL;
  60. BEGIN
  61. IOR := 0;
  62. OK := TRUE;
  63. EOF := FALSE;
  64. IF Count = 0 THEN RETURN 0 END;
  65. NumRead := Windows._lread(F, Buf, Count);
  66. IF NumRead # Count THEN
  67. OK := FALSE;
  68. IF NumRead < 0 THEN
  69. ErrorCheck(7, 0, 'RbBin : ', Lib.NilStr);
  70. ELSE
  71. EOF := TRUE;
  72. END;
  73. END;
  74. RETURN NumRead;
  75. END RdBin;
  76. PROCEDURE GetName(name: ARRAY OF CHAR; VAR fn: PathStr);
  77. (* Makes Null terminated filename, also sets IOR to 0 *)
  78. BEGIN
  79. Str.Copy(fn,name);
  80. fn[HIGH(fn)] := CHR(0);
  81. IOR := 0;
  82. END GetName;
  83. PROCEDURE Open(Name: ARRAY OF CHAR) : File;
  84. VAR
  85. fn: PathStr;
  86. H: File;
  87. BEGIN
  88. GetName(Name,fn);
  89. H := Windows._lopen(fn, Windows.READ_WRITE + INTEGER(ShareMode));
  90. IF H <> MAX(CARDINAL) THEN
  91. CoreFile._openfd[H] := (CoreIO.O_RDWR+CoreIO.O_BINARY);
  92. IF CoreIO.isatty(H) # 0 THEN
  93. CoreFile._openfd[H] := CoreFile._openfd[H] + CoreIO.O_DEVICE;
  94. END;
  95. ELSE
  96. ErrorCheck(2, 0, 'Open : ', fn);
  97. END;
  98. RETURN H;
  99. END Open;
  100. PROCEDURE OpenRead( Name: ARRAY OF CHAR) : File;
  101. VAR
  102. fn: PathStr;
  103. H: File;
  104. BEGIN
  105. GetName(Name,fn);
  106. H := Windows._lopen(fn, Windows.READ + INTEGER(ShareMode));
  107. IF H <> MAX(CARDINAL) THEN
  108. CoreFile._openfd[H] := (CoreIO.O_RDONLY+CoreIO.O_BINARY);
  109. IF CoreIO.isatty(H) # 0 THEN
  110. CoreFile._openfd[H] := CoreFile._openfd[H] + CoreIO.O_DEVICE;
  111. END;
  112. ELSE
  113. ErrorCheck(3, 0, 'OpenRead : ', fn);
  114. END;
  115. RETURN H;
  116. END OpenRead;
  117. PROCEDURE Exists(Name: ARRAY OF CHAR) : BOOLEAN;
  118. VAR
  119. fn : PathStr ;
  120. BEGIN
  121. GetName(Name,fn);
  122. IF CoreIO._exists(fn) # 0 THEN
  123. RETURN TRUE;
  124. END;
  125. RETURN FALSE;
  126. END Exists;
  127. PROCEDURE Create(Name: ARRAY OF CHAR) : File;
  128. VAR
  129. fn: PathStr;
  130. H: File;
  131. BEGIN
  132. GetName(Name,fn);
  133. H := Windows._lcreat(fn, 0);
  134. IF H <> MAX(CARDINAL) THEN
  135. CoreFile._openfd[H] := (CoreIO.O_RDWR+CoreIO.O_BINARY);
  136. ELSE
  137. ErrorCheck(5, 0, 'Create : ', Name);
  138. END;
  139. RETURN H;
  140. END Create;
  141. PROCEDURE Close(F: File);
  142. BEGIN
  143. IOR := 0;
  144. IF F < CoreFile._open_max THEN
  145. CoreFile._openfd[F] := {};
  146. END;
  147. IF Windows._lclose(F) = -1 THEN
  148. ErrorCheck(0, 0, 'Close : ', Lib.NilStr);
  149. END;
  150. RETURN;
  151. END Close;
  152. BEGIN
  153. IOR := 0;
  154. OK := TRUE;
  155. EOF := FALSE;
  156. ShareMode := ShareCompat;
  157. END WinFIO.
  158.