Cloned SEACAS for EXODUS library with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

279 lines
7.8 KiB

C=======================================================================
PROGRAM FORMTEX
C=======================================================================
C Written by Amy Gilkey
C Last Revised 06/01/88
C --FORMTEX formats a TEX file.
PARAMETER (MAXCOL = 72)
CHARACTER*120 LASTLINE
CHARACTER*120 THISLINE
CHARACTER*20 WORD, WORD2
LOGICAL DONELAST
LOGICAL DONETHIS
LOGICAL VERBATIM
LOGICAL ASIS
INTEGER*2 I2
C --Open the input and output files
NTEX = 20
OPEN (NTEX, FILE='INFILE', READONLY, STATUS='OLD', IOSTAT=IERR)
IF (IERR .NE. 0) THEN
PRINT *, 'ERROR - Cannot open input file'
GOTO 120
END IF
NFMT = 30
OPEN (NFMT, FILE='OUTFILE', CARRIAGECONTROL='LIST',
& STATUS='NEW')
C --Process the file
LASTEND = -1
VERBATIM = .FALSE.
DO WHILE (.TRUE.)
READ (NTEX, '(A)', IOSTAT=IOSTAT) THISLINE
IDUM = STR$TRIM (THISLINE, THISLINE, I2)
IEND = JZEXT (I2)
DONELAST = .FALSE.
DONETHIS = .FALSE.
ASIS = VERBATIM
IF (IOSTAT .LT. 0) THEN
DONELAST = .TRUE.
IEND = -1
ELSE IF (IEND .EQ. 0) THEN
DONELAST = .TRUE.
DONETHIS = .TRUE.
ELSE IF (THISLINE(1:1) .EQ. '%') THEN
DONELAST = .TRUE.
DONETHIS = .TRUE.
ASIS = .TRUE.
ELSE IF (THISLINE(1:1) .EQ. ' ') THEN
DONELAST = .TRUE.
ELSE IF ((THISLINE(1:1) .EQ. '}')
& .OR. (THISLINE(1:1) .EQ. '{')) THEN
DONELAST = .TRUE.
IF (IEND .EQ. 1) DONETHIS = .TRUE.
ELSE IF (THISLINE(1:1) .EQ. '&') THEN
DONELAST = .TRUE.
ELSE IF (THISLINE(1:1) .EQ. '\') THEN
IL = 1
CALL SCANSLASH (THISLINE, IL, IEND, WORD)
IF ((WORD .EQ. '\caps')
& .OR. (WORD .EQ. '\cmd')
& .OR. (WORD .EQ. '\param')
& .OR. (WORD .EQ. '\bold')
& .OR. (WORD .EQ. '\mbox')
& .OR. (WORD .EQ. '\ref')
& .OR. (WORD .EQ. '\ldots')
& .OR. (WORD .EQ. '\PROGRAM')
& .OR. (WORD .EQ. '\\')) THEN
CONTINUE
ELSE IF (WORD .EQ. '\item') THEN
DONELAST = .TRUE.
IF (IL .GE. IEND) DONETHIS = .TRUE.
ELSE
DONELAST = .TRUE.
DONETHIS = .TRUE.
IF ((WORD .EQ. '\begin') .OR. (WORD .EQ. '\end')) THEN
CALL SCANPARAM (THISLINE, IL, IEND, WORD2)
IF (WORD2 .EQ. 'verbatim') THEN
VERBATIM = (WORD .EQ. '\begin')
IF (.NOT. VERBATIM) ASIS = .FALSE.
END IF
END IF
END IF
END IF
IF (IEND .GT. 0) THEN
IF (THISLINE(IEND:IEND) .EQ. '{') THEN
DONETHIS = .TRUE.
END IF
IF (THISLINE(IEND:IEND) .EQ. '\') THEN
DONETHIS = .TRUE.
END IF
END IF
IF (ASIS) THEN
DONELAST = .TRUE.
DONETHIS = .TRUE.
END IF
IF (DONELAST) THEN
IF (LASTEND .GE. 0) THEN
WRITE (NFMT, 10000) LASTLINE(:LASTEND)
LASTEND = -1
END IF
END IF
IF (IOSTAT .LT. 0) GOTO 110
IF (.NOT. ASIS) THEN
DO WHILE (.TRUE.)
I = INDEX (THISLINE, '. ')
IF ((I .LE. 0) .OR. (I .GE. IEND)) GOTO 100
THISLINE(I+1:) = THISLINE(I+2:)
IEND = IEND - 1
END DO
100 CONTINUE
END IF
DO WHILE ((.NOT. ASIS) .AND. (IEND .GT. 0))
IF (LASTEND .LT. 0) LASTEND = 0
IF (LASTEND .EQ. 0) THEN
NCH = 0
ELSE
NCH = LASTEND + 1
END IF
IF ((NCH + IEND) .LE. MAXCOL) THEN
IF (NCH .GT. 0) LASTLINE(NCH:NCH) = ' '
LASTLINE(NCH+1:) = THISLINE(1:IEND)
LASTEND = NCH + IEND
IEND = -1
ELSE
ISTART = LIB$SKPC (' ', THISLINE)
I = MAXCOL - NCH + 1
IF (I .LT. ISTART) I = 0
DO WHILE ((I .GT. 0) .AND. (THISLINE(I:I) .NE. ' '))
I = I - 1
END DO
IF ((LASTEND .EQ. 0) .AND. (I .LE. 0))
& I = INDEX (THISLINE, ' ')
IF (I .GT. 0) THEN
IF (NCH .GT. 0) LASTLINE(NCH:NCH) = ' '
LASTLINE(NCH+1:) = THISLINE(1:I-1)
C#???? LASTEND = NCH + I-1
IDUM = STR$TRIM (LASTLINE, LASTLINE, I2)
LASTEND = JZEXT (I2)
THISLINE = THISLINE(I+1:IEND)
IEND = IEND - I
END IF
IF (LASTEND .GE. 0) THEN
WRITE (NFMT, 10000) LASTLINE(:LASTEND)
LASTEND = -1
END IF
END IF
END DO
IF (DONETHIS) THEN
IF (LASTEND .GE. 0) THEN
WRITE (NFMT, 10000) LASTLINE(:LASTEND)
LASTEND = -1
END IF
IF (IEND .GE. 0) THEN
WRITE (NFMT, 10000) THISLINE(:IEND)
IEND = -1
END IF
END IF
END DO
110 CONTINUE
CLOSE (NTEX)
CLOSE (NFMT)
120 CONTINUE
10000 FORMAT (10A)
END
C=======================================================================
SUBROUTINE SCANSLASH (INLINE, ILINE, IEND, WORD)
C=======================================================================
C --SCANSLASH scans the input line for the "\" word. The "\" word
C --may be a string of alphabetic characters or a single character.
C --
C --Parameters:
C -- INLINE - IN - the input line
C -- ILINE - IN/OUT - the start of the "\" word, returned end of
C -- the "\" word
C -- IEND - IN - the end of line
C -- WORD - OUT - the "\" word (including "\")
CHARACTER*(*) INLINE
CHARACTER*(*) WORD
CHARACTER CH
ISTART = ILINE
CH = INLINE(ILINE+1:ILINE+1)
IF ((CH .GE. 'A') .AND. (CH .LE. 'Z'))
& CH = CHAR (ICHAR(CH) - ICHAR('A') + ICHAR('a'))
ILINE = ILINE + 1
IF ((CH .GE. 'a') .AND. (CH .LE. 'z')) THEN
DO WHILE (ILINE .LT. IEND)
CH = INLINE(ILINE+1:ILINE+1)
IF ((CH .GE. 'A') .AND. (CH .LE. 'Z'))
& CH = CHAR (ICHAR(CH) - ICHAR('A') + ICHAR('a'))
IF ((CH .LT. 'a') .OR. (CH .GT. 'z')) GOTO 100
ILINE = ILINE + 1
END DO
END IF
100 CONTINUE
WORD = INLINE(ISTART:ILINE)
RETURN
END
C=======================================================================
SUBROUTINE SCANPARAM (INLINE, ILINE, IEND, WORD)
C=======================================================================
C --SCANPARAM scans the input line for the parameter. The parameter
C --starts with "{" and ends with "}" (stripped).
C --
C --Parameters:
C -- INLINE - IN - the input line
C -- ILINE - IN/OUT - the start of the parameter, returned end of
C -- the parameter
C -- IEND - IN - the end of line
C -- WORD - OUT - the parameter without ("{" and "}")
CHARACTER*(*) INLINE
CHARACTER*(*) WORD
CHARACTER CH
ILINE = ILINE + 1
CH = INLINE(ILINE:ILINE)
DO WHILE (CH .EQ. ' ')
ILINE = ILINE + 1
CH = INLINE(ILINE:ILINE)
END DO
ISTART = ILINE
IF (CH .NE. '{') GOTO 100
L = LEN (INLINE)
ILINE = ILINE + 1
CH = INLINE(ILINE:ILINE)
DO WHILE ((CH .NE. '}') .AND. (ILINE .LE. L))
ILINE = ILINE + 1
CH = INLINE(ILINE:ILINE)
END DO
100 CONTINUE
WORD = INLINE(ISTART+1:ILINE-1)
RETURN
END