-- XDDOutModule.mesa Edited by -- Bruce on September 30, 1980 3:52 PM -- Mark on September 30, 1980 4:22 PM -- Evans on Aug 20, 1980 10:00 AM DIRECTORY Ascii USING [CR, SP], DebugFormat USING [LongSubString, NumberFormat], DebugOps USING [], DebugUsefulDefs USING [fileSW], DiskKDDefs USING [DiskFull], DOutput USING [], FileSW USING [GetFile], Format, Inline USING [LowHalf], IODefs USING [], StreamDefs USING [StreamHandle], Strings USING [String, SubString, SubStringDescriptor], TextSW USING [InsertChar, InsertString, InsertSubString, SetEOF], UserInput USING [userAbort]; DOutModule: PROGRAM IMPORTS DebugUsefulDefs, DiskKDDefs, FileSW, Format, Inline, TextSW, UserInput EXPORTS DebugOps, DebugUsefulDefs, DOutput, IODefs = PUBLIC BEGIN OPEN DebugFormat; UserAborted: PUBLIC SIGNAL = CODE; CallSapsford: ERROR [STRING] = CODE; -- DOutput newLine: BOOLEAN ← TRUE; DiskFull: PROC = { OPEN StreamDefs; s: StreamHandle ← FileSW.GetFile[DebugUsefulDefs.fileSW].s; WITH s SELECT FROM Disk => {index ← index - 1; size ← size - 1}; ENDCASE => ERROR CallSapsford["Can only reset a disk stream!"L]; TextSW.SetEOF[DebugUsefulDefs.fileSW,0]; EOL[]; Line["Disk full! Typescript reset to beginning."L]}; OutChar: PROC [c: CHARACTER] = BEGIN TextSW.InsertChar[DebugUsefulDefs.fileSW,c ! DiskKDDefs.DiskFull => GOTO mark]; EXITS mark => {DiskFull[]; TextSW.InsertChar[DebugUsefulDefs.fileSW,c]} END; NewLine: PROCEDURE RETURNS [BOOLEAN] = BEGIN RETURN[newLine] END; EOL: PROCEDURE = BEGIN IF ~newLine THEN OutChar[Ascii.CR]; newLine ← TRUE; END; Blanks: PROCEDURE [n: CARDINAL] = BEGIN THROUGH [0..n) DO OutChar[Ascii.SP] ENDLOOP; IF n # 0 THEN newLine ← FALSE; END; WriteChar, Char: PROCEDURE [c: CHARACTER] = {OutChar[c]; newLine ← c = Ascii.CR}; WriteString, Text: PROCEDURE [s: Strings.String] = BEGIN IF UserInput.userAbort THEN SIGNAL UserAborted; IF s.length # 0 THEN newLine ← s[s.length-1] = Ascii.CR; TextSW.InsertString[DebugUsefulDefs.fileSW,s ! DiskKDDefs.DiskFull => GOTO mark]; EXITS mark => {DiskFull[]; TextSW.InsertString[DebugUsefulDefs.fileSW,s]} END; SubString: PROCEDURE [s: Strings.SubString] = BEGIN IF UserInput.userAbort THEN SIGNAL UserAborted; IF s.length # 0 THEN newLine ← s.base[s.length-1] = Ascii.CR; TextSW.InsertSubString[DebugUsefulDefs.fileSW,LOOPHOLE[s] ! DiskKDDefs.DiskFull => GOTO mark]; EXITS mark => {DiskFull[]; TextSW.InsertSubString[DebugUsefulDefs.fileSW,LOOPHOLE[s]]} END; LongSubString: PROCEDURE [s: DebugFormat.LongSubString] = BEGIN ss: Strings.SubStringDescriptor ← [base: Inline.LowHalf[s.base], offset: s.offset, length: s.length]; SubString[@ss] END; WriteLine, Line: PROCEDURE [s: Strings.String] = BEGIN Text[s]; Char[Ascii.CR] END; WriteNumber, Number: PROCEDURE [n: UNSPECIFIED, f: NumberFormat] = BEGIN Format.Number[n,f, Text] END; LongNumber: PROCEDURE [n: LONG CARDINAL, f: NumberFormat] = BEGIN Format.LongNumber[n, f, Text]; END; WriteDecimal, Decimal: PROCEDURE [n: INTEGER] = {Format.Decimal[n,Text]}; WriteOctal, Octal: PROCEDURE [n: UNSPECIFIED] = {Format.Octal[n, Text]}; LongDecimal: PROCEDURE [n: LONG INTEGER] = {Format.LongDecimal[n, Text]}; LongOctal: PROCEDURE [n: LONG CARDINAL] = {Format.LongOctal[n, Text]}; END.