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]; 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 2file: PascalInlineFiles.mesa last modified by Ramshaw, December 25, 1982 11:00 am written by McCreight, November 17, 1980 3:13 PM a thin layer of Pascal files on top of IO.STREAM just like the wizardFiles, except that common procs are herein INLINE T Y P E S P R O C E D U R E S Called by PasMesa Text File Operations: Binary File Operations: The "length" argument is in units of bytes rather than words, but the only odd value that will ever arise is 1. The Pascal program generates these arguments by utilizing a little-known feature of the SIZE operator in Mesa: if you say SIZE[T, 2], you get back the size in words of a packed array of 2 T's. The latter two arguments don't mean anything, and are just included since PasMesa prefers to generate them. formatted IO for text files reads up to or writes a CR At this point, McCreight included the following ReadString routines, but I don't see how they could ever arise, nor do I see how to make them safe. PascalReadString, PascalReadLongString: PROCEDURE [file: PascalTextFilePtr, item: LONG POINTER TO ??ROPE??]; P R O C E D U R E S NOT Called by PasMesa (and hence, intended to be called as external procedures by the Pascal program, or else from Mesa code that implements such external procedures). text file operations Allocates a new MesaFile and installs the specified stream Allocates a new MesaFile and sets up file to read from the terminal (no pre-read) Allocates a new MesaFile and sets up file to output to the terminal Closes the file, and sets the PascalFile to NIL; the MesaFile must continue to exist however, to avoid collecting non-garbage. binary file operations Allocates a new MesaFile and installs the specified stream Closes the file, and sets the PascalFile to NIL; the MesaFile must continue to exist however, to avoid collecting non-garbage. ʲ˜Jšœ™Jšœ4™4Jšœ0™0J˜Jšœ0™0JšœE™EJ˜šÏk ˜ Jšœœ ˜Jšœ˜J˜ Jšœœ ˜J˜—Jš œœ œœ œ˜H˜Jšœœ ˜J˜Jšœ ™ J˜Jš œ œœœœ œ˜2Jš œœœœœÏc'˜ZJ˜šœ œœ˜Jšœœœœ˜Jšœœœ˜Jšœœ˜!—Jšœ œœ ˜!J˜šœœœ˜J˜Jšœœœž-˜CJšœž˜/J˜—Jš œœœœœž˜QJ˜Jšœœ˜J˜J˜Jšœ'™'J˜—Jšœ™˜JšÏnœ œ˜5J˜šŸ œ œœ˜CJš˜˜+Jšœœœ˜—šœ˜šœžœ˜Jšœ œ˜%—Jšœœ˜—š˜šœ˜Jšœ œ˜%J˜——Jšœ˜J˜—šŸœ œ˜6Jšœœ˜%Jš˜Jšœ˜Jšœ˜J˜—šŸ œ œœ˜CJš˜J˜(Jšœ˜J˜—JšŸœ œ˜5J˜JšŸœ œ˜7J˜šŸœ œ˜—JšœH˜LJšœ˜J˜—šŸ œœ œ˜Jšœœ˜&Jšœ œœž*œ˜BJ˜—šŸ œ œ˜Jšœœ˜*Jš œ œœž*œœ˜H——JšœQ™QJšœ™˜šŸ œŸœœ œ˜.Jšœœ˜&Jšœ œœž*œ˜AJš œœœž*œ œ˜QJš˜šœ œ˜#JšœC˜G—J˜8Jšœ˜J˜—šŸ œŸœœ œ˜0Jšœœ˜&Jšœ œœž*œ˜AJš œœœž*œ œ˜QJš˜šœ œ˜#JšœC˜G—J˜8Jšœ˜J˜—š Ÿ œ œœœœ˜MJšœœ ˜J˜——Jšœ™˜šœŸ œ œ˜BJšœ™J˜—JšŸœ œœ˜OJ˜šŸœ œ˜J˜-J˜$J˜—JšŸœ œœ˜IJ˜šŸœ œ˜J˜*J˜0J˜—JšŸœ œœ˜IJ˜šŸœ œ˜J˜OJ˜—JšŸœ œœ˜OJ˜šŸœ œ˜J˜-J˜$J˜—šœŸœœ œ˜DJ˜J˜J˜J˜—šœŸœ œ˜?J˜J˜J˜?J˜——JšœT™TJšœ>™>Jšœ'™'JšœD™D˜šœŸœ œ˜5Jšœœ&˜IJ˜J˜J˜—Jšœ,™,JšœF™FJšœJ™JJ˜—Jšœ™˜šŸœœ œ˜0J˜Jšœœœ˜Jšœ:™:J˜—šŸœœ œ˜.J˜JšœQ™QJ˜—šŸœœ œ˜/J˜JšœC™CJ˜J˜—šŸœœ œ˜BJšœC™CJšœ<™