      SUBROUTINE MAIN
      INTEGER PAGSIZ, LINSIZ, NCOLS, GUTSIZ, LINENO, NLINES, I, J, FD
      INTEGER READLN, CTOI, GETARG, MOD, MAX0, OPEN
      LOGICAL*1 ARG(512)
      COMMON /CCOL/ COL, NEXTBF, LINBUF(5000), LINPTR(1000)
      INTEGER COL
      INTEGER NEXTBF
      LOGICAL*1 LINBUF
      INTEGER LINPTR
      LOGICAL*1 USESTR(54)
      DATA USESTR(1)/117/,USESTR(2)/115/,USESTR(3)/97/,USESTR(4)/103/,US
     *ESTR(5)/101/,USESTR(6)/58/,USESTR(7)/32/,USESTR(8)/32/,USESTR(9)/1
     *09/,USESTR(10)/99/,USESTR(11)/111/,USESTR(12)/108/,USESTR(13)/32/,
     *USESTR(14)/91/,USESTR(15)/45/,USESTR(16)/99/,USESTR(17)/110/,USEST
     *R(18)/93/,USESTR(19)/32/,USESTR(20)/91/,USESTR(21)/45/,USESTR(22)/
     *108/,USESTR(23)/110/,USESTR(24)/93/,USESTR(25)/32/,USESTR(26)/91/,
     *USESTR(27)/45/,USESTR(28)/119/,USESTR(29)/110/,USESTR(30)/93/,USES
     *TR(31)/32/,USESTR(32)/91/,USESTR(33)/45/,USESTR(34)/103/,USESTR(35
     *)/110/,USESTR(36)/93/,USESTR(37)/32/,USESTR(38)/91/,USESTR(39)/45/
     *,USESTR(40)/100/,USESTR(41)/110/,USESTR(42)/93/,USESTR(43)/32/,USE
     *STR(44)/91/,USESTR(45)/102/,USESTR(46)/105/,USESTR(47)/108/,USESTR
     *(48)/101/,USESTR(49)/93/,USESTR(50)/32/,USESTR(51)/46/,USESTR(52)/
     *46/,USESTR(53)/46/,USESTR(54)/0/
      CALL QUERY(USESTR)
      I = 1
23000 IF (.NOT.(I .LE. 1000))GOTO 23002
      LINPTR(I) = 0
23001 I = I + 1
      GOTO 23000
23002 CONTINUE
      COL = 0
      NEXTBF = 1
      PAGSIZ = 55
      LINSIZ = 60
      NCOLS = 2
      GUTSIZ = 8
      FD = -3
      I = 1
23003 IF (.NOT.(GETARG(I, ARG, 512) .NE. -1))GOTO 23005
      IF (.NOT.(ARG(1) .EQ. 45 .AND. ARG(2) .NE. 0))GOTO 23006
      CALL COLARG (ARG, PAGSIZ, NCOLS, GUTSIZ, LINSIZ)
      GOTO 23007
23006 CONTINUE
      IF (.NOT.(ARG(1) .EQ. 45 .AND. ARG(2) .EQ. 0))GOTO 23008
      CALL DOCOL (PAGSIZ, NCOLS, GUTSIZ, LINSIZ, 1)
      GOTO 23009
23008 CONTINUE
      FD = OPEN(ARG, 1)
      IF (.NOT.(FD .EQ. -3))GOTO 23010
      CALL CANT(ARG)
23010 CONTINUE
      CALL DOCOL(PAGSIZ, NCOLS, GUTSIZ, LINSIZ, FD)
      CALL CLOSE (FD)
23009 CONTINUE
23007 CONTINUE
23004 I = I + 1
      GOTO 23003
23005 CONTINUE
      IF (.NOT.(FD .EQ. -3))GOTO 23012
      CALL DOCOL (PAGSIZ, NCOLS, GUTSIZ, LINSIZ, 1)
23012 CONTINUE
      RETURN
      END
      SUBROUTINE COLARG (ARG, PAGSIZ, NCOLS, GUTSIZ, LINSIZ)
      INTEGER PAGSIZ, NCOLS, GUTSIZ, LINSIZ, J
      INTEGER CTOI
      LOGICAL*1 ARG(100)
      J = 3
      J = CTOI(ARG, J)
      IF (.NOT.(ARG(2) .EQ. 99 .OR. ARG(2) .EQ. 67))GOTO 23014
      NCOLS = J
      IF (.NOT.(NCOLS .LE. 0))GOTO 23016
      CALL ERROR (21Hinvalid column count.)
23016 CONTINUE
      GOTO 23015
23014 CONTINUE
      IF (.NOT.(ARG(2) .EQ. 108 .OR. ARG(2) .EQ. 76))GOTO 23018
      PAGSIZ = J
      IF (.NOT.(PAGSIZ .LE. 0))GOTO 23020
      CALL ERROR (18Hinvalid page size.)
23020 CONTINUE
      GOTO 23019
23018 CONTINUE
      IF (.NOT.( (ARG(2) .EQ. 119 .OR. ARG(2) .EQ. 87) .OR. (ARG(2) .EQ.
     * 115 .OR. ARG(2) .EQ. 115) ))GOTO 23022
      LINSIZ = J
      IF (.NOT.(LINSIZ .LE. 0))GOTO 23024
      CALL ERROR (21Hinvalid column width.)
23024 CONTINUE
      GOTO 23023
23022 CONTINUE
      IF (.NOT.(ARG(2) .EQ. 103 .OR. ARG(2) .EQ. 71))GOTO 23026
      GUTSIZ = J
      IF (.NOT.(GUTSIZ .LT. 0))GOTO 23028
      CALL ERROR (21Hinvalid gutter width.)
23028 CONTINUE
      GOTO 23027
23026 CONTINUE
      IF (.NOT.(ARG(2) .EQ. 100 .OR. ARG(2) .EQ. 68))GOTO 23030
      PAGSIZ = 23
      LINSIZ = 10
      NCOLS = 7
      GUTSIZ = 1
      IF (.NOT.(J .GT. 0))GOTO 23032
      LINSIZ = J
      NCOLS = MAX0(1, 81/(LINSIZ+1))
      IF (.NOT.(NCOLS .GT. 1))GOTO 23034
      GUTSIZ = (79 - (LINSIZ+1)*NCOLS)/(NCOLS - 1)+1
      IF (.NOT.(GUTSIZ .LE. 0))GOTO 23036
      NCOLS = NCOLS - 1
23036 CONTINUE
23034 CONTINUE
23032 CONTINUE
      GOTO 23031
23030 CONTINUE
      CALL REMARK (22Hignoring invalid flag.)
23031 CONTINUE
23027 CONTINUE
23023 CONTINUE
23019 CONTINUE
23015 CONTINUE
      RETURN
      END
      SUBROUTINE DOCOL (PAGSIZ, NCOLS, GUTSIZ, LINSIZ, FD)
      INTEGER PAGSIZ, NCOLS, GUTSIZ, LINSIZ, FD, NLINES, LINENO, I
      INTEGER READLN
      COMMON /CCOL/ COL, NEXTBF, LINBUF(5000), LINPTR(1000)
      INTEGER COL
      INTEGER NEXTBF
      LOGICAL*1 LINBUF
      INTEGER LINPTR
      NLINES = PAGSIZ*NCOLS
      IF (.NOT.(NLINES .GT. 1000))GOTO 23038
      CALL ERROR (15Htoo many lines.)
23038 CONTINUE
      LINENO = 1
23040 IF (.NOT.(READLN(I, LINSIZ, FD) .NE. -1))GOTO 23042
      CALL INJECT(I, LINENO)
      IF (.NOT.(LINENO .GE. NLINES))GOTO 23043
      CALL OUTBUF(PAGSIZ, LINSIZ, GUTSIZ)
      LINENO = 0
23043 CONTINUE
23041 LINENO = LINENO + 1
      GOTO 23040
23042 CONTINUE
      IF (.NOT.(LINENO .GT. 1))GOTO 23045
      PAGSIZ = LINENO/NCOLS
      IF (.NOT.(MOD(LINENO, NCOLS) .NE. 0))GOTO 23047
      PAGSIZ = PAGSIZ + 1
23047 CONTINUE
      CALL OUTBUF(PAGSIZ, LINSIZ, GUTSIZ)
23045 CONTINUE
      RETURN
      END
      SUBROUTINE INJECT(PTR, LINENO)
      INTEGER PTR, LINENO
      COMMON /CCOL/ COL, NEXTBF, LINBUF(5000), LINPTR(1000)
      INTEGER COL
      INTEGER NEXTBF
      LOGICAL*1 LINBUF
      INTEGER LINPTR
      IF (.NOT.(LINENO .GT. 1000))GOTO 23049
      CALL ERROR(26Hinsufficient buffer space.)
23049 CONTINUE
      LINPTR(LINENO) = PTR
      RETURN
      END
      SUBROUTINE OUTBUF(PAGSIZ, LINSIZ, GUTSIZ)
      INTEGER PAGSIZ, LINSIZ, GUTSIZ
      INTEGER I, J
      COMMON /CCOL/ COL, NEXTBF, LINBUF(5000), LINPTR(1000)
      INTEGER COL
      INTEGER NEXTBF
      LOGICAL*1 LINBUF
      INTEGER LINPTR
      I = 1
23051 IF (.NOT.(LINPTR(I) .NE. 0))GOTO 23053
      CALL OUTLIN(LINBUF(LINPTR(I)))
      LINPTR(I) = 0
      J = I + PAGSIZ
23054 IF (.NOT.(LINPTR(J) .NE. 0))GOTO 23056
      CALL OUTTAB((LINSIZ + GUTSIZ)*((J - 1)/PAGSIZ))
      CALL OUTLIN(LINBUF(LINPTR(J)))
      LINPTR(J) = 0
23055 J = J + PAGSIZ
      GOTO 23054
23056 CONTINUE
      CALL OUTCH(10)
23052 I = I + 1
      GOTO 23051
23053 CONTINUE
      NEXTBF = 1
      RETURN
      END
      SUBROUTINE OUTCH(C)
      LOGICAL*1 C
      COMMON /CCOL/ COL, NEXTBF, LINBUF(5000), LINPTR(1000)
      INTEGER COL
      INTEGER NEXTBF
      LOGICAL*1 LINBUF
      INTEGER LINPTR
      CALL PUTCH(C,2)
      IF (.NOT.(C .EQ. 10))GOTO 23057
      COL = 0
      GOTO 23058
23057 CONTINUE
      COL = COL + 1
23058 CONTINUE
      RETURN
      END
      SUBROUTINE OUTLIN(STR)
      LOGICAL*1 STR(100)
      INTEGER I
      I = 1
23059 IF (.NOT.(STR(I) .NE. 0))GOTO 23061
      CALL OUTCH(STR(I))
23060 I = I + 1
      GOTO 23059
23061 CONTINUE
      RETURN
      END
      SUBROUTINE OUTTAB(N)
      INTEGER N
      COMMON /CCOL/ COL, NEXTBF, LINBUF(5000), LINPTR(1000)
      INTEGER COL
      INTEGER NEXTBF
      LOGICAL*1 LINBUF
      INTEGER LINPTR
23062 IF (.NOT.(COL .LT. N))GOTO 23063
      CALL OUTCH(32)
      GOTO 23062
23063 CONTINUE
      RETURN
      END
      INTEGER FUNCTION READLN(P, LINSIZ, FD)
      INTEGER P, LINSIZ, FD
      INTEGER I
      LOGICAL*1 GETCH
      LOGICAL*1 C
      COMMON /CCOL/ COL, NEXTBF, LINBUF(5000), LINPTR(1000)
      INTEGER COL
      INTEGER NEXTBF
      LOGICAL*1 LINBUF
      INTEGER LINPTR
      P = NEXTBF
      I = 1
23064 IF (.NOT.(GETCH(C, FD) .NE. -1))GOTO 23066
      IF (.NOT.(C .EQ. 10))GOTO 23067
      GOTO 23066
23067 CONTINUE
      IF (.NOT.(I .LE. LINSIZ))GOTO 23069
      IF (.NOT.(NEXTBF .GE. 5000))GOTO 23071
      CALL ERROR(26Hinsufficient buffer space.)
23071 CONTINUE
      LINBUF(NEXTBF) = C
      NEXTBF = NEXTBF + 1
23069 CONTINUE
23065 I = I + 1
      GOTO 23064
23066 CONTINUE
      IF (.NOT.(C .EQ. -1 .AND. I .EQ. 1))GOTO 23073
      READLN=(-1)
      RETURN
23073 CONTINUE
      LINBUF(NEXTBF) = 0
      NEXTBF = NEXTBF + 1
      READLN=(I - 1)
      RETURN
      END
