SUBROUTINE PCARD(CARD,VAL,NVAL) CHARACTER*(*) CARD CHARACTER*1 CH REAL*8 VAL(0:*),TMP INTEGER*4 ITMP INTEGER NVAL,NPWR,KVAL,ICH,ICHR,NCHR,NDEC,IPWR,PWRFLG C C parses a card for a leading alphabetic character and C NVAL numbers C PARAMETER (NPWR=6) LOGICAL NEG,NEWNUM REAL PTEN(0:NPWR) SAVE PTEN DATA PTEN/1.,10.,100.,1000.,10000.,100000.,1000000./ NCHR=80 C NCHR=LEN(CARD) NEG=.FALSE. NEWNUM=.TRUE. ITMP=0 NDEC=-1 IPWR=0 PWRFLG=0 KVAL=0 ICHR=0 50 IF(KVAL.LT.NVAL) THEN ICHR=ICHR+1 IF(ICHR.LE.NCHR) THEN CH=CARD(ICHR:ICHR) ELSE CH='/' ENDIF ICH=ICHAR(CH)-ICHAR('0') IF(ICH.GE.0.AND.ICH.LE.9) THEN C character is a number IF(NDEC.LE.0) THEN ITMP=ICH NDEC=1 ELSE IF(NDEC.EQ.NPWR) THEN C .. now is a good time to convert integer to real IF(NEWNUM) THEN TMP=ITMP NEWNUM=.FALSE. ELSE TMP=TMP*PTEN(NDEC)+ITMP ENDIF ITMP=ICH NDEC=1 ELSE NDEC=NDEC+1 ITMP=ITMP*10+ICH ENDIF IF(PWRFLG.GT.0) IPWR=IPWR-1 ELSE IF(CH.EQ.'.') THEN PWRFLG=1 IF(NDEC.LT.0) NDEC=0 ELSE IF(CH.EQ.'-') THEN NEG=.TRUE. NDEC=0 ELSE IF(CH.EQ.'+') THEN NDEC=0 ELSE C character is not a number or decimal point, +, - IF(NDEC.GE.0) THEN C save results from number decoding IF(PWRFLG.LT.0) THEN C integer follows 'E' IF(NEG) ITMP=-ITMP IPWR=IPWR+ITMP ELSE C finish up number IF(NEWNUM) THEN TMP=ITMP ELSE TMP=ITMP+TMP*PTEN(NDEC) ENDIF IF(NEG) TMP=-TMP ENDIF IF(CH.EQ.'E'.OR.CH.EQ.'e'.OR. : CH.EQ.'D'.OR.CH.EQ.'d') THEN C ..... look for exponent PWRFLG=-1 NDEC=0 ELSE C .. fix up power of 10 in groups of NPWR 10 IF(IPWR.NE.0) THEN IF(IPWR.LT.0) THEN ITMP=-IPWR IF(ITMP.GT.NPWR) ITMP=NPWR TMP=TMP/PTEN(ITMP) IPWR=IPWR+ITMP ELSE ITMP=IPWR IF(ITMP.GT.NPWR) ITMP=NPWR TMP=TMP*PTEN(ITMP) IPWR=IPWR-ITMP IF(ABS(TMP).GT.1.E+32) IPWR=0 ENDIF GO TO 10 ENDIF VAL(KVAL)=TMP KVAL=KVAL+1 PWRFLG=0 NDEC=-1 IPWR=0 ENDIF NEG=.FALSE. NEWNUM=.TRUE. ITMP=0 ENDIF IF(CH.EQ.',') THEN IF(NDEC.EQ.-2) KVAL=KVAL+1 NDEC=-2 ELSE IF(CH.EQ.'/') THEN C end of line character KVAL=NVAL ENDIF ENDIF GO TO 50 ENDIF RETURN END