STRINGIO.MOD 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. IMPLEMENTATION MODULE StringIO;
  2. (*
  3. * REPERTOIRE
  4. * Release 1.6
  5. * By Charles Bradford and Cole Brecheen
  6. * (c) Copyright 1985-1992 PMI
  7. * Green Bay, Wisconsin
  8. * All rights reserved
  9. * (414) 468-6040
  10. *
  11. * $Header: D:/logfiles/mods/stringio.mov 1.7 17 Mar 1991 18:00:12 coleb $
  12. *
  13. *)
  14. IMPORT ErrStrgs;
  15. IMPORT ErrorManager;
  16. IMPORT LowLevel;
  17. IMPORT M2Strings;
  18. IMPORT SYSTEM;
  19. IMPORT FAPI;
  20. VAR
  21. Initialized : BOOLEAN;
  22. PROCEDURE Init();
  23. BEGIN
  24. IF Initialized THEN
  25. RETURN;
  26. ELSE
  27. Initialized := TRUE;
  28. END;
  29. ErrStrgs.Init();
  30. ErrorManager.Init();
  31. LowLevel.Init();
  32. M2Strings.Init();
  33. CrLf[0] := 15C;
  34. CrLf[1] := 12C;
  35. END Init;
  36. PROCEDURE WriteStr(FileHandle : CARDINAL; TheStr : ARRAY OF CHAR);
  37. VAR
  38. BytesWritten: CARDINAL;
  39. ErrorReturn: CARDINAL;
  40. BEGIN
  41. ErrorReturn := FAPI.DOSWRITE( FileHandle, SYSTEM.ADR(TheStr),
  42. M2Strings.Length(TheStr), SYSTEM.ADR(BytesWritten) );
  43. IF ErrorReturn #0 THEN
  44. ErrorManager.WarnNumber("DOSWRITE error", ErrorReturn);
  45. END;
  46. END WriteStr;
  47. PROCEDURE ReadStr(FileHandle : CARDINAL; VAR TheStr : ARRAY OF CHAR);
  48. VAR
  49. lngth : FAPI.STRINGINBUF;
  50. BytesRead, StrSize, CrSpot : CARDINAL;
  51. Distance, NewFilePtr, OldFilePtr : LONGINT;
  52. linefeed: ARRAY [0..0] OF CHAR;
  53. hAtr,hType: CARDINAL;
  54. PROCEDURE ReadKbd;
  55. VAR
  56. KbdState : FAPI.KBDINFO;
  57. s:ARRAY[0..255] OF CHAR;
  58. BEGIN
  59. (* we have to got through some contortions here because KBDSTRINGIN
  60. returns the final carriage return loosing the last chr position *)
  61. KbdState.cb := 10;
  62. KbdState.fsMask := FAPI.KEYBOARD_ECHO_ON + FAPI.KEYBOARD_ASCII_MODE;
  63. KbdState.chTurnAround := 0;
  64. KbdState.fsInterim := 0;
  65. KbdState.fsState := 0;
  66. IF 0 # FAPI.KBDSETSTATUS( SYSTEM.ADR(KbdState), FileHandle) THEN
  67. END;
  68. lngth.cb := StrSize+1;
  69. IF 0 # FAPI.KBDSTRINGIN( SYSTEM.ADR(s),
  70. SYSTEM.ADR(lngth), 0, FileHandle ) THEN
  71. END;
  72. (* KBDSTRNGIN Echos the carriage return. *)
  73. WriteStr( outp, linefeed );
  74. (* So we make the best of it by echoing a linefeed. *)
  75. s[ lngth.cchIn ] := 0C;
  76. M2Strings.Assign(s,TheStr);
  77. END ReadKbd;
  78. BEGIN
  79. (*ReadStr*)
  80. TheStr[0] := 0C;
  81. linefeed[0] := CHR(10);
  82. StrSize := HIGH(TheStr)+1;
  83. (* check to see if handle is a keybourd
  84. under os/2 there could be other keybourd handles
  85. also the keybourd could be redirected to a file.
  86. JM 7/17/92 *)
  87. IF FAPI.DOSQHANDTYPE(FileHandle,SYSTEM.ADR(hType),SYSTEM.ADR(hAtr)) # 0 THEN
  88. ErrorManager.WARN("KBDSETSTATUS");
  89. END;
  90. IF( hType=1) AND (8001H IN BITSET( hAtr)) (*Std in and char device *)
  91. THEN
  92. ReadKbd;
  93. ELSE
  94. IF FAPI.DOSCHGFILEPTR( FileHandle,
  95. VAL(LONGINT, 0), 1, SYSTEM.ADR(OldFilePtr)) # 0 THEN
  96. END;
  97. (* Move 0 bytes relative to the current position in the
  98. file so that we can find out what our current position is. *)
  99. LowLevel.Fill( SYSTEM.ADR(TheStr), StrSize, 0C );
  100. IF FAPI.DOSREAD( FileHandle, SYSTEM.ADR(TheStr),
  101. StrSize, SYSTEM.ADR(BytesRead) ) = 0 THEN
  102. CrSpot := LowLevel.ScanEQ( BytesRead, CHR(13), SYSTEM.ADR(TheStr) );
  103. (* Scan for a carriage return *)
  104. IF (CrSpot < BytesRead) THEN
  105. (* We found one. *)
  106. TheStr[CrSpot] := 0C;
  107. IF (CrSpot < HIGH(TheStr)) AND (TheStr[CrSpot + 1] = CHR(10)) THEN
  108. (* If the next character is a linefeed *)
  109. INC( CrSpot );
  110. TheStr[CrSpot] := 0C;
  111. END;
  112. IF FAPI.DOSCHGFILEPTR( FileHandle,
  113. OldFilePtr + VAL(LONGINT, CrSpot+1), 0,
  114. SYSTEM.ADR(NewFilePtr)) # 0 THEN
  115. END;
  116. END;
  117. ELSE
  118. ErrorManager.WARN("DOSREAD error ");
  119. END;
  120. END;
  121. END ReadStr;
  122. PROCEDURE ReadString(FileHandle : CARDINAL; VAR
  123. TheStr : ARRAY OF CHAR; VAR EndOfFileReached:
  124. BOOLEAN );
  125. VAR
  126. StrSize, BytesRead, CrSpot: CARDINAL;
  127. OldFilePtr, NewFilePtr: LONGINT;
  128. BEGIN
  129. StrSize := HIGH(TheStr) + 1;
  130. IF FAPI.DOSCHGFILEPTR( FileHandle,
  131. VAL(LONGINT, 0), 1, SYSTEM.ADR(OldFilePtr)) # 0 THEN
  132. END;
  133. (* Move 0 bytes relative to the current position in the
  134. file so that we can find out what our current position is. *)
  135. LowLevel.Fill( SYSTEM.ADR(TheStr), StrSize, 0C );
  136. (* If the following read fails, maybe because we've reached
  137. the end of the file, it won't zero out TheStr. We have to
  138. make sure TheStr is null if we're not reading a new string. *)
  139. IF FAPI.DOSREAD( FileHandle, SYSTEM.ADR(TheStr),
  140. StrSize, SYSTEM.ADR(BytesRead) ) = 0 THEN
  141. CrSpot := LowLevel.ScanEQ( BytesRead, CHR(13), SYSTEM.ADR(TheStr) );
  142. (* Scan for a carriage return *)
  143. IF (CrSpot < BytesRead) THEN
  144. (* We found one. *)
  145. TheStr[CrSpot] := 0C;
  146. BytesRead := StrSize;
  147. IF (CrSpot < HIGH(TheStr)) AND (TheStr[CrSpot + 1] = CHR(10)) THEN
  148. (* If the next character is a linefeed *)
  149. INC( CrSpot );
  150. TheStr[CrSpot] := 0C;
  151. END;
  152. IF FAPI.DOSCHGFILEPTR( FileHandle,
  153. OldFilePtr + VAL(LONGINT, CrSpot + 1), 0,
  154. SYSTEM.ADR(NewFilePtr)) # 0 THEN
  155. END;
  156. END;
  157. END;
  158. EndOfFileReached := BytesRead < StrSize;
  159. END ReadString;
  160. PROCEDURE WriteEol(FileHandle : CARDINAL; TheStr : ARRAY OF CHAR);
  161. VAR
  162. TmpStr : ARRAY [0..255] OF CHAR;
  163. bufstr : ARRAY [0..2] OF CHAR;
  164. BEGIN
  165. IF M2Strings.Length(TheStr)<=254 THEN
  166. M2Strings.Concat(TheStr, CrLf, TmpStr);
  167. WriteStr(FileHandle, TmpStr);
  168. ELSE
  169. WriteStr(FileHandle, TheStr);
  170. WriteStr(FileHandle, CrLf);
  171. END;
  172. END WriteEol;
  173. PROCEDURE MessageType(FunctionResult : CHAR) : CARDINAL;
  174. BEGIN
  175. RETURN ORD( FunctionResult );
  176. END MessageType;
  177. PROCEDURE PrintMessage(FunctionResult : CARDINAL);
  178. VAR
  179. TmpStr: ARRAY [0..79] OF CHAR;
  180. BEGIN
  181. ErrStrgs.NumToStr( FunctionResult, TmpStr );
  182. CASE FunctionResult OF
  183. NoError : (*do nothing*)
  184. | PartialRead, EndOfFile:
  185. WriteStr( ErrorOutp, TmpStr );
  186. ELSE
  187. ErrorManager.WARN( TmpStr );
  188. END;
  189. END PrintMessage;
  190. BEGIN
  191. Initialized := FALSE;
  192. Init();
  193. END StringIO.