DICTIONARY File variable for the data dictionary ITEMNAME Record ID ITEMDATA Record data item DATFIELD The data to convert (equivalent to LPV in F correlative, "*" if not applicable) VALUE Value within DATFIELD, if applicable CORREL Correlative to process SUBROUTINE CORREL(DICTIONARY, ITEMNAME, ITEMDATA, DATFIELD, VALUE, CORREL) ! Processes an attribute by a correlative. ! EQU AM TO CHAR(254), VM TO CHAR(253) ! IF CORREL = '' THEN RETURN LPV = DATFIELD COUNT = DCOUNT(CORREL, VM) FOR C = 1 TO COUNT TMP = CORREL<1,C> BEGIN CASE CASE TMP[1,5] = 'CALL ' PROG = FIELD(TMP, ' ', 2) IF PROG = 'BRNAME' THEN TMP = ITEMDATA<5,VALUE> BEGIN CASE CASE INDEX('ODIC', TMP[1,1], 1) TMP = FIELD(ITEMDATA<4,VALUE>, '*', 1) CASE 1 TMP = FIELD(ITEMNAME, '*', 1) END CASE DATFIELD = TMP : ' - ' : OCONV(TMP, 'TMASTERLIST;X;;2;2') END ELSE CALL @PROG(DATFIELD) END CASE TMP[1,1] = 'A' TMP = TMP[2, LEN(TMP)-1] DATFIELD = TMP OPERATORS = '' LEVELS = '' CNT = LEN(TMP) FOR N = 1 TO CNT IF INDEX('+-*/<>=#', TMP[N,1], 1) THEN OPERATORS = INSERT(OPERATORS, -1; TMP[N,1]) DATFIELD = DATFIELD[1,N-1]:AM:DATFIELD[N+1,CNT] END NEXT N CNT = DCOUNT(DATFIELD, AM) FOR N = CNT TO 1 STEP -1 IF DATFIELD = '' THEN DATFIELD = DELETE(DATFIELD, N) IF N > 1 THEN OPERATORS = OPERATORS : OPERATORS OPERATORS = DELETE(OPERATORS, N) END NEXT N LEVEL = 0 MAXLEVEL = 0 CNT = DCOUNT(DATFIELD, AM) FOR N = 1 TO CNT TMP = DATFIELD LOOP WHILE TMP[1,1] = '(' DO TMP = TMP[2,LEN(TMP)] LEVEL = LEVEL + 1 REPEAT DONE = 0 LOOP IF TMP[LEN(TMP),1] # ')' THEN DONE = 1 END ELSE IF INDEX(TMP, '(', 1) AND TMP[LEN(TMP)-1,2] # '))' THEN DONE = 1 END UNTIL DONE DO TMP = TMP[1,LEN(TMP)-1] LEVEL = LEVEL - 1 REPEAT DATFIELD = TMP IF N < CNT THEN LEVELS = LEVEL IF LEVEL > MAXLEVEL THEN MAXLEVEL = LEVEL NEXT N CNT = DCOUNT(DATFIELD, AM) FOR N = 1 TO CNT TMP = DATFIELD BEGIN CASE CASE TMP = 'D' TMP = DATE() CASE TMP = 'T' TMP = TIME() CASE TMP = 'LPV' TMP = LPV CASE TMP[1,1] = "'" OR TMP[1,1] = '"' TMP = FIELD(TMP, TMP[1,1], 2) CASE NUM(TRIM(TMP)) IF INT(TRIM(TMP)*1) = 0 THEN TMP = ITEMNAME END ELSE IF VALUE = '*' THEN TMP = ITEMDATA END ELSE TMP = ITEMDATA END END CASE 1 TMP = FIELD(FIELD(TMP, '(', 2), ')', 1) READ DCT FROM DICTIONARY, TMP THEN IF DCT<2> = 0 THEN TMP = ITEMNAME END ELSE IF VALUE = '*' THEN TMP = ITEMDATA> END ELSE TMP = ITEMDATA, VALUE> END END IF DCT<8> # '' THEN CALL CORREL(DICTIONARY, ITEMNAME, ITEMDATA, TMP, VALUE, DCT<8>) END END END CASE IF NOT(NUM(TRIM(TMP))) THEN TMP = 0 DATFIELD = TRIM(TMP) NEXT N OPLIST = '*':VM:'/':AM:'+':VM:'-':AM:'<':VM:'<=':VM:'>=':VM:'>' FOR L = MAXLEVEL TO 0 STEP -1 CNT = DCOUNT(OPLIST,AM) FOR N = 1 TO CNT VCNT = DCOUNT(OPLIST,VM) LOOP POS = 0 FOR M = 1 TO VCNT LOCATE(OPLIST, OPERATORS; TMP) THEN IF LEVELS = L THEN IF TMP < POS OR POS = 0 THEN POS = TMP END END NEXT M UNTIL POS = 0 DO BEGIN CASE CASE OPERATORS = '*' DATFIELD = DATFIELD * DATFIELD CASE OPERATORS = '/' IF DATFIELD THEN DATFIELD = INT(DATFIELD / DATFIELD) END ELSE DATFIELD = 0 END CASE OPERATORS = '+' DATFIELD = DATFIELD + DATFIELD CASE OPERATORS = '-' DATFIELD = DATFIELD - DATFIELD CASE OPERATORS = '<' DATFIELD = 0 IF DATFIELD < DATFIELD THEN DATFIELD = 1 CASE OPERATORS = '<=' DATFIELD = 0 IF DATFIELD <= DATFIELD THEN DATFIELD = 1 CASE OPERATORS = '>=' DATFIELD = 0 IF DATFIELD >= DATFIELD THEN DATFIELD = 1 CASE OPERATORS = '>' DATFIELD = 0 IF DATFIELD > DATFIELD THEN DATFIELD = 1 CASE OPERATORS = '=' DATFIELD = 0 IF DATFIELD = DATFIELD THEN DATFIELD = 1 CASE OPERATORS = '#' DATFIELD = 0 IF DATFIELD # DATFIELD THEN DATFIELD = 1 END CASE OPERATORS = DELETE(OPERATORS, POS) DATFIELD = DELETE(DATFIELD, POS+1) LEVELS = DELETE(LEVELS, POS) REPEAT NEXT N NEXT L CASE TMP[1,2] = 'F;' TMP = TMP[3, LEN(TMP)-2] DATFIELD = '' N = 1 LOOP UNTIL TMP = '' DO IF TMP[1,1] = '(' THEN POS = INDEX(TMP, ')', 1) DATFIELD = TMP[1,POS] TMP = TMP[POS+1,LEN(TMP)] POS = INDEX(TMP, ';', 1) IF POS THEN TMP = TMP[POS+1,LEN(TMP)] END ELSE TMP = '' END END ELSE POS = INDEX(TMP, ';', 1) IF POS THEN DATFIELD = TMP[1,POS-1] TMP = TMP[POS+1,LEN(TMP)] END ELSE DATFIELD = TMP TMP = '' END END N = N + 1 REPEAT FSTACK = '' CNT = DCOUNT(DATFIELD, AM) FOR N = 1 TO CNT TMP = DATFIELD BEGIN CASE CASE TMP[1,1] = '*' IF NUM(TRIM(FSTACK<1>)) AND NUM(TRIM(FSTACK<2>)) THEN FSTACK<2> = TRIM(FSTACK<2>) * TRIM(FSTACK<1>) END ELSE FSTACK<2> = 0 END FSTACK = DELETE(FSTACK, 1) TMP = TMP[2,LEN(TMP)] IF NUM(TRIM(TMP)) THEN FSTACK<1> = FSTACK<1> * 10^TRIM(TMP) CASE TMP[1,1] = '/' IF NUM(TRIM(FSTACK<1>)) AND NUM(TRIM(FSTACK<2>)) THEN IF TRIM(FSTACK<1>)*1 # 0 THEN FSTACK<2> = INT(TRIM(FSTACK<2>) / TRIM(FSTACK<1>)) END ELSE FSTACK<2> = 0 END END ELSE FSTACK<2> = 0 END FSTACK = DELETE(FSTACK, 1) CASE TMP[1,1] = '+' IF NUM(TRIM(FSTACK<1>)) AND NUM(TRIM(FSTACK<2>)) THEN FSTACK<2> = TRIM(FSTACK<2>) + TRIM(FSTACK<1>) END ELSE FSTACK<2> = 0 END FSTACK = DELETE(FSTACK, 1) CASE TMP[1,1] = '-' IF NUM(TRIM(FSTACK<1>)) AND NUM(TRIM(FSTACK<2>)) THEN FSTACK<2> = TRIM(FSTACK<2>) - TRIM(FSTACK<1>) END ELSE FSTACK<2> = 0 END FSTACK = DELETE(FSTACK, 1) CASE TMP[1,1] = ':' FSTACK<2> = FSTACK<2> : FSTACK<1> FSTACK = DELETE(FSTACK, 1) CASE TMP[1,2] = '[]' FSTACK<3> = FSTACK<3>[FSTACK<2>,FSTACK<1>] FSTACK = DELETE(FSTACK, 1) FSTACK = DELETE(FSTACK, 1) CASE TMP[1,1] = '_' TMP = FSTACK<2> FSTACK<2> = FSTACK<1> FSTACK<1> = TMP CASE TMP[1,1] = '(' TMP = FIELD(TMP[2,LEN(TMP)], ')', 1) FSTACK<1> = OCONV(FSTACK<1>, TMP) CASE TMP = 'P' FSTACK = INSERT(FSTACK, 1; FSTACK<1>) CASE TMP = 'R' IF NUM(TRIM(FSTACK<1>)) AND NUM(TRIM(FSTACK<2>)) THEN IF FSTACK<1> # 0 THEN FSTACK<2> = MOD(TRIM(FSTACK<2>), TRIM(FSTACK<1>)) END ELSE FSTACK<2> = 0 END END ELSE FSTACK<2> = 0 END FSTACK = DELETE(FSTACK, 1) CASE TMP = 'S' TMP = FSTACK<1> FSTACK<1> = 0 VCNT = DCOUNT(TMP, VM) FOR V = 1 TO VCNT IF NUM(TRIM(TMP<1,V>)) THEN FSTACK<1> = FSTACK<1> + TRIM(TMP<1,V>) END NEXT V CASE TMP = 'D' FSTACK = INSERT(FSTACK, 1; DATE()) CASE TMP = 'T' FSTACK = INSERT(FSTACK, 1; TIME()) CASE TMP = 'LPV' FSTACK = INSERT(FSTACK, 1; LPV) CASE TMP = '=' IF FSTACK<1> = FSTACK<2> THEN FSTACK<2> = 1 ELSE FSTACK<2> = 0 FSTACK = DELETE(FSTACK, 1) CASE TMP = '<' IF FSTACK<1> < FSTACK<2> THEN FSTACK<2> = 1 ELSE FSTACK<2> = 0 FSTACK = DELETE(FSTACK, 1) CASE TMP = '>' IF FSTACK<1> > FSTACK<2> THEN FSTACK<2> = 1 ELSE FSTACK<2> = 0 FSTACK = DELETE(FSTACK, 1) CASE TMP = '#' IF FSTACK<1> # FSTACK<2> THEN FSTACK<2> = 1 ELSE FSTACK<2> = 0 FSTACK = DELETE(FSTACK, 1) CASE TMP = '[' IF FSTACK<1> GE FSTACK<2> THEN FSTACK<2> = 1 ELSE FSTACK<2> = 0 FSTACK = DELETE(FSTACK, 1) CASE TMP = ']' IF FSTACK<1> LE FSTACK<2> THEN FSTACK<2> = 1 ELSE FSTACK<2> = 0 FSTACK = DELETE(FSTACK, 1) CASE TMP[1,1] = 'C' FSTACK = INSERT(FSTACK, 1; TMP[2,LEN(TMP)]) CASE TMP[1,1] = "'" OR TMP[1,1] = '"' FSTACK = INSERT(FSTACK, 1; FIELD(TMP, TMP[1,1], 2)) CASE NUM(TRIM(TMP)) IF INT(TRIM(TMP)*1) = 0 THEN FSTACK = INSERT(FSTACK, 1; ITEMNAME) END ELSE IF VALUE = '*' THEN FSTACK = INSERT(FSTACK, 1; ITEMDATA) END ELSE FSTACK = INSERT(FSTACK, 1; ITEMDATA) END END END CASE NEXT N DATFIELD = FSTACK<1> CASE TMP[1,2] = 'S;' VAL1 = FIELD(TMP, ';', 2) VAL2 = FIELD(TMP, ';', 3) IF TRIM(DATFIELD) = '' THEN DATFIELD = 0 IF NOT(NUM(DATFIELD)) THEN DATFIELD = 1 IF COUNT(DATFIELD, '.') > 1 THEN DATFIELD = 1 IF DATFIELD*1 THEN DATFIELD = VAL1 ELSE DATFIELD = VAL2 IF DATFIELD = '*' THEN DATFIELD = LPV END ELSE CONVERT "'" TO '"' IN DATFIELD IF DATFIELD[1,1] = '"' THEN DATFIELD = FIELD(DATFIELD, '"', 2) END ELSE IF TRIM(DATFIELD) = '' THEN DATFIELD = 0 IF NOT(NUM(DATFIELD)) THEN DATFIELD = 0 IF COUNT(DATFIELD, '.') > 1 THEN DATFIELD = 0 IF DATFIELD*1 THEN DATFIELD = ITEMDATA END ELSE DATFIELD = ITEMNAME END END END CASE 1 DATFIELD = OCONV(DATFIELD, TMP) END CASE LPV = DATFIELD NEXT C RETURN ! END