FUNCTION INVAL(IUNIT,LENTH,TEXT,VAL) C READS UP TO 'LENTH' CHARACTERS FROM FORTRAN UNIT 'IUNIT' C AND TRIES TO CONVERT THEM INTO A NUMBER. C C IF A GOOD NUMBER IS FOUND AND WAS TERMINATED BY A C SPACE INSTEAD OF THE END-OF-LINE, NO MORE CHARACTERS C ARE READ IN ORDER TO LEAVE THE REMAINDER OF THE C LINE ALONE FOR THE NEXT READ STATEMENT OR THE NEXT C INVAL CALL. C C IN ALL OTHER CASES, CHARACTERS ARE READ TO THE END-OF-LINE. C C 'TEXT' GETS SET TO THE FIRST 'LENTH' CHARS READ FROM THE UNIT C IN PACKED ASCII (E.G. 2A6 OR 6A2 FORMAT), C SPACE FILLED IF LESS THAN 'LENTH' CHARACTERS OR C END OF NUMBER ENCOUNTERED BEFORE 'LENTH' CHARACTERS. C C 'VAL' GETS SET TO THE CONVERTED NUMERIC VALUE. C ( 0.0 IF 'INVAL' NOT -1) C C 'INVAL' IS -1 IF THE INVAL WAS A NUMBER, C 0 IF THERE WERE NO NON-BLANK CHARACTERS, C +1 IF THE INVAL WAS NOT A NUMBER. C C EXAMPLE STRING 'INVAL' 'VAL' 'TEXT' ('LENTH' = 12) C -------------- ------ ----- ------ C '' 0 0.0 ' ' C ' ' 0 0.0 ' ' C 'JUNK' 1 0.0 'JUNK ' C ' 123' -1 123. ' 123 ' C '3.14159268765' -1 3.141592 '3.1415926876' C '1.23X' 1 0.0 '1.23X ' C ' 4.896 + 7.8' -1 4.896 ' 4.896 ' C '1.786.456 ' 1 0.0 '1.786.456 ' C ' 1.234' -1 1.23 ' 1.23' C ' -5.78' -1 -5.78 ' -5.78 ' INTEGER TEXT,DEC,LF,EOL,EOF DIMENSION TEXT(100) DATA LF,EOL,EOF/212B,215B,232B/ DATA NUM,NULL,JUNK/-1,0,1/ LIMIT=LENTH IU=-IUNIT INDEX=0 ICH=0 VAL=0.0 NEG=.FALSE. DEC=-2047 ITEM=NULL WHILE (INDEX .LT. LIMIT .OR. (ITEM .NE. NUM .AND. ICH .NE. EOL)) * Get next character if not at end if line or number IF (ICH .NE. EOL) CALL CHRIO(IU,ICH) IF (ICH .EQ. LF ) CALL CHRIO(IU,ICH) IF (ICH .EQ. EOF) ICH = EOL * Put character in text string IF (INDEX .LT. LIMIT) THEN I=ICH IF (I .EQ. EOL) I = " " I=I.AND.77B K=INDEX/2+1 IF (INDEX .AND. 1) THEN I=TEXT(K)+I ELSE I=I*100B ENDIF TEXT(K)=I ENDIF * Process blank or end-of-line IF (ITEM .NE. JUNK) THEN IF (ICH .EQ. EOL .OR. ICH .EQ. " ") THEN IF (ITEM .EQ. NUM) ICH=EOL ELSE * Process unary - or period or digit IF (ICH .EQ. "-") THEN IF (ITEM .EQ. NUM) ITEM=JUNK NEG=.TRUE. ELSE ITEM=NUM IF (ICH .EQ. ".") THEN IF (DEC .GE. 0) ITEM=JUNK @ TOO MANY PERIODS DEC=0 ELSE I=ICH-"0" IF (I .GE. 0 .AND. I .LE. 9) THEN DEC=DEC+1 VAL=VAL*10.+FLOAT(I) ELSE ITEM=JUNK ENDIF ENDIF ENDIF ENDIF ENDIF INDEX=INDEX+1 ENDWHILE * Finish number IF (ITEM .EQ. NUM) THEN IF (DEC .GT. 0) THEN DO ? I=1,DEC VAL=VAL/10. ENDDO ENDIF IF (NEG) VAL=-VAL ELSE VAL=0.0 ENDIF INVAL=ITEM RETURN END