SUBROUTINE ASSIGN_SINGLE( UNIT_NUM, SECTION_INDEX, RANGES, & FIRST_ITEM_INTEGER, FIRST_ITEM_REAL, REDEFINED, ERROR) C---------------------------------------------------------------------- C- C- Purpose and Methods : Performs the assignment for a single value C- assignment statement. Gets the value from the file, and loops through C- the dimensions of the array assigning values. When this routine C- returns, the entire statement including the END_OF_LINE has been C- parsed. SECTION_INDEX is used to find the width of each dimension C- of FIRST_ITEM, and whether FIRST_ITEM is an INTEGER or a REAL C- variable. C- C- Inputs : C- UNIT_NUM The IO unit number. C- SECTION_INDEX The index that selects the description of the current C- section. C- RANGES The array containing the range that each variable is C- active over. C- FIRST_ITEM_INTEGER (* MODIFIED *) C- FIRST_ITEM_REAL (* MODIFIED *) C- The first item in the array to be filled. It is C- intended that this routine be called with the same C- parameter for both of these arguments, so this C- routine can be used to assign both REAL values and C- INTEGER values. Only the variable appropriate to C- the data type of the current section is accessed. C- C- Outputs : C- REDEFINED Has an assignment occured to a member of the item whose C- value has already been defined. C- ERROR Error status. .TRUE. on error. C- C- Filled common block array with FIRST_ITEM as first element C- C- Controls: none C- C- Created 9-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' INTEGER JBIT EXTERNAL JBIT C C Argument declarations C INTEGER UNIT_NUM INTEGER SECTION_INDEX INTEGER RANGES(1:MAX_NUM_DIMENSIONS) LOGICAL RANGES_L(32, 1:MAX_NUM_DIMENSIONS) INTEGER FIRST_ITEM_INTEGER(1:*) REAL FIRST_ITEM_REAL(1:*) LOGICAL REDEFINED LOGICAL ERROR C C Local variables C INTEGER COUNT1, COUNT2, COUNT3, COUNT4, COUNT5 INTEGER POSITION INTEGER TOKEN CHARACTER*20 STRING_VALUE REAL NUMBER_VALUE C ERROR = .FALSE. IF (DIAGNOSTICS) REDEFINED = .FALSE. C C Expand RANGES into RANGES_L C DO COUNT1 = 1, MAX_NUM_DIMENSIONS DO POSITION = 1, 32 C&IF VAXVMS,VAXELN IF (BTEST(RANGES(COUNT1), POSITION-1)) THEN C&ELSE C& IF (JBIT(RANGES(COUNT1), POSITION)) THEN C&ENDIF RANGES_L(POSITION, COUNT1) = .TRUE. ELSE RANGES_L(POSITION, COUNT1) = .FALSE. ENDIF END DO END DO C IF (DATA_TYPE( SECTION_INDEX ) .EQ. DATA_ENUMERATED_LOOKUP ) THEN CALL CHECK_NEXT_TOKEN(UNIT_NUM, C_ENUMERATED, TOKEN, & STRING_VALUE, NUMBER_VALUE, ERROR, CHECK_CLASS ) IF (ERROR) THEN CALL MESSAGE_OUT(MES_EXPECT_ENUM, SECTION_INDEX, STRING_VALUE) CALL FINISH_SECTION(UNIT_NUM) GOTO 999 ENDIF CALL ENUMERATED_TO_REAL( TOKEN, NUMBER_VALUE ) ELSE CALL CHECK_NEXT_TOKEN(UNIT_NUM, T_NUMBER, TOKEN, STRING_VALUE, & NUMBER_VALUE, ERROR, CHECK_TOKEN) IF (ERROR) THEN CALL MESSAGE_OUT( MES_EXPECTED_NUMBER, SECTION_INDEX, & STRING_VALUE) CALL FINISH_SECTION(UNIT_NUM) GOTO 999 ENDIF ENDIF C DO COUNT1 = 1, WIDTHS(1,SECTION_INDEX) IF (RANGES_L(COUNT1, 1)) THEN DO COUNT2 = 1, WIDTHS(2,SECTION_INDEX) IF (RANGES_L(COUNT2, 2)) THEN DO COUNT3 = 1, WIDTHS(3,SECTION_INDEX) IF (RANGES_L(COUNT3,3)) THEN DO COUNT4 = 1, WIDTHS(4,SECTION_INDEX) IF (RANGES_L(COUNT4,4)) THEN DO COUNT5 = 1, WIDTHS(5,SECTION_INDEX) IF (RANGES_L(COUNT5,5)) THEN C POSITION = (COUNT1 - 1) + & WIDTHS(1,SECTION_INDEX) * (COUNT2 -1) + & WIDTHS(1,SECTION_INDEX) * & WIDTHS(2,SECTION_INDEX) * (COUNT3 -1) + & WIDTHS(1,SECTION_INDEX) * & WIDTHS(2,SECTION_INDEX) * & WIDTHS(3,SECTION_INDEX) * (COUNT4 -1) + & WIDTHS(1,SECTION_INDEX) * & WIDTHS(2,SECTION_INDEX) * & WIDTHS(3,SECTION_INDEX) * & WIDTHS(4,SECTION_INDEX) * (COUNT 5 -1) + 1 C IF (DIAGNOSTICS) THEN IF ((DATA_TYPE(SECTION_INDEX) .EQ. & DATA_INTEGER ) .OR. & (DATA_TYPE(SECTION_INDEX) .EQ. & DATA_ENUMERATED_LOOKUP)) THEN IF (FIRST_ITEM_INTEGER( POSITION ) & .NE. MIN_INTEGER ) REDEFINED = .TRUE. ELSE IF (FIRST_ITEM_REAL(POSITION) & .NE. MIN_REAL) REDEFINED = .TRUE. ENDIF ENDIF C IF ((DATA_TYPE(SECTION_INDEX) .EQ. & DATA_INTEGER) .OR. & (DATA_TYPE(SECTION_INDEX) .EQ. & DATA_ENUMERATED_LOOKUP)) THEN FIRST_ITEM_INTEGER(POSITION) = NINT( & NUMBER_VALUE ) ELSE FIRST_ITEM_REAL( POSITION ) = NUMBER_VALUE ENDIF C ENDIF END DO ENDIF END DO ENDIF END DO ENDIF END DO ENDIF END DO C 999 RETURN END