DIRECTORY FS, IO, Rope; STF: PROGRAM IMPORTS FS, IO, Rope = { STREAM: TYPE = IO.STREAM; ROPE: TYPE = Rope.ROPE; SilBlock: TYPE = MACHINE DEPENDENT RECORD [ macroCode(0): INTEGER, state(1:0..3): [0..17B], xMin(1:4..15): [0..7777B], yMin(2): INTEGER, color(3:0..3): [0..17B], xMax(3:4..15): [0..7777B], font(4:0..2): [0..7B], bold(4:3..3): BOOLEAN, italic(4:4..4): BOOLEAN, yMax(4:5..15): [0..3777B]]; isLine: [0..7B] = 7B; PutWord: PROC [st: STREAM, w: CARDINAL] = { tb: RECORD [SELECT OVERLAID * FROM bb => [b1, b2: CHAR], cc => [c: CARDINAL], ENDCASE]; tb.c _ w; st.PutChar[tb.b1]; st.PutChar[tb.b2]}; minX: CARDINAL _ 10; minY: CARDINAL _ 10; maxX: CARDINAL _ 550; maxY: CARDINAL _ 750; dx: CARDINAL _ 150; dy: CARDINAL _ 10; dy2: CARDINAL _ 8; x: CARDINAL _ minX; y: CARDINAL _ minY; st: STREAM; silPassword: CARDINAL = 34562B; PageFull: SIGNAL = CODE; StartSilFile: PROC [file: ROPE] = { st _ FS.StreamOpen[fileName: file, accessOptions: $create]; PutWord[st, silPassword]; x _ minX; y _ minY}; EndSilFile: PROC = {st.Close[]}; NextColumn: PROC = { y _ minY; x _ x + dx; IF x > maxX THEN SIGNAL PageFull}; WriteSilRope: PROC [r: ROPE] = { length: CARDINAL _ r.Length[]; sb: SilBlock _ [ macroCode: -1, state: 0, xMin: TRASH, yMin: TRASH, color: 0, xMax: TRASH, font: 0, bold: FALSE, italic: FALSE, yMax: TRASH]; sb.xMin _ x; sb.yMin _ y; sb.xMax _ x + dx; sb.yMax _ y + dy; st.UnsafePutBlock[[base: LOOPHOLE[LONG[@sb]], startIndex: 0, count: 2*SIZE[SilBlock]]]; st.PutChar[VAL[length]]; st.PutRope[r]; IF length MOD 2 = 0 THEN st.PutChar[0C]; y _ y + dy; }; OpenFile: PROC [name: ROPE] RETURNS [st: STREAM] = { st _ FS.StreamOpen[name, $read ! FS.Error => IF error.group # bug THEN CONTINUE]}; WriteEntireFile: PROC [from, to: ROPE] = { in: STREAM _ OpenFile[from]; rl: ROPE; RPrint: PROC [lines: LIST OF ROPE] = { IF lines.rest # NIL THEN RPrint[lines.rest]; WriteSilRope[lines.first]}; StartSilFile[to]; DO ENABLE IO.EndOfStream, PageFull => EXIT; entry: LIST OF ROPE _ NIL; n: CARDINAL _ 0; IF in.EndOf[] THEN EXIT; DO -- until blank line ENABLE IO.EndOfStream => EXIT; rl _ in.GetLineRope[]; IF rl.Length[] = 0 THEN EXIT; entry _ CONS[rl, entry]; n _ n + 1; ENDLOOP; IF y + n*dy > maxY THEN NextColumn[]; IF n # 0 THEN RPrint[entry]; y _ y + dy2; ENDLOOP; in.Close[]; st.Close[]; }; }. 6STF.mesa Sweet November 30, 1985 9:56:15 pm PST Κ˜šœ™Icode™&—šΟk ˜ Jš˜Jš˜Jšœ˜J˜—š œœœœœ ˜%Jšœœœœ˜Jšœœœ˜š œ œœ œœ˜+Jšœœ˜J˜J˜Jšœ œ˜J˜J˜J˜Jšœœ˜Jšœœ˜J˜—J˜J˜šΟnœœœœ˜+Jšœœœœœœ œœ˜WJ˜ J˜&—J˜Jšœœ˜Jšœœ˜Jšœœ˜Jšœœ˜Jšœœ˜Jšœœ˜Jšœœ˜Jšœœ˜Jšœœ˜Jšœœ˜ Jšœ œ ˜Jšœ œœ˜J˜šž œœœ˜#Jšœœ4˜;J˜J˜J˜—Jšž œœ˜ J˜šž œœ˜Jšœœ œœ ˜8—J˜šž œœœ˜ Jšœœ˜˜J˜J˜ Jšœœ˜ Jšœœ˜ J˜ Jšœœ˜ J˜Jšœœ˜ Jšœœ˜Jšœœ˜ —J˜ J˜ J˜#Jšœœœ œ ˜WJšœ œ ˜Jšœ˜Jšœœœ˜(J˜ J˜—J˜š žœœœœœ˜4šœœ˜Kš œœ œœœ˜3—K˜—šžœœ œ˜*Jšœœ˜Jšœœ˜ š žœœ œœœ˜&Jšœœœ˜,J˜—J˜š˜Jšœœœ˜(Jš œœœœœ˜Jšœœ˜Jšœ œœ˜šœΟc˜Jšœœœ˜J˜Jšœ ˜Jšœœ ˜J˜ Jšœ˜—Jšœœ˜%Jšœœ˜J˜ Jšœ˜—J˜J˜—J˜——…—  T