STRINGIO.MOD 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  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. KbdState : FAPI.KBDINFO;
  50. lngth : FAPI.STRINGINBUF;
  51. BytesRead, StrSize, CrSpot : CARDINAL;
  52. Distance, NewFilePtr, OldFilePtr : LONGINT;
  53. linefeed: ARRAY [0..0] OF CHAR;
  54. BEGIN
  55. (*ReadStr*)
  56. TheStr[0] := 0C;
  57. linefeed[0] := CHR(10);
  58. StrSize := HIGH(TheStr);
  59. (* For some mysterious reason, if you set StrSize to HIGH+1,
  60. the call to KBDSTRINGIN doesn't wait for input. *)
  61. IF FileHandle = inp THEN
  62. KbdState.cb := 10;
  63. KbdState.fsMask := FAPI.KEYBOARD_ECHO_ON + FAPI.KEYBOARD_ASCII_MODE;
  64. KbdState.chTurnAround := 0;
  65. KbdState.fsInterim := 0;
  66. KbdState.fsState := 0;
  67. IF 0 # FAPI.KBDSETSTATUS( SYSTEM.ADR(KbdState), 0 ) THEN
  68. END;
  69. lngth.cb := StrSize;
  70. IF 0 # FAPI.KBDSTRINGIN( SYSTEM.ADR(TheStr),
  71. SYSTEM.ADR(lngth), 0, 0 ) THEN
  72. END;
  73. (* This goddamned thing echoes the carriage return. *)
  74. WriteStr( outp, linefeed );
  75. (* So we make the best of it by echoing a linefeed. *)
  76. TheStr[ lngth.cchIn ] := 0C;
  77. RETURN;
  78. END;
  79. IF FAPI.DOSCHGFILEPTR( FileHandle,
  80. VAL(LONGINT, 0), 1, SYSTEM.ADR(OldFilePtr)) # 0 THEN
  81. END;
  82. (* Move 0 bytes relative to the current position in the
  83. file so that we can find out what our current position is. *)
  84. LowLevel.Fill( SYSTEM.ADR(TheStr), StrSize, 0C );
  85. IF FAPI.DOSREAD( FileHandle, SYSTEM.ADR(TheStr),
  86. StrSize, SYSTEM.ADR(BytesRead) ) = 0 THEN
  87. CrSpot := LowLevel.ScanEQ( BytesRead, CHR(13), SYSTEM.ADR(TheStr) );
  88. (* Scan for a carriage return *)
  89. IF (CrSpot < BytesRead) THEN
  90. (* We found one. *)
  91. TheStr[CrSpot] := 0C;
  92. IF (CrSpot < HIGH(TheStr)) AND (TheStr[CrSpot + 1] = CHR(10)) THEN
  93. (* If the next character is a linefeed *)
  94. INC( CrSpot );
  95. TheStr[CrSpot] := 0C;
  96. END;
  97. IF FAPI.DOSCHGFILEPTR( FileHandle,
  98. OldFilePtr + VAL(LONGINT, CrSpot+1), 0,
  99. SYSTEM.ADR(NewFilePtr)) # 0 THEN
  100. END;
  101. END;
  102. ELSE
  103. ErrorManager.WARN("DOSREAD error ");
  104. END;
  105. END ReadStr;
  106. PROCEDURE ReadString(FileHandle : CARDINAL; VAR
  107. TheStr : ARRAY OF CHAR; VAR EndOfFileReached:
  108. BOOLEAN );
  109. VAR
  110. StrSize, BytesRead, CrSpot: CARDINAL;
  111. OldFilePtr, NewFilePtr: LONGINT;
  112. BEGIN
  113. StrSize := HIGH(TheStr) + 1;
  114. IF FAPI.DOSCHGFILEPTR( FileHandle,
  115. VAL(LONGINT, 0), 1, SYSTEM.ADR(OldFilePtr)) # 0 THEN
  116. END;
  117. (* Move 0 bytes relative to the current position in the
  118. file so that we can find out what our current position is. *)
  119. LowLevel.Fill( SYSTEM.ADR(TheStr), StrSize, 0C );
  120. (* If the following read fails, maybe because we've reached
  121. the end of the file, it won't zero out TheStr. We have to
  122. make sure TheStr is null if we're not reading a new string. *)
  123. IF FAPI.DOSREAD( FileHandle, SYSTEM.ADR(TheStr),
  124. StrSize, SYSTEM.ADR(BytesRead) ) = 0 THEN
  125. CrSpot := LowLevel.ScanEQ( BytesRead, CHR(13), SYSTEM.ADR(TheStr) );
  126. (* Scan for a carriage return *)
  127. IF (CrSpot < BytesRead) THEN
  128. (* We found one. *)
  129. TheStr[CrSpot] := 0C;
  130. BytesRead := StrSize;
  131. IF (CrSpot < HIGH(TheStr)) AND (TheStr[CrSpot + 1] = CHR(10)) THEN
  132. (* If the next character is a linefeed *)
  133. INC( CrSpot );
  134. TheStr[CrSpot] := 0C;
  135. END;
  136. IF FAPI.DOSCHGFILEPTR( FileHandle,
  137. OldFilePtr + VAL(LONGINT, CrSpot + 1), 0,
  138. SYSTEM.ADR(NewFilePtr)) # 0 THEN
  139. END;
  140. END;
  141. END;
  142. EndOfFileReached := BytesRead < StrSize;
  143. END ReadString;
  144. PROCEDURE WriteEol(FileHandle : CARDINAL; TheStr : ARRAY OF CHAR);
  145. VAR
  146. TmpStr : ARRAY [0..255] OF CHAR;
  147. bufstr : ARRAY [0..2] OF CHAR;
  148. BEGIN
  149. IF M2Strings.Length(TheStr)<=254 THEN
  150. M2Strings.Concat(TheStr, CrLf, TmpStr);
  151. WriteStr(FileHandle, TmpStr);
  152. ELSE
  153. WriteStr(FileHandle, TheStr);
  154. WriteStr(FileHandle, CrLf);
  155. END;
  156. END WriteEol;
  157. PROCEDURE MessageType(FunctionResult : CHAR) : CARDINAL;
  158. BEGIN
  159. RETURN ORD( FunctionResult );
  160. END MessageType;
  161. PROCEDURE PrintMessage(FunctionResult : CARDINAL);
  162. VAR
  163. TmpStr: ARRAY [0..79] OF CHAR;
  164. BEGIN
  165. ErrStrgs.NumToStr( FunctionResult, TmpStr );
  166. CASE FunctionResult OF
  167. NoError : (*do nothing*)
  168. | PartialRead, EndOfFile:
  169. WriteStr( ErrorOutp, TmpStr );
  170. ELSE
  171. ErrorManager.WARN( TmpStr );
  172. END;
  173. END PrintMessage;
  174. BEGIN
  175. Initialized := FALSE;
  176. Init();
  177. END StringIO.