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 lngth : FAPI.STRINGINBUF; BytesRead, StrSize, CrSpot : CARDINAL; Distance, NewFilePtr, OldFilePtr : LONGINT; linefeed: ARRAY [0..0] OF CHAR; hAtr,hType: CARDINAL; PROCEDURE ReadKbd; VAR KbdState : FAPI.KBDINFO; s:ARRAY[0..255] OF CHAR; BEGIN (* we have to got through some contortions here because KBDSTRINGIN returns the final carriage return loosing the last chr position *) 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), FileHandle) THEN END; lngth.cb := StrSize+1; IF 0 # FAPI.KBDSTRINGIN( SYSTEM.ADR(s), SYSTEM.ADR(lngth), 0, FileHandle ) THEN END; (* KBDSTRNGIN Echos the carriage return. *) WriteStr( outp, linefeed ); (* So we make the best of it by echoing a linefeed. *) s[ lngth.cchIn ] := 0C; M2Strings.Assign(s,TheStr); END ReadKbd; BEGIN (*ReadStr*) TheStr[0] := 0C; linefeed[0] := CHR(10); StrSize := HIGH(TheStr)+1; (* check to see if handle is a keybourd under os/2 there could be other keybourd handles also the keybourd could be redirected to a file. JM 7/17/92 *) IF FAPI.DOSQHANDTYPE(FileHandle,SYSTEM.ADR(hType),SYSTEM.ADR(hAtr)) # 0 THEN ErrorManager.WARN("KBDSETSTATUS"); END; IF( hType=1) AND (8001H IN BITSET( hAtr)) (*Std in and char device *) THEN ReadKbd; ELSE 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; 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.