--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.