-- 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 OPEN
IODefs, 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.