<> <> <> <> <> DIRECTORY Basics USING [LowByte], IO, PascalBasic, PrincOpsUtils USING [LongCopy]; PascalInlineFiles: CEDAR DEFINITIONS IMPORTS Basics, IO, PrincOpsUtils = BEGIN OPEN PascalBasic; <> PascalFile: TYPE = LONG POINTER TO MesaFile _ NIL; PascalFilePtr: TYPE = LONG POINTER TO PascalFile; -- for passing files as VAR parameters MesaFile: TYPE = RECORD [ str: IO.STREAM _ NIL, eof: BOOLEAN _ FALSE, openFileLink: MesaFilePtr _ NIL]; MesaFilePtr: TYPE = REF MesaFile; PascalTextFile: TYPE = RECORD [ baseFile: PascalFile, eoln: BOOLEAN _ TRUE, -- TRUE if element is a blank representing CR element: PascalChar _ ' -- last character read ]; PascalTextFilePtr: TYPE = LONG POINTER TO PascalTextFile; -- for passing by VAR Text: TYPE = PascalTextFile; <

> <> PascalTextBREAK: PROCEDURE [file: PascalTextFilePtr]; PascalTextGET: PROCEDURE [file: PascalTextFilePtr] = TRUSTED INLINE BEGIN file.element _ file.baseFile.str.GetChar[ ! IO.EndOfStream => GOTO EOF]; SELECT file.element FROM '\N --CarriageReturn-- => { file.eoln _ TRUE; file.element _ ' }; ENDCASE => file.eoln _ FALSE; EXITS EOF => { file.baseFile.eof _ file.eoln _ TRUE; file.element _ ' }; END; PascalTextElement: PROCEDURE [file: PascalTextFilePtr] RETURNS [PascalChar] = TRUSTED INLINE BEGIN RETURN[file.element]; END; PascalTextPUT: PROCEDURE [file: PascalTextFilePtr] = TRUSTED INLINE BEGIN file.baseFile.str.PutChar[file.element]; END; PascalTextRESET: PROCEDURE [file: PascalTextFilePtr]; PascalTextREWRITE: PROCEDURE [file: PascalTextFilePtr]; PascalTextPAGE: PROCEDURE [file: PascalTextFilePtr] = INLINE BEGIN PascalWriteLn[file: file]; PascalWriteChar[file: file, item: '\F --form feed--]; PascalWriteLn[file: file] END; PascalTextEOF: PROCEDURE [file: PascalTextFilePtr] RETURNS [BOOLEAN] = TRUSTED INLINE BEGIN RETURN[file.baseFile.eof]; END; PascalTextEOLN: PROCEDURE [file: PascalTextFilePtr] RETURNS [BOOLEAN] = TRUSTED INLINE BEGIN RETURN[file.eoln]; END; <> <> <> <> <> PascalBREAK: PROCEDURE [ file: PascalFilePtr, length: CARDINAL, element: LONG POINTER]; PascalGET: UNSAFE PROCEDURE [ file: PascalFilePtr, length: CARDINAL, element: LONG POINTER -- TO ARRAY[0..length/2) OF UNSPECIFIED --] = UNCHECKED INLINE BEGIN IF length = 1 THEN element^ _ file.str.GetChar[ ! IO.EndOfStream => {file.eof _ TRUE; CONTINUE}] ELSE IF length # file.str.UnsafeGetBlock[[base: element, startIndex: 0, count: length]] THEN file.eof _ TRUE; END; PascalPUT: PROCEDURE [ file: PascalFilePtr, length: CARDINAL, element: LONG POINTER -- TO ARRAY[0..length/2) OF UNSPECIFIED --] = TRUSTED INLINE BEGIN IF length = 1 THEN file.str.PutChar[LOOPHOLE[Basics.LowByte[LOOPHOLE[element^]]]] ELSE file.str.UnsafePutBlock[[base: element, startIndex: 0, count: length]]; END; PascalRESET: UNSAFE PROCEDURE [ file: PascalFilePtr, length: CARDINAL, element: LONG POINTER -- TO ARRAY[0..length/2) OF UNSPECIFIED --]; PascalREWRITE: PROCEDURE [ file: PascalFilePtr, length: CARDINAL _ 0, element: LONG POINTER -- TO ARRAY[0..length/2) OF UNSPECIFIED -- _ NIL]; <> <> PascalRead, PascalReadLong: UNSAFE PROCEDURE [ file: PascalFilePtr, length: CARDINAL, element: LONG POINTER -- TO ARRAY[0..length/2) OF UNSPECIFIED --, item: LONG POINTER -- TO ARRAY[0..length/2) OF UNSPECIFIED --] = UNCHECKED INLINE BEGIN IF length = 1 THEN item^ _ element^ ELSE PrincOpsUtils.LongCopy[from: element, nwords: length/2, to: item]; PascalGET[file: file, length: length, element: element]; END; PascalWrite, PascalWriteLong: UNSAFE PROCEDURE [ file: PascalFilePtr, length: CARDINAL, element: LONG POINTER -- TO ARRAY[0..length/2) OF UNSPECIFIED --, item: LONG POINTER -- TO ARRAY[0..length/2) OF UNSPECIFIED --] = UNCHECKED INLINE BEGIN IF length = 1 THEN element^ _ item^ ELSE PrincOpsUtils.LongCopy[from: item, nwords: length/2, to: element]; PascalPUT[file: file, length: length, element: element]; END; PascalEOF: PROCEDURE [file: PascalFilePtr] RETURNS [BOOLEAN] = TRUSTED INLINE {RETURN[file.eof]}; <> PascalReadLn, PascalWriteLn: PROCEDURE [file: PascalTextFilePtr]; <> PascalReadInteger: PROCEDURE [file: PascalTextFilePtr] RETURNS [PascalInteger]; PascalWriteInteger: PROCEDURE [ file: PascalTextFilePtr, item: PascalInteger, fieldMinLength: PascalInteger _ -1]; PascalReadReal: PROCEDURE [file: PascalTextFilePtr] RETURNS [PascalReal]; PascalWriteReal: PROCEDURE [ file: PascalTextFilePtr, item: PascalReal, fieldMinLength, fracLength: PascalInteger _ -1]; PascalReadChar: PROCEDURE [file: PascalTextFilePtr] RETURNS [PascalChar]; PascalWriteChar: PROCEDURE [ file: PascalTextFilePtr, item: PascalChar, fieldMinLength: PascalInteger _ -1]; PascalReadBoolean: PROCEDURE [file: PascalTextFilePtr] RETURNS [PascalBoolean]; PascalWriteBoolean: PROCEDURE [ file: PascalTextFilePtr, item: PascalBoolean, fieldMinLength: PascalInteger _ -1]; PascalReadArrayOfChar, PascalReadLongArrayOfChar: UNSAFE PROCEDURE [ file: PascalTextFilePtr, item: CharArrayPtr, arrayBound: PascalInteger]; PascalWriteArrayOfChar, PascalWriteLongArrayOfChar: PROCEDURE [ file: PascalTextFilePtr, item: CharArrayPtr, arrayBound: PascalInteger, fieldMinLength: PascalInteger _ -1]; <> <> <> <> PascalWriteString, PascalWriteLongString: PROCEDURE [ file: PascalTextFilePtr, item: ROPE, fieldMinLength: PascalInteger _ -1]; <

> <<(and hence, intended to be called as external procedures by the Pascal>> <> <> PascalOpenTextFileWithStream: UNSAFE PROCEDURE [ file: PascalTextFilePtr, stream: IO.STREAM]; <> PascalOpenTextFileTTYInput: UNSAFE PROCEDURE [ file: PascalTextFilePtr]; <> PascalOpenTextFileTTYOutput: UNSAFE PROCEDURE [ file: PascalTextFilePtr]; <> PascalCloseTextFile: UNSAFE PROCEDURE [file: PascalTextFilePtr]; <> <> <> PascalOpenFileWithStream: UNSAFE PROCEDURE [ file: PascalFilePtr, stream: IO.STREAM]; <> PascalCloseFile: UNSAFE PROCEDURE [file: PascalFilePtr]; <> <> END. -- PascalInlineFiles