File INVAL.FT (FORTRAN source file)

Directory of image this file is from
This file as a plain text file


	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



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search