SUBROUTINE GETX(LENGTH,IPNTR,BUFFER,X) C C PURPOSE: SCANS A CHARACTER STRING OF "LENGTH" CHARACTERS IN C BYTE ARRAY "BUFFER" STARTING AT CHARACTER "IPNTR" FOR A VALID C NUMERIC STRING (INCLUDING SIGNS, DECIMAL POINT, AND "E" FIELD). C IF NUMERIC STRING IS FOUND, IT IS DECODED AS A DOUBLE PRECISION C REAL NUMBER AND RETURNED IN "X". ON RETURN, "IPNTR" POINTS TO C FIRST CHARACTER AFTER NUMERIC STRING, OR IS UNCHANGED IF NO C STRING PRESENT, OR IS SET NEGATIVE ON ERROR IN DECODING NUMBER. C NO IMBEDDED SPACES ARE ALLOWED IN THE NUMERIC STRING. C C VARIABLES: C LENGTH -INTEGER # BYTES IN "BUFFER" C IPNTR -INTEGER POINTER TO FIRST CHARACTER TO START SCANNING FROM C BUFFER -BYTE CHARACTER STRING C X -DOUBLE PRECISION # DECODED FROM STRING IN "BUFFER" C NFLAG -LOCAL FLAG CLEARED WHEN NUMERIC (0-9) CHARACTER ENCOUNTERED. C C SORENSON, 1/81 C BYTE BUFFER DIMENSION BUFFER(LENGTH) DOUBLE PRECISION X BYTE NSTART,NSTOP,PLUS,MINUS,DECPNT,EEE,LCE DATA NSTART/"60/,NSTOP/"71/,PLUS/'+'/,MINUS/'-'/,DECPNT/'.'/, 1EEE/'E'/,LCE/"145/ C C SCAN CHARACTERS FOR "NUMERIC" ENTRY C USE NFLAG TO SIGNAL OCCURANCE OF NUMBERS (0-9) C USE K AS POINTER TO POTENTIAL BREAK IN NUMBER FIELD C NFLAG=1 J=0 K=0 10 DO 40 I=IPNTR,LENGTH IF(BUFFER(I).LT.NSTART.OR.BUFFER(I).GT.NSTOP)GO TO 20 C C IF NUMBER, SET NFLAG=0, RESET K=0 AND CONTINUE SCAN C NFLAG=0 K=0 GO TO 40 C C CHECK FOR DECIMAL POINT C 20 IF(BUFFER(I).NE.DECPNT)GO TO 30 C C CAN'T HAVE TWO DECIMAL POINTS IN NUMBER, SET J=1 AT FIRST C OCCURANCE AND JUMP OUT ON NEXT C IF(J.NE.0)GO TO 41 J=1 GO TO 40 C C CHECK FOR OTHER STUFF VALID IN NUMBER FIELD (+,-,E) C 30 IF(.NOT.(BUFFER(I).EQ.LCE.OR.BUFFER(I).EQ.EEE.OR.BUFFER(I) 1.EQ.PLUS.OR.BUFFER(I).EQ.MINUS))GO TO 41 C C SINCE MUST ENCOUNTER A NUMBER FOLLOWING +, -, OR "E" FIELD. RESET C NFLAG, AND REMEMBER THIS POINT IN STRING IN CASE NOT IN NUMBER C FIELD ANYMORE C IF(K.NE.0)GO TO 40 K=I NFLAG=1 40 CONTINUE C C NUMBER FIELD IS CONTAINED IN STRING BUFFER(IPNTR) TO BUFFER(I-1) C AS LONG AS K=0. IF K > 0, FIELD IS CONTAINED IN BUFFER(IPNTR) TO C BUFFER(K-1). SET I TO # CHARACTERS IN FIELD. C 41 I=I-IPNTR IF(K.NE.0)I=K-IPNTR IF(I.LE.0)RETURN C C NOW TRY AND DECODE THE STRING C DECODE(I,43,BUFFER(IPNTR),ERR=99)X 43 FORMAT(E20.0) C C UPDATE CHARACTER POINTER C IPNTR=IPNTR+I RETURN C C SET IPNTR < 0 ON ERROR C 99 IPNTR=-1 RETURN END