--File CIFControl.Mesa
-- April 1980 by MN
--
Last changed: November 5, 1981 10:34 AM

DIRECTORY

CIFControlDefs: FROM "CIFControlDefs",
CIFOutputDefs: FROM "CIFOutputDefs" USING [NewPlot, DonePlot, OutWindow],
IntDefs: FROM "IntDefs" USING[InitInterpreter, FinishInterpreter,
Instantiate],
IODefs: FROM "IODefs" USING
[WriteLine, WriteNumber, NumberFormat],
StringDefs: FROM "StringDefs" USING [AppendString, AppendNumber],
ParserInputDefs: FROM "ParserInputDefs" USING[EndOfFile, InFromFile],
ParserErrorDefs: FROM "ParserErrorDefs" USING[ErrorSummary, ErrorType],
ParserDefs: FROM "ParserDefs" USING[InitParser, FinishParser, ParseStatement, CommandType],
OutputDefs: FROM "OutputDefs" USING [InitOutput, FinishOutput];

CIFControl: PROGRAM-- should add catch for ParserAbort
IMPORTS CIFOutputDefs, ParserInputDefs, ParserErrorDefs, ParserDefs, IntDefs, IODefs, StringDefs, OutputDefs
EXPORTS CIFControlDefs =

BEGIN OPEN CIFOutputDefs, IODefs;

ParseCIF: PUBLIC PROCEDURE[fileName: STRING] RETURNS[ok: BOOLEAN] =
--Parse CIF file and compile it
BEGIN
nStatements: CARDINAL ← 0;

IF ~ParserInputDefs.InFromFile[fileName] THEN
BEGIN OPEN StringDefs;
s: STRING ← [100];
AppendString[s,"Can’t find file: "];
AppendString[s,fileName];
WriteLine[s];
RETURN[FALSE];
END;

WHILE ~ParserInputDefs.EndOfFile[] AND ParserDefs.ParseStatement[] # End DO
nStatements ← nStatements+1;
IF (nStatements MOD 100) = 0 THEN
BEGIN
IODefs.WriteNumber[nStatements,
NumberFormat[base:10, zerofill:FALSE, unsigned:TRUE, columns:7]];
IF (nStatements MOD 1000) = 0 THEN IODefs.WriteLine[""];
END;
ENDLOOP;

IF (nStatements MOD 1000) # 0 THEN IODefs.WriteLine[""];

BEGIN OPEN ParserErrorDefs;
i: ErrorType;
s: STRING ← [100];
count,total: CARDINAL ← 0;
errorCounts: ARRAY ErrorType[FIRST[ErrorType]..LAST[ErrorType]] OF CARDINAL;

errorCounts ← ErrorSummary[];

FOR i IN ErrorType[FIRST[ErrorType]..LAST[ErrorType]] DO
total ← total + errorCounts[i];
ENDLOOP;
IF total > 0 THEN IODefs.WriteLine["
Summary of Errors Encountered"];

FOR i IN ErrorType[FIRST[ErrorType]..LAST[ErrorType]] DO
s.length ← 0;
SELECT i FROM
FatalSyntax => StringDefs.AppendString[s,"Fatal Syntax Errors:"];
FatalSemantic => StringDefs.AppendString[s,"Fatal Semantic Errors:"];
Advisory => StringDefs.AppendString[s,"Warnings:"];
ENDCASE =>
BEGIN
count ← count+errorCounts[i];
LOOP;
END;
StringDefs.AppendNumber[s,errorCounts[i],10];
IF errorCounts[i] > 0 THEN IODefs.WriteLine[s];
ENDLOOP;
IF count > 0 THEN
BEGIN
s.length ← 0;
StringDefs.AppendString[s,"Misc. Hose Jobs:"];
StringDefs.AppendNumber[s,count,10];
IODefs.WriteLine[s];
END;
END;

[] ← ParserDefs.FinishParser[];

IF ~ParserDefs.InitParser[] THEN-- ready for next call
BEGIN
WriteLine["InitParser Error"];
RETURN[FALSE];
END;

RETURN[TRUE];

END;

DrawCIF: PUBLIC PROCEDURE[left,right,bottom,top: LONG INTEGER] =
--Draw part of compiled CIF file that intersects given rectangle
BEGIN
NewPlot[];
OutWindow[left,right,bottom,top];
IntDefs.Instantiate[];
DonePlot[];
END;

EndCIF: PUBLIC PROCEDURE =
--Clear out compiled file to make ready for new ParseCif
BEGIN
[] ← IntDefs.FinishInterpreter[];
[] ← OutputDefs.FinishOutput[];

--reinitialize for next time
IF ~IntDefs.InitInterpreter[] THEN
BEGIN
WriteLine["InitInterpreter Error in EndCIF"];
RETURN;
END;

IF ~OutputDefs.InitOutput[] THEN
BEGIN
WriteLine["InitOutput Error in EndCIF"];
RETURN;
END;
END;

END.