/* Removes trailing and leading blanks from the argument. */ %TRIM_BLANKS: PROCEDURE (Text) RETURNS (CHARACTER); DECLARE Text CHARACTER; DECLARE J FIXED; /* First remove trailing blanks. */ DO J = LENGTH(Text) TO 1 BY -1; IF SUBSTR(Text, J, 1) ^= ' ' THEN DO; Text = SUBSTR(Text, 1, J); /* Now remove leading blanks. */ DO J = 1 TO LENGTH(Text); IF SUBSTR(Text, J, 1) ^= ' ' THEN RETURN (SUBSTR(Text, J)); END; END; END; RETURN (''); %END TRIM_BLANKS; %ACTIVATE TRIM_BLANKS; /* Finds the position of the left-most letter in Text. */ /* It returns zero if there is no letter. */ %LETTER: PROCEDURE (Text) RETURNS (FIXED); DECLARE Text CHARACTER; DECLARE J FIXED; DO J = 1 TO LENGTH (Text); IF INDEX('ABCDEFGHIJKLMNOPQRSTUVWXYZ', SUBSTR(Text, J, 1)) > 0 THEN RETURN (J); END; RETURN (0); %END LETTER; %SEARCHING: PROCEDURE(String, Sub) RETURNS (FIXED); DECLARE (String, Sub) CHARACTER; DECLARE Ch CHARACTER; DECLARE (J, K) FIXED; DO J = 1 TO LENGTH(String); Ch = SUBSTR(String, J, 1); K = INDEX(Sub, Ch); IF K > 0 THEN RETURN (J); END; RETURN (0); %END SEARCHING; %INITIAL_VALUES: PROCEDURE (Specification); DECLARE Specification CHARACTER; DECLARE (Initial_Value, Final_Value, Increment, Control_Variable, Initial_Expression, Variable) CHARACTER; DECLARE (Ch, Temp, Temp2) CHARACTER; DECLARE (K, L, M, N, H) FIXED; DECLARE Trips FIXED; /* Convert to upper case. */ Specification = TRANSLATE (Specification, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); K = VERIFY(Specification, ' '); /* deblank. */ IF K > 0 THEN Specification = SUBSTR(Specification, K); K = INDEX (Specification, ' DO '); IF K = 0 THEN DO; NOTE ('Iterative specification must be of the form (J DO j = 10 to 20.', 8); RETURN; END; Initial_Expression = SUBSTR(Specification, 1, K); Specification = SUBSTR(Specification, K+3); /* Remove blanks from Initialization_Expression. */ Temp = ''; DO K = 1 TO LENGTH(Control_Variable); Ch = SUBSTR(Control_Variable, K, 1); IF Ch ^= ' ' THEN Temp = Temp || SUBSTR(Control_Variable, K, 1); END; Control_Variable = Temp; K = VERIFY(Specification, ' '); /* deblank. */ IF K > 0 THEN Specification = SUBSTR(Specification, K); K = INDEX (Specification, '='); IF K = 0 THEN DO; NOTE ('Equal sign expected.', 8); RETURN; END; Control_Variable = SUBSTR(Specification, 1, K-1); Specification = SUBSTR (Specification, K+1); /* Expect an initial value. */ K = VERIFY(Specification, ' '); /* deblank. */ IF K > 0 THEN Specification = SUBSTR(Specification, K); K = INDEX (Specification, ' TO '); IF K = 0 THEN DO; NOTE ('TO missing from initialization.', 8); RETURN; END; Initial_Value = SUBSTR(Specification, 1, K-1); Specification = SUBSTR(Specification, K+3); K = VERIFY(Specification, ' '); /* deblank. */ IF K > 0 THEN Specification = SUBSTR(Specification, K); Final_Value = Specification; NOTE ('CONTROL VARIABLE=' || Control_Variable || ' Initial_Expression=' || Initial_Expression || '*'); /* Check whether tihe initial_Expression contains a single elemeent or contains an expression. */ H = VERIFY (Initial_Expression, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789 '); /* If H > 0 then parentheses are required around the constants. */ /* Generate the constants. */ DO K = Initial_Value TO Final_Value; IF H = 0 THEN Temp = ''; ELSE Temp = '('; Temp2 = Initial_Expression; Trips = 1; MORE: L = SEARCHING(Temp2, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'); /* Look for a letter, */ /* indicating the start of an identifier. */ IF L > 1 THEN DO; IF SUBSTR(Temp2, 1, L-1) ^= ' ' THEN Temp = Temp || SUBSTR(Temp2, 1, L-1); Temp2 = SUBSTR(Temp2, L); /* Bring an identifier to the start of the string. */ END; IF L = 0 THEN /* there is no identifier, or no more identifiers. */ DO; NOTE ('No more identifiers. Quitting', 0); GO TO DONE; END; L = 1; M = VERIFY (Temp2, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_', L); /* Look for the end of an identifier. */ IF M = 0 THEN DO; Variable = SUBSTR(Temp2, L); Temp2 = ''; END; ELSE DO; Variable = SUBSTR (Temp2, L, M-L); Temp2 = SUBSTR(Temp2, M); END; IF Variable = Control_Variable THEN Temp = Temp || TRIM_BLANKS(K); ELSE Temp = Temp || Variable; note ('Temp2=' || Temp2 || ' Temp=' || Temp); Trips = Trips + 1; IF Trips > 10 THEN RETURN; IF LETTER(Temp2) > 0 THEN GO TO MORE; DONE: IF H > 0 THEN Temp = Temp || ')'; /* An expression required parentheses. */ ANSWER(Temp); IF K < Final_Value THEN ANSWER(','); END; %END INITIAL_VALUES; %ACTIVATE INITIAL_VALUES;