-- N.Wirth June 1, 1977 -- S.Andler August 24, 1977 10:52 PM DIRECTORY AltoFileDefs: FROM "AltoFileDefs", InlineDefs: FROM "InlineDefs", IODefs: FROM "IODefs", SegmentDefs: FROM "SegmentDefs", StreamDefs: FROM "StreamDefs", StringDefs: FROM "StringDefs", SystemDefs: FROM "SystemDefs", TeleSilDefs: FROM "TeleSilDefs"; DEFINITIONS FROM StreamDefs, -- StreamHandle, CreateWordStream, ReadBlock, -- WriteBlock, destroy, get, put, endof SegmentDefs, -- FileHandle, InsertFile, Read, Write, Append TeleSilDefs; -------------------------------------------------------------------- TeleSilIO: PROGRAM= BEGIN -- External procedures -- -- From an unknown! package -- DirectoryLookup: EXTERNAL PROCEDURE [POINTER TO AltoFileDefs.FP, STRING, BOOLEAN] RETURNS[BOOLEAN]; -- From TeleSilDisplay -- Confirm: EXTERNAL PROCEDURE RETURNS[BOOLEAN]; Error: EXTERNAL PROCEDURE[s: STRING]; FontLoaded: EXTERNAL PROCEDURE[n: CARDINAL] RETURNS[BOOLEAN]; FontName: EXTERNAL PROCEDURE[fontno: FontNumber] RETURNS[STRING]; GetString: EXTERNAL PROCEDURE[s: STRING, fno: CARDINAL, ch: CHARACTER] RETURNS[CARDINAL, CARDINAL]; -- From TeleSilMain -- AllocateObject: EXTERNAL PROCEDURE[kind: ObjKind]; Rover: EXTERNAL PROCEDURE RETURNS[POINTER TO ObjPtr]; IsLetter: PROCEDURE[ch: CHARACTER] RETURNS[BOOLEAN]= BEGIN RETURN [ch IN ['a..'z] OR ch IN ['A..'Z]] END; -------------------------------------------------------------------- -- INPUT/OUTPUT -- defines Input, InputFile, Output, OutputFile, DefaultExtension FileCodeWord: CARDINAL= 31459; fileName: STRING _ [40]; FileObject: TYPE= MACHINE DEPENDENT RECORD[ kind: ObjKind, state: ObjState, specifics: [0..7], -- shade for area, fontno for text zone: Zone, dummy: WORD]; Input: PUBLIC PROCEDURE= BEGIN OPEN IODefs; old: BOOLEAN; sh: StreamHandle; fh: FileHandle; fp: AltoFileDefs.FP; eof: BOOLEAN _ FALSE; EndOfFile: PROCEDURE RETURNS[BOOLEAN]= BEGIN RETURN[eof] END; GetWord: PROCEDURE RETURNS[WORD]= BEGIN eof _ sh.endof[sh]; RETURN[IF eof THEN 0 ELSE sh.get[sh]] END; GetBlock: PROCEDURE[address: POINTER, words: INTEGER]= BEGIN eof _ sh.endof[sh]; IF eof THEN RETURN; []_ReadBlock[sh, address, words] END; WriteString["File: "]; ReadID[fileName]; DefaultExtension[fileName, "telesil"]; WriteLine[""]; old _ DirectoryLookup[@fp, fileName, FALSE]; IF NOT old THEN BEGIN Error["File not found"]; RETURN END ; fh _ InsertFile[@fp, Read]; sh _ CreateWordStream[fh, Read]; InputFile[EndOfFile, GetWord, GetBlock]; sh.destroy[sh] END; InputFile: PUBLIC PROCEDURE[ EndOfFile: PROCEDURE RETURNS[BOOLEAN], GetWord: PROCEDURE RETURNS[WORD], GetBlock: PROCEDURE[address: POINTER, words: INTEGER]]= BEGIN n: CARDINAL; ppObj: POINTER TO ObjPtr _ Rover[]; fileObj: FileObject; IF GetWord[]#FileCodeWord THEN Error["Not a picture file"] ELSE DO GetBlock[@fileObj, SIZE[FileObject]]; IF EndOfFile[] THEN EXIT; AllocateObject[fileObj.kind]; ppObj.zone _ fileObj.zone; ppObj.state _ fileObj.state; WITH ppObj^ SELECT FROM area => shade _ fileObj.specifics; text => BEGIN fontno _ fileObj.specifics; n _ GetWord[]; str _ SystemDefs.AllocateHeapString[n]; str.length _ n; IF NOT FontLoaded[fontno] THEN fontno _ 0; GetBlock[str+2, StringDefs.WordsForString[n]-2] END; ENDCASE; ENDLOOP; END; Output: PUBLIC PROCEDURE= BEGIN OPEN IODefs; old: BOOLEAN; sh: StreamHandle; fh: FileHandle; fp: AltoFileDefs.FP; PutWord: PROCEDURE[word: WORD]= BEGIN sh.put[sh, word] END; PutBlock: PROCEDURE[address: POINTER, words: INTEGER]= BEGIN [] _ WriteBlock[sh, address, words] END; WriteString["File: "]; ReadID[fileName]; DefaultExtension[fileName, "telesil"]; WriteLine[""]; old _ DirectoryLookup[@fp, fileName, TRUE]; IF old THEN BEGIN WriteString["Existing file"]; IF NOT Confirm[] THEN RETURN END; fh _ InsertFile[@fp, Write+Append]; sh _ CreateWordStream[fh, Write+Append]; OutputFile[PutWord, PutBlock]; sh.destroy[sh] END; OutputFile: PUBLIC PROCEDURE[ PutWord: PROCEDURE[word: WORD], PutBlock: PROCEDURE[address: POINTER, words: INTEGER]]= BEGIN n: CARDINAL; rover: ObjPtr _ Rover[]^; stop: ObjPtr _ rover; fileObj: FileObject; PutWord[FileCodeWord]; IF rover#NIL THEN DO IF rover.state#dead THEN BEGIN fileObj.kind _ rover.kind; fileObj.state _ rover.state; fileObj.specifics _ WITH rover SELECT FROM area => shade, text => fontno, ENDCASE => 0; fileObj.zone _ rover.zone; fileObj.dummy _ 0; PutBlock[@fileObj, SIZE[FileObject]]; WITH rover SELECT FROM text => BEGIN n _ str.length; PutWord[n]; PutBlock[str+2, StringDefs.WordsForString[n]-2] END; ENDCASE; END; IF (rover _ rover.next)=stop THEN EXIT ENDLOOP; END; DefaultExtension: PUBLIC PROCEDURE[fileName, extension: STRING]= BEGIN -- check if fileName has an extension, otherwise extend it i: CARDINAL; FOR i IN [0..fileName.length) DO IF fileName[i]='. THEN RETURN ENDLOOP; StringDefs.AppendString[fileName, "."]; IODefs.WriteString["."]; StringDefs.AppendString[fileName, extension]; IODefs.WriteString[extension] END; -------------------------------------------------------------------- -- HARDCOPY: Generate press format file -- defines HardCopy HardCopy: PUBLIC PROCEDURE= BEGIN OPEN InlineDefs, -- BITAND, BITOR, BITSHIFT IODefs; scale: CARDINAL= 35; -- 35 micas per unit length i, k, k1, pad: CARDINAL; n: CARDINAL _ 0; -- no. of words written even: BOOLEAN _ TRUE; -- no. of bytes written is even buf: UNSPECIFIED; old: BOOLEAN; rover: ObjPtr _ Rover[]^; stop: ObjPtr _ rover; sh: StreamHandle; fh: FileHandle; fp: AltoFileDefs.FP; PartDirPageNo, FontDirPageNo: CARDINAL; fchar: CHARACTER; fname: STRING; ch: CHARACTER; hardCopyFileName: STRING _ [40]; PW: PROCEDURE[w: UNSPECIFIED]= BEGIN -- write one word on file IF even THEN sh.put[sh, w] ELSE BEGIN sh.put[sh, BITOR[BITSHIFT[buf,8], BITSHIFT[w,-8]]]; buf _ BITAND[w, 377B] END; n _ n+1 END; PB: PROCEDURE[b: UNSPECIFIED]= BEGIN -- write one byte on wordfile IF even THEN buf _ b ELSE BEGIN sh.put[sh, BITOR[BITSHIFT[buf,8], b]]; n _ n+1 END; even _ NOT even END; Fill: PROCEDURE= BEGIN N: CARDINAL _ 0; IF NOT even THEN PB[0]; WHILE N