| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- IMPLEMENTATION MODULE StringIO;
- (*
- * REPERTOIRE
- * Release 1.6
- * By Charles Bradford and Cole Brecheen
- * (c) Copyright 1985-1992 PMI
- * Green Bay, Wisconsin
- * All rights reserved
- * (414) 468-6040
- *
- * $Header: D:/logfiles/mods/stringio.mov 1.7 17 Mar 1991 18:00:12 coleb $
- *
- *)
- IMPORT ErrStrgs;
- IMPORT ErrorManager;
- IMPORT LowLevel;
- IMPORT M2Strings;
- IMPORT SYSTEM;
- IMPORT FAPI;
- VAR
- Initialized : BOOLEAN;
- PROCEDURE Init();
- BEGIN
- IF Initialized THEN
- RETURN;
- ELSE
- Initialized := TRUE;
- END;
- ErrStrgs.Init();
- ErrorManager.Init();
- LowLevel.Init();
- M2Strings.Init();
- CrLf[0] := 15C;
- CrLf[1] := 12C;
- END Init;
- PROCEDURE WriteStr(FileHandle : CARDINAL; TheStr : ARRAY OF CHAR);
- VAR
- BytesWritten: CARDINAL;
- ErrorReturn: CARDINAL;
- BEGIN
- ErrorReturn := FAPI.DOSWRITE( FileHandle, SYSTEM.ADR(TheStr),
- M2Strings.Length(TheStr), SYSTEM.ADR(BytesWritten) );
- IF ErrorReturn #0 THEN
- ErrorManager.WarnNumber("DOSWRITE error", ErrorReturn);
- END;
- END WriteStr;
- PROCEDURE ReadStr(FileHandle : CARDINAL; VAR TheStr : ARRAY OF CHAR);
- VAR
- KbdState : FAPI.KBDINFO;
- lngth : FAPI.STRINGINBUF;
- BytesRead, StrSize, CrSpot : CARDINAL;
- Distance, NewFilePtr, OldFilePtr : LONGINT;
- linefeed: ARRAY [0..0] OF CHAR;
- BEGIN
- (*ReadStr*)
- TheStr[0] := 0C;
- linefeed[0] := CHR(10);
- StrSize := HIGH(TheStr);
- (* For some mysterious reason, if you set StrSize to HIGH+1,
- the call to KBDSTRINGIN doesn't wait for input. *)
- IF FileHandle = inp THEN
- KbdState.cb := 10;
- KbdState.fsMask := FAPI.KEYBOARD_ECHO_ON + FAPI.KEYBOARD_ASCII_MODE;
- KbdState.chTurnAround := 0;
- KbdState.fsInterim := 0;
- KbdState.fsState := 0;
- IF 0 # FAPI.KBDSETSTATUS( SYSTEM.ADR(KbdState), 0 ) THEN
- END;
- lngth.cb := StrSize;
- IF 0 # FAPI.KBDSTRINGIN( SYSTEM.ADR(TheStr),
- SYSTEM.ADR(lngth), 0, 0 ) THEN
- END;
- (* This goddamned thing echoes the carriage return. *)
- WriteStr( outp, linefeed );
- (* So we make the best of it by echoing a linefeed. *)
- TheStr[ lngth.cchIn ] := 0C;
- RETURN;
- END;
- IF FAPI.DOSCHGFILEPTR( FileHandle,
- VAL(LONGINT, 0), 1, SYSTEM.ADR(OldFilePtr)) # 0 THEN
- END;
- (* Move 0 bytes relative to the current position in the
- file so that we can find out what our current position is. *)
- LowLevel.Fill( SYSTEM.ADR(TheStr), StrSize, 0C );
- IF FAPI.DOSREAD( FileHandle, SYSTEM.ADR(TheStr),
- StrSize, SYSTEM.ADR(BytesRead) ) = 0 THEN
- CrSpot := LowLevel.ScanEQ( BytesRead, CHR(13), SYSTEM.ADR(TheStr) );
- (* Scan for a carriage return *)
- IF (CrSpot < BytesRead) THEN
- (* We found one. *)
- TheStr[CrSpot] := 0C;
- IF (CrSpot < HIGH(TheStr)) AND (TheStr[CrSpot + 1] = CHR(10)) THEN
- (* If the next character is a linefeed *)
- INC( CrSpot );
- TheStr[CrSpot] := 0C;
- END;
- IF FAPI.DOSCHGFILEPTR( FileHandle,
- OldFilePtr + VAL(LONGINT, CrSpot+1), 0,
- SYSTEM.ADR(NewFilePtr)) # 0 THEN
- END;
- END;
- ELSE
- ErrorManager.WARN("DOSREAD error ");
- END;
- END ReadStr;
- PROCEDURE ReadString(FileHandle : CARDINAL; VAR
- TheStr : ARRAY OF CHAR; VAR EndOfFileReached:
- BOOLEAN );
- VAR
- StrSize, BytesRead, CrSpot: CARDINAL;
- OldFilePtr, NewFilePtr: LONGINT;
- BEGIN
- StrSize := HIGH(TheStr) + 1;
- IF FAPI.DOSCHGFILEPTR( FileHandle,
- VAL(LONGINT, 0), 1, SYSTEM.ADR(OldFilePtr)) # 0 THEN
- END;
- (* Move 0 bytes relative to the current position in the
- file so that we can find out what our current position is. *)
- LowLevel.Fill( SYSTEM.ADR(TheStr), StrSize, 0C );
- (* If the following read fails, maybe because we've reached
- the end of the file, it won't zero out TheStr. We have to
- make sure TheStr is null if we're not reading a new string. *)
- IF FAPI.DOSREAD( FileHandle, SYSTEM.ADR(TheStr),
- StrSize, SYSTEM.ADR(BytesRead) ) = 0 THEN
- CrSpot := LowLevel.ScanEQ( BytesRead, CHR(13), SYSTEM.ADR(TheStr) );
- (* Scan for a carriage return *)
- IF (CrSpot < BytesRead) THEN
- (* We found one. *)
- TheStr[CrSpot] := 0C;
- BytesRead := StrSize;
- IF (CrSpot < HIGH(TheStr)) AND (TheStr[CrSpot + 1] = CHR(10)) THEN
- (* If the next character is a linefeed *)
- INC( CrSpot );
- TheStr[CrSpot] := 0C;
- END;
- IF FAPI.DOSCHGFILEPTR( FileHandle,
- OldFilePtr + VAL(LONGINT, CrSpot + 1), 0,
- SYSTEM.ADR(NewFilePtr)) # 0 THEN
- END;
- END;
- END;
- EndOfFileReached := BytesRead < StrSize;
- END ReadString;
- PROCEDURE WriteEol(FileHandle : CARDINAL; TheStr : ARRAY OF CHAR);
- VAR
- TmpStr : ARRAY [0..255] OF CHAR;
- bufstr : ARRAY [0..2] OF CHAR;
- BEGIN
- IF M2Strings.Length(TheStr)<=254 THEN
- M2Strings.Concat(TheStr, CrLf, TmpStr);
- WriteStr(FileHandle, TmpStr);
- ELSE
- WriteStr(FileHandle, TheStr);
- WriteStr(FileHandle, CrLf);
- END;
- END WriteEol;
- PROCEDURE MessageType(FunctionResult : CHAR) : CARDINAL;
- BEGIN
- RETURN ORD( FunctionResult );
- END MessageType;
- PROCEDURE PrintMessage(FunctionResult : CARDINAL);
- VAR
- TmpStr: ARRAY [0..79] OF CHAR;
- BEGIN
- ErrStrgs.NumToStr( FunctionResult, TmpStr );
- CASE FunctionResult OF
- NoError : (*do nothing*)
- | PartialRead, EndOfFile:
- WriteStr( ErrorOutp, TmpStr );
- ELSE
- ErrorManager.WARN( TmpStr );
- END;
- END PrintMessage;
- BEGIN
- Initialized := FALSE;
- Init();
- END StringIO.
|