DIRECTORY Atom, Convert, IO, IOUtils, RefText, Rope, TapeStreams, Translate; TapeFmtConversion: CEDAR PROGRAM IMPORTS Atom, Convert, IO, IOUtils, RefText, Translate SHARES TapeStreams = BEGIN FromANSIVariable: TapeStreams.Conversion = BEGIN s _ IO.CreateStream[ streamProcs: IO.CreateStreamProcs[ variety: input, class: $FromANSIVariable, getChar: ANSIGetChar], streamData: NEW[ANSIInRec _ []], backingStream: base]; END; ANSIInRec: TYPE = RECORD [ charsToCR: INT _ -1 ]; ANSIIn: TYPE = REF ANSIInRec _ NIL; ANSIGetChar: PROC [ self: IO.STREAM ] RETURNS [ CHAR ] = BEGIN a: ANSIIn = NARROW[self.streamData]; DO SELECT (a.charsToCR _ a.charsToCR-1) FROM > -1 => RETURN[IO.GetChar[self.backingStream]]; = -1 => RETURN['\n]; ENDCASE => BEGIN t: REF TEXT = NEW[TEXT[4]]; c: CHAR; FOR c _ IO.GetChar[self.backingStream], IO.GetChar[self.backingStream] WHILE NOT c IN ['0..'9] DO -- skip over interblock padding IF c # '^ THEN ERROR; -- is padding always '^ ? ENDLOOP; t.length _ 4; t[0] _ c; FOR i: INT IN [1..3] DO t[i] _ IO.GetChar[self.backingStream] ENDLOOP; a.charsToCR _ Convert.IntFromRope[RefText.TrustTextAsRope[t]]-4; END; ENDLOOP; END; ToANSIVariable: TapeStreams.Conversion = BEGIN blockSize: INT _ 80; streamData: ANSIOut _ NEW[ANSIOutRec _ [ flushBlockBacking: NARROW[IOUtils.LookupProc[base, $FlushBlock], REF TapeStreams.FlushBlockProc]^]]; FOR prev: IO.STREAM _ base, prev.backingStream WHILE prev # NIL DO WITH prev.streamData SELECT FROM t: TapeStreams.TapeStreamState => {blockSize _ t.blockSize; EXIT}; ENDCASE => NULL; ENDLOOP; streamData.buf _ NEW[TEXT[blockSize-4]]; streamData.buf.length _ 0; s _ IO.CreateStream[ streamProcs: IO.CreateStreamProcs[ variety: output, class: $ToANSIVariable, putChar: ANSIPutChar, flush: ANSIFlush], streamData: streamData, backingStream: base]; END; ANSIOutRec: TYPE = RECORD [ flushBlockBacking: TapeStreams.FlushBlockProc _ NIL, buf: REF TEXT _ NIL ]; ANSIOut: TYPE = REF ANSIOutRec _ NIL; ANSIPutChar: PROC [ self: IO.STREAM, char: CHAR ] = BEGIN a: ANSIOut = NARROW[self.streamData]; SELECT char FROM '\n => BEGIN a.flushBlockBacking[self: self.backingStream, padChar: '^, bytesRequired: 4+a.buf.length]; self.backingStream.PutF["%04d%g", IO.int[4+a.buf.length], IO.text[a.buf]]; a.buf.length _ 0; END; ENDCASE => {a.buf[a.buf.length] _ char; a.buf.length _ a.buf.length+1}; END; ANSIFlush: PROC [ self: IO.STREAM ] = BEGIN a: ANSIOut = NARROW[self.streamData]; ANSIPutChar[self, ' ]; a.flushBlockBacking[self: self.backingStream, padChar: '^]; END; ANSIFlushBlock: PROC [ self: IO.STREAM, padChar: CHAR _ '\000, bytesRequired: INT _ LAST[INT], truncate: BOOL _ FALSE ] -- TapeStreams.FlushBlockProc -- = BEGIN a: ANSIOut = NARROW[self.streamData]; ERROR; -- I'm not quite sure what this operation means... END; ToPGT: TapeStreams.Conversion = BEGIN convert: TapeStreams.Conversion = Translate.AsciiToEbcdic[lrecl: 0].first^.proc; ebcdicBase: IO.STREAM = convert[base]; s _ IO.CreateStream[ streamProcs: IO.CreateStreamProcs[ variety: output, class: $ToPGT, putChar: PGTPutChar], streamData: NIL, backingStream: ebcdicBase]; END; PGTPutChar: PROC [ self: IO.STREAM, char: CHAR ] = BEGIN SELECT char FROM ' , '\n => NULL; ENDCASE => self.backingStream.PutChar[char]; END; pl: Atom.PropList _ NARROW[Atom.GetProp[$TapeTool, $Conversions]]; pl _ Atom.PutPropOnList[pl, $FromEbcdic, Translate.EbcdicToAscii[].first]; pl _ Atom.PutPropOnList[pl, $ToEbcdic, Translate.AsciiToEbcdic[].first]; pl _ Atom.PutPropOnList[pl, $ToPGT, NEW[TapeStreams.ConversionRecord _ [$ToPGT, ToPGT, NIL]]]; pl _ Atom.PutPropOnList[pl, $FromANSIVariable, NEW[TapeStreams.ConversionRecord _ [$FromANSIVariable, FromANSIVariable, NIL]]]; pl _ Atom.PutPropOnList[pl, $ToANSIVariable, NEW[TapeStreams.ConversionRecord _ [$ToANSIVariable, ToANSIVariable, NIL]]]; Atom.PutProp[$TapeTool, $Conversions, pl]; END. \TapeFmtConversion.mesa Last Edited by: McCreight, February 27, 1985 9:15:17 am PST Diebert, April 30, 1985 8:53:48 am PDT [ base: IO.STREAM , clientData: REF ANY _ NIL] RETURNS [ s: IO.STREAM ]; [ base: IO.STREAM , clientData: REF ANY _ NIL] RETURNS [ s: IO.STREAM ]; [ base: IO.STREAM , clientData: REF ANY _ NIL] RETURNS [ s: IO.STREAM ]; Κ ˜Jšœ™™;Icode™&—J˜šΟk ˜ Jšœœ1˜B—J˜š œœœœœœ˜lJš˜J˜šΟnœ˜0Iprocšœœœœœœœœœ™Hšœœ˜šœ œ˜"Lšœ˜Lšœ˜Lšœ˜—Lšœ œ˜ Lšœ˜—Jšœ˜J˜—šœ œœ˜Lšœ œ˜L˜—Lšœœœ œ˜#L˜š ž œœ œœœœ˜8Lš˜Lšœ œ˜$š˜šœ˜)Lšœœœ˜/Lšœœ˜šœ˜ Lš˜Lš œœœœœ˜Lšœœ˜šœœœœœœ œΟc˜JšœœœŸ˜/Jšœ˜—Jšœ ˜ Jšœ ˜ Jš œœœœœœ˜FJšœ@˜@Jšœ˜——Jšœ˜—Jšœ˜J˜J˜—L˜šžœ˜.Lšœœœœœœœœœ™HLšœ œ˜šœœ˜(Lšœœ(œ ˜d—š œœœœœ˜Bšœœ˜ Lšœ<œ˜BLšœœ˜—Lšœ˜—Lšœœœ˜(Lšœ˜šœœ˜šœ œ˜"Lšœ˜Lšœ˜Lšœ˜Lšœ˜—Lšœ˜Lšœ˜—Jšœ˜J˜—šœ œœ˜Lšœ0œ˜4Lšœœœ˜L˜—Lšœ œœœ˜%L˜š ž œœ œœœ˜3Lš˜Lšœ œ˜%šœ˜šœ˜Lš˜LšœZ˜ZLšœ"œœ˜JLšœ˜Lšœ˜—Lšœ@˜G—Jšœ˜J˜—šž œœ œœ˜%Lš˜Lšœ œ˜%Lšœ˜Lšœ;˜;Lšœ˜J˜—šžœœ œœ œœœœ œœŸ œ˜šJš˜Lšœ œ˜%LšœŸ2˜9Jšœ˜J˜J˜J˜—šžœ˜%Lšœœœœœœœœœ™HLšœP˜PLšœ œœ˜&šœœ˜šœ œ˜"Lšœ˜Lšœ˜Lšœ˜—Lšœ œ˜Lšœ˜—Jšœ˜J˜—š ž œœ œœœ˜2Lš˜šœ˜Lšœ œ˜Lšœ%˜,—Jšœ˜J˜—Jšœœ(˜BJšœJ˜JJšœH˜Hšœ#˜#Jšœ0œ˜:—šœ.˜.JšœFœ˜P—šœ,˜,JšœBœ˜L—Jšœ*˜*Jšœ˜——…—u