FUNCTION ICONV(STRING,IVAL) CC C ICONV - CONVERT STRING TO NUMERIC VALUE. C ENTRY - C -STRING- = STRING TO CONVERT C C EXIT - C -IVAL- = VALUE OF STRING (IF VALUE WAS COMPUTED) C LOGICAL*1 SFC(4), SDEL(3), STRING(1) DATA SFC/'"','''','%',0/ ! SPECIAL FIRST CHARS DATA SDEL/2,1,3/ ! COUNT FOR TERMINATOR SCAN DELAY C ICONV = 0 ! INITIALIZE FOR NO GOOD IACC = 0 ! PRESET NUMBER ACCUMULATOR ICH = STRING(1) ! GET FIRST CHAR OF ENTRY ISLEN = LEN(STRING) ! SAVE CHAR COUNT OF STRING ITYP = INDEX(SFC,ICH) ! CONSTANT TYPE IF (ITYP.GT.0) GOTO 500 ! IF SPECIAL FIRST CHAR IF ((ICH.LT."60).OR.(ICH.GT."72)) RETURN ! IF NOT DIGIT IBASE = 8 ! PRESET FOR OCTAL IF (STRING(ISLEN).NE."56) GOTO 100 ! IF LOOKS LIKE OCTAL IBASE = 10 ISLEN = ISLEN-1 ! DONT SCAN THE . CC C HANDLE STRAIGHT OCTAL/DECIMAL CONSTANTS. C 100 DO 150 I=1,ISLEN IDIG = STRING(I)-"60 ! GET NEXT DIGIT VALUE IF ((IDIG.LT.0).OR.(IDIG.GE.IBASE)) GOTO 800 ! ILLEGAL DIGIT 150 IACC = IACC*IBASE+IDIG ! COMPILE VALUE 199 ICONV = -1 ! FLAG EVERYTHING WORKED IVAL = IACC ! TRANSMIT VALUE TO CALLER RETURN CC C HANDLE SPECIAL CONSTANTS. C 500 DO 550 I=2,1+SDEL(ITYP) ! FOR ALL BUT FIRST CHAR IDIG = STRING(I) GOTO (510,510,530), ITYP ! PROCESS PROPER STUFF 510 IACC = ISHFT(IACC,8)+IDIG ! PUT IN NEXT DIGIT GOTO 550 530 IDIG = INDEX(' ABCDEFGHIJKLMNOPQRSTUVWXYZ$. 0123456789' 1 ,IDIG) ! CHECK IF LEGAL RAD50 IF (IDIG.LE.0) GOTO 800 ! IF NOT LEGAL RAD50 IACC = IACC*"50+IDIG-1 550 CONTINUE GOTO 199 ! EXIT HAPPILY CC C GENERAL EXIT TO FLAG ILLEGAL DIGIT C 800 ICONV = 1 RETURN END