-- TexIO.mesa -- last written by Doug Wyatt, January 3, 1980 1:56 PM DIRECTORY TexDefs: FROM "TexDefs", TexMathDefs: FROM "TexMathDefs", TexIODefs: FROM "TexIODefs", TexStringDefs: FROM "TexStringDefs" USING[AppendChar,AppendNumber], DisplayDefs: FROM "DisplayDefs" USING[SetFont], FontDefs: FROM "FontDefs" USING[FontHandle,CreateFont], ImageDefs: FROM "ImageDefs" USING[CleanupItem,CleanupMask,CleanupProcedure,AddCleanupProcedure], InlineDefs: FROM "InlineDefs" USING[LongMult,LongDiv,DIVMOD], SegmentDefs: FROM "SegmentDefs", StreamDefs: FROM "StreamDefs" USING[GetDefaultKey,GetDefaultDisplayStream]; TexIO: PROGRAM IMPORTS TexStringDefs, DisplayDefs,FontDefs,ImageDefs,InlineDefs,SegmentDefs,StreamDefs EXPORTS TexIODefs = BEGIN OPEN TexMathDefs,TexDefs,TexIODefs; in: StreamHandle; -- the current input stream out: StreamHandle; -- the current output stream disp: StreamHandle; -- the default display stream loc,dloc: CARDINAL; GetStream: PUBLIC PROCEDURE RETURNS[StreamHandle] = BEGIN RETURN[out] END; SetStream: PUBLIC PROCEDURE[stream: StreamHandle] = BEGIN IF out=disp THEN dloc_loc; out_stream; loc_0; END; UseDisplay: PUBLIC PROCEDURE = BEGIN out_disp; loc_dloc END; Wc: PUBLIC PROCEDURE[c: CHARACTER] = -- write a character BEGIN out.put[out,c]; IF c=CR THEN loc_0 ELSE loc_loc+1; END; Cr: PUBLIC PROCEDURE = BEGIN Wc[CR] END; -- write a carriage return Sp: PUBLIC PROCEDURE = BEGIN Wc[SP] END; -- write a space esc: CHARACTER_'\; SetEsc: PUBLIC PROCEDURE[c: CHARACTER] = BEGIN esc_c END; -- set esc Esc: PUBLIC PROCEDURE = BEGIN Wc[esc] END; -- write the escape char Loc: PUBLIC PROCEDURE RETURNS[CARDINAL] = -- return the current location BEGIN RETURN[loc] END; Tab: PUBLIC PROCEDURE[tloc: CARDINAL] = -- tab over to location tloc BEGIN WHILE loc BEGIN clearChar[out,oldc]; loc_loc-1 END; ENDCASE => Wc[c]; END; Appnd: PROCEDURE[c: CHARACTER] = --INLINE-- BEGIN TexStringDefs.AppendChar[s,c]; Wc[c]; END; c _ in.get[in]; s.length _ 0; UNTIL c=CR DO SELECT c FROM DEL,ControlH => -- clear character IF s.length>0 THEN BEGIN Clear[c, s[s.length-1]]; s.length _ s.length-1 END; ControlW => -- clear word BEGIN -- text to be backed up is of the form -- ...
  • ; the and are to be removed. i: CARDINAL; state: {ti, v, li} _ ti; FOR i DECREASING IN [0..s.length) DO SELECT s[i] FROM IN['A..'Z],IN['a..'z],IN['0..'9] => IF state=ti THEN state_v; ENDCASE => IF state=v THEN state_li; IF state = li THEN GO TO Done; Clear[ControlH, s[i]]; REPEAT Done => s.length _ i+1; FINISHED => s.length _ 0; ENDLOOP; END; ControlX => -- clear line BEGIN WITH out SELECT FROM Display => BEGIN clearCurrentLine[out]; loc_0 END; ENDCASE => Wc[c]; s.length _ 0; END; -- ControlV => Appnd[in.get[in]]; ENDCASE => Appnd[c]; c _ in.get[in]; ENDLOOP; END; -- initialization font: FontDefs.FontHandle_NIL; GetTexFont: PROCEDURE[name: STRING] = BEGIN OPEN SegmentDefs; fh: FileHandle; seg: FileSegmentHandle; fh_NewFile[name, Read, OldFileOnly !FileNameError => GOTO NotThere]; seg_NewFileSegment[fh, DefaultBase, DefaultPages, Read]; font_FontDefs.CreateFont[seg]; EXITS NotThere => RETURN; END; IOCleanupItem: ImageDefs.CleanupItem _ [link:, proc: IOCleanupProc, mask: ImageDefs.CleanupMask[Restore]]; IOCleanupProc: ImageDefs.CleanupProcedure = BEGIN SELECT why FROM Restore => IF font#NIL THEN DisplayDefs.SetFont[font]; ENDCASE; END; IOInit: PROCEDURE = BEGIN in_StreamDefs.GetDefaultKey[]; out_disp_StreamDefs.GetDefaultDisplayStream[]; loc_dloc_0; GetTexFont["TexFont.al"]; ImageDefs.AddCleanupProcedure[@IOCleanupItem]; IOCleanupProc[Restore]; END; IOInit; END.