-- 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. (635)\89b9B630b10B9b36B171b8B399i3I796i11I59i13I61i8I580b7B221b6B