-- file: ChollaStepListParse.mesa -- edited by Barth, August 17, 1981 2:08 AM -- edited by Brotz, February 26, 1982 11:31 AM -- edited by Crowther, October 8, 1981 11:08 AM DIRECTORY AltoFileDefs, Ascii, ccD: FROM "ChollaCmdDefs", intCommon, inD: FROM "InteractorDefs", opD: FROM "OperationsDefs", ovD: FROM "OverviewDefs", vmD: FROM "VirtualMgrDefs"; ChollaStepListParse: PROGRAM IMPORTS ccD, intC: intCommon, vmD EXPORTS ccD = BEGIN -- The general form of a step string (for now, in the Subject: field) is: -- / / ! ( : , ... ) ; ! -- -- for example, -- Started Pre-Ox ! 4 (Time : 420, Temp : 30) ; Pre-Ox-Temp ! 3 -- -- blanks and comments enclosed by /'s may appear anywhere between words. -- ! , parameters, and ; are optional. -- more or less BNF for complete step list -- ::= <<!>>* -- ::= [][] -- [] -- ::= -- ::= [] -- ::= "Started", "InProgress", "NotStarted", "ProcessDone", -- "Finished", "Rejected" -- ::= [] "/" >* "/" -- ::= [][][] -- ::= <!>* -- ::= ! -- ::= * -- ::= ! -- ::= ";" ! "!" ! "(" ! "/" ! ! ":" -- ::= [] "!" [] -- ::= [] "(" [<[] "," >*] ")" -- ::= [][] ":" [] -- ::= >* -- ::= [] ";" [][] -- ::= [] "/" [>] -- -- White space in a name is compressed into the canonical form of a -- single space. Leading and trailing space is removed completely. cherry: CHARACTER = Ascii.ControlC; ParseStep: PUBLIC PROCEDURE [s: STRING, p: ccD.ParsedStepPtr] = BEGIN GetItem: PROCEDURE [st: STRING] RETURNS [v: CARDINAL] = -- Fills in st with the next name encountered in s, and returns the version following this -- name in v. If no valid name is found, st.length will remain 0. BEGIN inVersion: BOOLEAN _ FALSE; char: CHARACTER; st.length _ 0; v _ 0; UNTIL i >= end DO SELECT char _ s[i] FROM '; => {i _ i + 1; RETURN}; '! => inVersion _ TRUE; '/ => IF st.length > 0 THEN RETURN ELSE FOR i _ i + 1, i + 1 UNTIL i >= end OR s[i] = '/ DO ENDLOOP; '( => {p.paramIndex _ i; FOR i _ i + 1, i+1 UNTIL i >= end OR s[i] = ') DO ENDLOOP}; IN ['0 .. '9] => IF inVersion THEN v _ v * 10 + (char - '0) ELSE IF st.length < st.maxlength THEN {st[st.length] _ char; st.length _ st.length + 1}; IN ['a .. 'z], IN ['A .. 'Z], '+, '-, '., '$ => IF ~inVersion AND st.length < st.maxlength THEN {st[st.length] _ char; st.length _ st.length + 1}; ENDCASE; i _ i + 1; ENDLOOP; END; -- of GetItem -- GetStatus: PROCEDURE = BEGIN char: CHARACTER; st: STRING _ [15]; st.length _ 0; UNTIL i >= end DO SELECT char _ s[i] FROM '/ => {i _ i + 1; EXIT}; IN ['A .. 'Z], IN ['a .. 'z] => IF st.length < st.maxlength THEN {st[st.length] _ char; st.length _ st.length + 1}; ENDCASE; i _ i + 1; ENDLOOP; p.status _ ccD.StringToStatus[st]; END; -- of GetStatus -- GetStepName: PROCEDURE = -- Fills in p.stepName with the characters exclusive of *'s until the next slash. BEGIN st: STRING = p.stepName; char: CHARACTER; UNTIL i >= end DO SELECT char _ s[i] FROM '/ => {i _ i + 1; RETURN}; ccD.stepListMarkChar, Ascii.SP, Ascii.TAB, Ascii.ControlY => NULL; ENDCASE => IF st.length < st.maxlength THEN {st[st.length] _ char; st.length _ st.length + 1}; i _ i + 1; ENDLOOP; END; -- of GetStepName -- i: CARDINAL _ 0; end: CARDINAL = s.length; p.specVersion _ p.dataVersion _ 0; p.specName.length _ p.dataName.length _ p.stepName.length _ 0; FOR i _ end, i - 1 UNTIL i = 0 OR s[i - 1] = opD.substringSeparator DO ENDLOOP; p.statusIndex _ i; p.paramIndex _ 0; GetStatus[]; IF i >= end THEN RETURN; GetStepName[]; p.specVersion _ GetItem[p.specName]; p.dataVersion _ GetItem[p.dataName]; END; -- of ParseStep -- StatusOfTOCEntry: PUBLIC PROCEDURE [toc: vmD.TOCHandle, key: CARDINAL, index: vmD.TOCIndex, status: STRING] = BEGIN tocString: STRING _ [opD.maxTOCStringLength]; i: CARDINAL _ 0; char: CHARACTER; vmD.GetTOCString[toc, key, index, tocString]; FOR i _ tocString.length, i - 1 UNTIL i = 0 OR tocString[i - 1] = opD.substringSeparator DO ENDLOOP; status.length _ 0; FOR i IN [i .. tocString.length) DO SELECT char _ tocString[i] FROM '/ => EXIT; Ascii.SP, Ascii.TAB => NULL; ENDCASE => IF status.length < status.maxlength THEN {status[status.length] _ char; status.length _ status.length + 1}; ENDLOOP; END; -- of StatusOfTOCEntry -- END. -- of ChollaStepListParse --(635)\f1