! SPCPRT.BAS 2.1 - PRINT ANY LIST BY COLUMNS                    03/84 ENO
!
!       AM-1000
!
!       Contributed to AMUS: 07/11/84
!       Author: Evan N. Oulashin
!               Portland Radio Supply
!               1234 SW Stark St.
!               Portland, Or. 97205
!               503-225-0035 (private line, do not publish)
!
!       Will take directory listings, name listings, what have you, and
!       format for x columns depending on selected (or determined) input
!       line length.  Prints in columns across page (wide/narrow paper).
!
!       As written, this program likes a lot of memory (100k or so) if
!       printing short lines (which result in many entries per page).
!
!       Original design was to print nice directory listings.  At the
!       end of this listing, there is a command file to create a
!       directory of the system and sort it.
!
!       Is now set for Toshiba 1351 printer.
!       To adapt to other printers, edit lower area of program for
!       proper print format codes (condensed, lines/chars per inch, etc.)
!
!       SET OKI = 1 FOR OKIDATA PRINTERS
!
       MAP1 FIL'DEFS
        MAP2 INLINE(950)       ,S,80   ! (le hogge' de memorie)
        MAP2 TITLE             ,S,80
        MAP2 INFILE            ,S,15
        MAP2 OUTFILE           ,S,15   ,"SPCPRT.OUT"
        MAP2 PLINE             ,S,224
        MAP2 SPACES            ,S,80
        MAP2 CND               ,B,1    ,0
        MAP2 WIDE              ,B,1    ,0
!
        MAP2 OKI               ,B,1    ,0
        MAP2 TOSHI             ,B,1    ,1
!
!       Map in other printer names and flags for additional flexibility.
!       To do so you will need to edit bottom of program.
!       One could add a "select printer" to input prompting for flair.
!
       XCALL NOECHO
       PRINT TAB(-1,0)
       LINECOUNT = 70
       SPACES = SPACE(80)
INF:
       INFILE = ""
       INPUT "FILENAME TO PRINT ---> ";INFILE
       IF INFILE = "" GOTO QUIT
       INPUT "TITLE ---------------> ";TITLE
       TITLE[70,73] = "PAGE"
       SPINCR = 8
       INPUT "SELECT TYPE STYLE (1=DP, 2=DP CONDENSED, 3=CORRESP.)";TYPE
       IF TYPE = 0 TYPE = 2
       IF TYPE = 2 CND = 1
       INPUT "FORCE INPUT LENGTO TO> ";FLEN
       INPUT "WIDE PAPER (Y/N) ----> ";A$: IF A$ = "Y" WIDE = 1
       WIDTH = 80
       IF CND XOR WIDE WIDTH = 136
       IF CND AND WIDE WIDTH = 224
       INPUT "SPOOL RESULT  (Y/N)--> ";A$: IF A$ = "Y" THEN IMMED = 1
       CALL GETLEN                     ! GET LINE LENGTH
       COLCT = INT(WIDTH/(LINLEN+1))
       ARRCT = LINECOUNT * COLCT
       PRINT "USING ARRAY COUNT OF ";ARRCT
!       LINLEN = INT(WIDTH/COLCT)
       OPEN #14,OUTFILE,OUTPUT
       CALL TITE                       ! MAX LINES PER PAGE
       IF CND CALL CONDENSE
       CALL OPEN'INFILE
       CALL PAGIT
LOOP:
       FOR L = 1 TO ARRCT
        INLINE(L) = SPACE(LINLEN+5)
       NEXT L
       FOR L = 1 TO ARRCT
IXT2:
        INPUT LINE #1,INLINE(L)
        IF EOF(1) ENDFLAG = 1: GOTO OUTIT
        IF INLINE(L) = SPACES GOTO IXT2        ! IGNORE BLANK LINES
        TOTCNT = TOTCNT + 1
       NEXT L
OUTIT:
       FOR L = 1 TO LINECOUNT
        PLINE = SPACE(WIDTH)
        FOR COL = 0 TO COLCT - 1
         OFFSET = (COL *(LINLEN+1))+1
         PLINE[OFFSET,OFFSET+LINLEN]= INLINE(L+(COL*LINECOUNT))
        NEXT COL
        XCALL STRIP,PLINE
        CALL PRINT
        CALL CHKINCR
       NEXT L
       IF ENDFLAG = 0 CALL PAGIT: GOTO LOOP
       CALL PRINT
       PLINE = " Listed " + TOTCNT + "items." + CHR(12)        ! FINISH WITH FORMFEED
       CALL PRINT
       CLOSE #14
       IF IMMED XCALL SPOOL,OUTFILE
       GOTO QUIT
CHKINCR:
       INCR = INCR + 1
       IF INCR/SPINCR = INT(INCR/SPINCR) CALL PRINT
       RETURN
PAGIT:
       PAGE = PAGE + 1
       TITLE[77,79] = PAGE USING "#ZZ"
       IF PAGE>1 PLINE = CHR(12): CALL PRINT
       CALL PRINT
       CALL NORMAL
       PLINE = TITLE
       CALL PRINT
       CALL CONDENSE
       CALL PRINT
       INCR = 0
       PRINT TITLE[70,79]
       RETURN
PRINT:
       PRINT #14,PLINE
       PLINE = ""
       RETURN
OPEN'INFILE:
       OPEN #1,INFILE,INPUT
       RETURN
GETLEN:
       CALL OPEN'INFILE
       IF FLEN LINLEN = FLEN: GOTO GOTLEN
       CT = 50
       FOR L=1 TO CT
NIXT:
       INPUT LINE #1,INLINE(1)
       IF INLINE(1)[1,3] = "   " GOTO NIXT
       A=A+LEN(INLINE(1))
       NEXT L
       LINLEN=INT(A/CT) + 2
GOTLEN:
       PRINT "USING LINE LENGTH ";LINLEN
       CLOSE #1
       RETURN
CONDENSE:
       IF OKI PLINE = CHR(29)
       IF TOSHI PLINE = CHR(27) + CHR(91)
       GOTO PRINT
TITE:
       IF OKI PLINE = CHR(27) + CHR(56)
       IF TOSHI PLINE = CHR(27) + "L06"
       GOTO PRINT
NORMAL:
       IF OKI PLINE = CHR(30)
       IF TOSHI PLINE = CHR(27) + CHR(93)
       GOTO PRINT
QUIT:   END

;       SYSDIR.CMD - COMMAND FILE TO CREATE SORTED DIRECTORY LISTING
;       03/84 ENO
:T
ERASE DIR.LST
DIR DIR=ALL:*.*[]
SORT DIR.LST
15
3
8
A
6
1
A


RUN SPCPRT

DIR.LST
DIRECTORY LISTING
2
Y
Y