SUBROUTINE SYMFND(IB,IEQ,IA,ISIZE,ISTRT,ITYPE,VALUE) C C IB = ARRAY OF KEYWORDS TO SEARCH C IA = ARRAY OF CHARACTERS TO SEARCH C C ITYPE = -2 END OF LIST C ITYPE = -1 ERROR IN LIST C ITYPE = 0 NO MATCH C IYTPE = 1,2,3 FCNA (READ,WRITE,CTRL) C ITYPE = 4 NUMERIC DATA C ITYPE > 4 KEYWORD # + 4 C BYTE IA(ISIZE),IB(100) INTEGER IFCNA(4,2),IFMAX(4),IFSHFT(4) INTEGER*4 VALUE,IEQ(10) DATA IFMAX/31,7,31,15/ ,IFSHFT/4,3,5,4/ VALUE = 0 ISIGN = 1 IBASE = 10 !BASE FOR NUMERIC CONV. DO 10 I = ISTRT,ISIZE IF(IA(I) .EQ. ' ') GO TO 10 !SKIP OVER SPACES IF(IA(I) .EQ. '!') GO TO 11 !END OF LINE ISTRT = I GO TO 12 10 CONTINUE 11 ISTRT = ISIZE + 1 !NO MORE CHAR ITYPE = -2 RETURN 12 CONTINUE ITYPE = -1 MAX = 0 DO 20 I = ISTRT,ISIZE IF(IA(I) .EQ. ' ' ) GO TO 21 !END DO IF SPACE IF(IA(I) .EQ. '!') GO TO 21 !END OF LINE 20 MAX = MAX + 1 21 CONTINUE 101 CONTINUE I = ISTRT IF(IA(I) .LE. '9' .AND. IA(I) .GE. '0') GO TO 215 !INPUT IS NUMBER IF(IA(I) .EQ. '"') GO TO 210 !OCTAL NUMBER IF(IA(I) .GE. 'A' .AND. IA(I) .LE. 'Z') GO TO 400 !VARIABLE OR KEYWORD IF(IA(I) .GE. 'a' .AND. IA(I) .LE. 'z') GO TO 400 !VARIABLE IF(IA(I) .EQ. '<' ) GO TO 300 !INPUT IS FCNA GO TO 1012 !*** BAD CHARACTER C C HERE WE CONVERT A NUMBER C 200 ISIGN = -1 201 ISTRT = ISTRT + 1 MAX = MAX - 1 GO TO 215 210 MAX = MAX - 1 ISTRT = ISTRT + 1 IBASE = 8 215 IERR = -1 DO 220 J = 1,MAX IDIGIT = IA(ISTRT + J -1) - '0' IF(IDIGIT .GT. IBASE) GO TO 1001 !*** ERROR IN NUMBER IF(IDIGIT .LT. 0) GO TO 1001 VALUE = VALUE * IBASE + IDIGIT IF(VALUE .GT. "77777777) GO TO 1004 !*** NUMBER LARGER THAN 24 BITS 220 CONTINUE ITYPE = 4 GO TO 490 202 FORMAT(4O14) C C CONVERT AN FCNA FIELD C 300 CONTINUE IMAX = ISTRT + MAX - 1 IF(IA(IMAX) .NE. '>' ) GO TO 1002 !*** FCNA NOT TERMINATED BY > IF(MAX .LE. 4) GO TO 1006 !*** MISSING FIELDS IN FCNA IMAX = IMAX - 1 J = 1 JJ = 1 IFCNA(1,1) = 0 IFCNA(1,2) = 0 DO 315 I = ISTRT+1,IMAX IF(IA(I) .NE. ',') GO TO 312 !NOT SEPARATOR IFCNA(J,2) = IFCNA(J,JJ) J = J + 1 IF(J .GT. 4) GO TO 1003 !*** EXTRA FIELDS IN FCNA JJ = 1 IFCNA(J,1) = 0 IFCNA(J,2) = 0 GO TO 315 312 IF(IA(I) .NE. ':') GO TO 313 !NOT VECTOR SEPARATOR JJ = JJ + 1 IF(JJ .GT. 2) GO TO 1003 GO TO 315 313 CONTINUE IDIGIT = IA(I) - '0' IF(IDIGIT .LT. 0 .OR. IDIGIT .GT. IBASE) GO TO 1005 !*** CONVERSION ERROR IN FCNA IFCNA(J,JJ) = IFCNA(J,JJ) * IBASE + IDIGIT 315 CONTINUE IFCNA(J,2) = IFCNA(J,JJ) IF(J .NE. 4) GO TO 1006 !*** NOT ALL FIELDS OF FCNA SPEC ITYPE = 3 !CONTROL FUNCTION? IF(IFCNA(1,1) .LT. 8) ITYPE = 1 !NO, READ IF(IFCNA(1,1) .GE. 16 .AND. IFCNA(1,1) .LT. 24) ITYPE = 2 !NO WRITE!! IF(IFCNA(1,1)/8 .NE. IFCNA(1,2)/8) GO TO 1007 !*** BAD F DO 320 J = 1,4 VALUE = 6 + J DO 319 JJ = 1,2 IF(IFCNA(J,JJ) .GT. IFMAX(J)) GO TO 1500 319 CONTINUE IFCNA(J,2) = IFCNA(J,2) - IFCNA(J,1) !DIFFERENCE IF(IFCNA(J,2) .LT. 0) GO TO 1500 320 CONTINUE IF(IFCNA(3,2) .NE. 0 .AND. IFCNA(3,2)+IFCNA(3,1) .GT. 25) 1 GO TO 1009 !*** FINAL N IN CONTROLLER VALUE = 0 IFCNA(1,1) = IAND( "10 , ISHFT(IFCNA(1,1),-1) ) + 1 IAND( "7 , IFCNA(1,1) ) DO 330 JJ = 2,1,-1 DO 330 J =1,4 VALUE = ISHFT(VALUE,IFSHFT(J) ) VALUE = IOR(VALUE,IFCNA(J,JJ) ) 330 CONTINUE IF(IAND(VALUE,"177777) .EQ. 0) GO TO 1011 !*** BAD OVERALL FCNA GO TO 490 C C HERE WE SEARCH KEYWORD LIST FOR MATCH C 400 CONTINUE !STRING IS VARIABLE I = 2 IKEY = IB(1) DO 450 IK = 1,IKEY !SEARCH KEYWORDS IS = IB(I) !NUMBER OF CHARACTERS IF(IS .LE. 0) GO TO 460 !END OF KEYWORD LIST IF(IS .NE. MAX) GO TO 430 !NUMBER OF CHAR DOESN'T MATCH DO 420 J = 1,MAX !CHECK EACH CHAR. IF(IB(I+J) .NE. IA(ISTRT+J-1)) GO TO 430 420 CONTINUE ITYPE = 4 + IK VALUE = ISTRT !VALUE POINTS TO START OF KEY C NOW SEARCH TABLE OF EQUIVALENCES FOR MATCH IMAX = IEQ(2) IMIN = IEQ(1) IF(IK .LT. IMIN .OR. IK .GT. IMAX) GO TO 490 !FINISH IF(IMIN .LE. 0) GO TO 490 I = (IK - IMIN) * 2 + 3 !POINTS TO TABLE ENTRY ITYPE = IEQ(I) !KEY WORD # VALUE = IEQ(I+1) !VALUE GO TO 490 430 I = I + IS + 1 !NEXT ENTRY IN KEYWORD LIST 450 CONTINUE !NEXT ENTRY 460 ITYPE = 0 !NO MATCH SO TYPE=0 VALUE = ISTRT 490 ISTRT = ISTRT + MAX RETURN 1001 CONTINUE VALUE = 1 GO TO 1500 1002 CONTINUE VALUE = 2 GO TO 1500 1003 CONTINUE VALUE = 3 GO TO 1500 1004 CONTINUE VALUE = 4 GO TO 1500 1005 CONTINUE VALUE = 5 GO TO 1500 1006 CONTINUE VALUE = 6 GO TO 1500 1007 CONTINUE VALUE = 7 GO TO 1500 1009 VALUE = 9 GO TO 1500 1011 CONTINUE VALUE = 11 GO TO 1500 1012 VALUE = 12 1500 ITYPE = -1 GO TO 490 END