SUBROUTINE FREAD (CHARS,ARRAY,NVALS) C****************************************************************** C C THIS SUBROUTINE IS INTENDED TO REPLACE THE SPECIAL C FORTRAN "READ(LU,*)" FREE FIELD FEATURE. C C CALLING PARAMETERS...... C C CHARS IS A STRING OF CHARACTERS TO BE READ FREE FIELD. C THE STRING "MUST" BE TERMINATED WITH A SLASH "/". C C ARRAY IS A REAL ARRAY INTO WHICH THE VALUES READ FREE C FIELD ARE PLACED. C C NVALS A) ON CALL, SETS THE MAXIMUM NUMBER OF VALUES C TO BE READ. C B) ON RETURN, INDICATES THE ARRAY POSITION C FILLED BY THE LAST VALUE READ (OR DEFAULTED). C C *** NOTE *** C C -ALL CHARACTERS EXCLUDING THE FOLLOWING ARE INTERPRETED C AS LIMITING CHARACTERS... C 0123456789.+- C -THE CHARACTER SLASH "/" IS USED TO TERMINATE THE STRING. C -THE CHARACTER COMMA "," IS USED AS A LIMITER AND MAY C ALSO BE USED TO DEFAULT AN ARRAY POSITION (LEAVE C UNCHANGED) IF ENTERED AS A DOUBLE COMMA. IE ",,". C -AN ERROR CONDITION WILL BE FLAGGED ON RETURN WITH C NVALS SET TO MINUS ONE "-1". C C******************************************************************* C LOGICAL*1 CHARS(1),SET(14),FOUND,DECML,START C DIMENSION ARRAY(1) C DATA SET/1H0,1H1,1H2,1H3,1H4,1H5,1H6,1H7,1H8,1H9,1H+, * 1H-,1H.,1H, / C C SETUP..... C MAXVAL=NVALS NVALS=-1 NC=0 NV=0 GO TO 600 C C NEXT CHARACTER..... C 100 NC=NC+1 IF (CHARS(NC).EQ.1H/) GO TO 300 DO 200 N=1,14 IF (CHARS(NC).EQ.SET(N)) GO TO 700 200 CONTINUE IF (.NOT.FOUND) GO TO 100 300 IF (START) RETURN 400 IF (.NOT.FOUND) GO TO 500 NV=NV+1 ARRAY(NV)=TEMP*SGN IF (CHARS(NC).NE.1H/.AND.NV.LT.MAXVAL) GO TO 600 500 NVALS=NV RETURN C 600 SGN=1.0 TEMP=0.0 FOUND=.FALSE. START=.FALSE. DECML=.FALSE. GO TO 100 C C COMMA ?..... C 700 IF (N.LT.11) GO TO 1100 IF (N.NE.14) GO TO 800 IF (FOUND) GO TO 300 NV=NV+1 IF (NV.LT.MAXVAL) GO TO 100 NVALS=NV RETURN C C MINUS "-" OR PLUS "+"..... C 800 IF (N.EQ.11) GO TO 900 IF (N.NE.12) GO TO 1000 SGN=-1.0 900 START=.TRUE. IF (FOUND) RETURN FOUND=.TRUE. GO TO 100 C C DECIMAL POINT..... C 1000 IF (DECML) RETURN IF (.NOT.FOUND) START=.TRUE. DECML=.TRUE. FOUND=.TRUE. GO TO 100 C C DIGITS 0 THROUGH 9..... C 1100 N=N-1 FOUND=.TRUE. START=.FALSE. TEMP=TEMP*10.0 + N IF (DECML) SGN=SGN/10. GO TO 100 END