STF.mesa
Sweet November 30, 1985 9:56:15 pm PST
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 ROPENIL;
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[];
};
}.