-- PROGRAM SifOutput
-- Updated to Mesa 6.0 - January 27, 1981 11:34 AM
-- Last edited - January 27, 1981 12:26 PM
DIRECTORY
SifGutsDefs: FROM "SifGutsDefs" USING [Point],
IODefs: FROM "IODefs" USING [WriteLine, CR],
SifCntrlToOut: FROM "SifCntrlToOut",
SifOutputDefs: FROM "SifOutputDefs",
StreamDefs: FROM "StreamDefs" USING [StreamHandle, NewByteStream, Write, Append],
SystemDefs: FROM "systemdefs",
StringDefs: FROM "stringdefs";
SifOutput : PROGRAM
IMPORTS IODefs, StringDefs, StreamDefs
EXPORTS SifCntrlToOut, SifOutputDefs
= BEGIN OPENIODefs, SifGutsDefs, StreamDefs, StringDefs;
fout : StreamHandle;
Nlayers: INTEGER = 8;
-- need some layer names for layer changes to CIF
InitOutput: PUBLIC PROCEDURE [file: STRING] =
BEGIN
fout ← NewByteStream[file, Write+Append];
END;
FinishOutput: PUBLIC PROCEDURE =
BEGIN
fout.destroy[fout];
END;
PutLong: PROCEDURE [x: LONG INTEGER] =
BEGIN
s: STRING ← [11];
s.length ← 0;
StringDefs.AppendLongDecimal[s,x];
PutString[s];
END;
PutChar: PROCEDURE [ch: CHARACTER] =
BEGIN
fout.put[fout, ch];
END;
PutString: PROCEDURE [string: STRING] =
BEGIN
i: CARDINAL;
FOR i IN [0..string.length)
DO PutChar[string[i]]; ENDLOOP;
END;
PutLine: PROCEDURE [string: STRING] =
BEGIN
PutString[string];
PutChar[CR];
END;
PutDefStart: PUBLIC PROCEDURE [num: INTEGER, xScale,yScale:LONG INTEGER, name: STRING] =
BEGIN
PutChar[CR];
PutString["DS "]; PutLong[num];
PutString[" "]; PutLong[xScale];
PutString[" "]; PutLong[yScale];
PutString["; "];
PutSymbolName[name];
END;
PutDefFinish: PUBLIC PROCEDURE =
BEGIN
PutLine["DF;"];
PutChar[CR];-- space to make it look neat
END;
PutComment: PUBLIC PROCEDURE[s: STRING] =
BEGIN -- puts a CIF comment
i: CARDINAL;
PutString["( "];
FOR i IN [0..s.length) DO
IF s[i]=’( THEN s[i] ← ’[ ;
IF s[i] = ’) THEN s[i] ← ’] ;
ENDLOOP;
PutString[s];
PutLine[" );"]
END;
PutLayer: PUBLIC PROCEDURE[l: STRING] =
BEGIN -- puts a CIF layer
PutString["L "];
PutString[l];
PutString["; "];
END;
PutBox: PUBLIC PROCEDURE [len,wid: LONG INTEGER, center: Point, angle: Point] =
BEGIN -- puts a CIF box
PutString["B L "];
PutLong[len]; PutString[" W "];
PutLong[wid]; PutString[" C "];
PutLong[center.x];
PutChar[’,];
PutLong[center.y];
IF angle # [LONG[1],LONG[0]] THEN BEGIN
PutString[" D "];
PutLong[angle.x]; PutString[" "]; PutLong[angle.y];
END;
PutLine[";"]
END;
PutCall: PUBLIC PROCEDURE [def:INTEGER, mirx,miry:BOOLEAN, rot:Point, trans:Point] =
BEGIN -- puts a CIF call
PutString["C "];
PutLong[def];
-- mirroring X in CIF means the same as mirror about Y axis in icarus
IF mirx THEN PutString[" M X"];
IF miry THEN PutString[" M Y"];
IF rot # [LONG[1],LONG[0]] THEN BEGIN
PutString[" R "]; PutLong[rot.x]; PutString[","]; PutLong[rot.y];
END;
IF trans.x # 0 OR trans.y # 0
THEN BEGIN
PutString[" T "];
PutLong[trans.x];
PutChar[’,];
PutLong[trans.y];
END;
PutLine[";"]
END;
PutName: PUBLIC PROCEDURE [x,y: LONG INTEGER, s: STRING] =
BEGIN -- output local extention 94, name a point
PutString["94 "];
PutString[s]; PutString[" "];
PutLong[x]; PutString[", "];
PutLong[y]; PutLine[";"];
END;
PutSymbolName: PROCEDURE [s: STRING] =
BEGIN -- output local extention 9, name a symbol unless null string
IF EqualString[s,""] THEN {
PutLine[""];
RETURN;
};
PutString["9 "]; PutString[s]; PutLine[";"];
END;
PutEnd: PUBLIC PROCEDURE =
BEGIN -- puts a CIF end
PutLine["End"]
END;
PutError: PUBLIC PROCEDURE [msg: STRING] =
BEGIN -- puts a CIF end
WriteLine[msg];
END;
END.