WINFIO.MOD 4.6 KB

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