SUBROUTINE CHECK_NEXT_TOKEN(UNIT_NUM, TOKEN_IN, TOKEN_OUT, & STRING_VALUE, NUMBER_VALUE, ERROR, CHECKS) C---------------------------------------------------------------------- C- C- Purpose and Methods : Each call gets the next token in the file, and C- performs the specified checks to see if its value C- agrees with what is expected. If the C- checks fail, the routine returns ERROR = .TRUE. C- Also, if checks fail, the routine sill does it's C- best to match the string to a token. C- C- Inputs : C- UNIT_NUM the IO unit number C- TOKEN_IN the expected token or class C- C- Outputs : C- TOKEN_OUT the integer value representing the token read C- STRING_VALUE the actual string that TOKEN represents C- NUMBER_VALUE the real value of the string read, if it is a C- number, or 0 if it is anything else C- ERROR error status. .TRUE. on error C- C- Controls: C- CHECKS what kind of checking applies. is one of: C- NO_CHECK, CHECK_TOKEN, CHECK_CLASS, IGNORE_EOL, C- CHECK_TOKEN + IGNORE_EOL, CHECK_CLASS + IGNORE_EOL. C- IGNORE_EOL by itself implies NO_CHECK C- C- Created 18-MAY-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global definitions C INCLUDE 'D0$LEVEL1:PARSE_TOKENS.PARAMS' INCLUDE 'D0$LEVEL1:PARSE_TOKENS.INC' C C Procedure arguments C INTEGER UNIT_NUM INTEGER TOKEN_IN INTEGER TOKEN_OUT CHARACTER*20 STRING_VALUE REAL NUMBER_VALUE LOGICAL ERROR INTEGER CHECKS C C Local variables C INTEGER COUNT ! loop index INTEGER IOSTAT C C C NUMBER_VALUE = 0.0 ERROR = .FALSE. C C skip END_OF_LINE if necessary C 1000 CONTINUE CALL NEXT_WORD( UNIT_NUM, STRING_VALUE ) IF ( ( ( CHECKS .EQ. IGNORE_EOL) .OR. & ( CHECKS .EQ. ( CHECK_TOKEN + IGNORE_EOL ) ) .OR. & ( CHECKS .EQ. ( CHECK_CLASS + IGNORE_EOL ) ) ) .AND. & ( STRING_VALUE .EQ. 'END_OF_LINE' ) ) GOTO 1000 C C C C match token if nothing is known about it C IF (( CHECKS .EQ. NO_CHECK ) .OR. ( CHECKS .EQ. IGNORE_EOL ) & .OR. (CHECKS .EQ. NO_CHECK + IGNORE_EOL)) THEN CALL MATCH_TOKEN( STRING_VALUE, TOKEN_OUT, NUMBER_VALUE ) GOTO 999 ENDIF C C C C check for a particular token C IF (( CHECKS .EQ. CHECK_TOKEN ) .OR. & ( CHECKS .EQ. CHECK_TOKEN + IGNORE_EOL ) ) THEN C C handle if a NUMBER is what is wanted IF ( TOKEN_IN .EQ. T_NUMBER ) THEN READ(STRING_VALUE, 300, IOSTAT = IOSTAT, ERR = 3100) & NUMBER_VALUE 300 FORMAT( BN, F20.0 ) TOKEN_OUT = T_NUMBER GOTO 999 ENDIF C C found correct token C IF ( TOKEN_STRING(TOKEN_IN) .EQ. STRING_VALUE ) THEN TOKEN_OUT = TOKEN_IN GOTO 999 ENDIF C C The string did not match the token. Find a match if possible C 3100 CONTINUE ! the continue is used by the READ statement above ERROR = .TRUE. C CALL MATCH_TOKEN( STRING_VALUE, TOKEN_OUT, NUMBER_VALUE ) GOTO 999 ENDIF C C C C check for a particular class, only case left. C CALL TOKEN_CLASS( STRING_VALUE, TOKEN_IN, TOKEN_OUT, ERROR) IF ( ERROR ) THEN CALL MATCH_TOKEN( STRING_VALUE, TOKEN_OUT, NUMBER_VALUE ) GOTO 999 ENDIF C C C----------------------------------------------------------------------- 999 RETURN END C C C SUBROUTINE MATCH_TOKEN( STRING_VALUE, TOKEN_OUT, NUMBER_VALUE ) C---------------------------------------------------------------------- C- C- Purpose and Methods : Searches the entire list of possible matches to find C- what token corresponds to the string in STRING_VALUE. This tries all C- possible tokens until a match is made, so TOKEN_CLASS should be used C- instead of this routine if anything is known about the expected value C- of the token. C- C- Inputs : STRING_VALUE the string to be matched C- Outputs : TOKEN_OUT the token representing STRING_VALUE. T_DUMMY is C- returned if no match can be found. C- NUMBER_VALUE the REAL value of the string if it is a number C- Controls: none C- C- Created 5-JUL-1990 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE C- C---------------------------------------------------------------------- IMPLICIT NONE C---------------------------------------------------------------------- C C Global declarations C INCLUDE 'D0$LEVEL1:PARSE_TOKENS.PARAMS' INCLUDE 'D0$LEVEL1:PARSE_TOKENS.INC' C C Argument declarations C CHARACTER*20 STRING_VALUE INTEGER TOKEN_OUT REAL NUMBER_VALUE C C Local variables C INTEGER IOSTAT C C C NUMBER_VALUE = 0.0 C DO TOKEN_OUT = 1, MAX_NUM_TOKENS IF ( STRING_VALUE .EQ. TOKEN_STRING( TOKEN_OUT ) ) GOTO 999 END DO C C See if the string is a NUMBER. C READ(STRING_VALUE, 200, IOSTAT = IOSTAT, ERR = 2000) & NUMBER_VALUE 200 FORMAT( BN, F20.0 ) TOKEN_OUT = T_NUMBER GOTO 999 C C No match has been made. C 2000 CONTINUE TOKEN_OUT = T_DUMMY C 999 RETURN END