$CPU 8086 ' make compatible with XT systems $LIB ALL OFF ' turn off all PowerBASIC libraries $ERROR ALL OFF ' turn off all PowerBASIC error checking $OPTIMIZE SIZE ' optimize for smaller code $COMPILE UNIT ' compile to a UNIT (.PBU) '$COMPILE EXE ' compile to a UNIT (.PBU) DEFINT A-Z ' Required for all numeric functions, forces PB to not ' include floating point in UNIT (makes it smaller) '/*------------------------------------------------------------------*/ DECLARE FUNCTION FILESPEC(BYVAL OPT AS STRING, BYVAL FLNAME AS STRING) AS STRING DECLARE FUNCTION PROGNAME() AS STRING DECLARE FUNCTION SUBSTR(BYVAL X AS STRING, BYVAL N AS INTEGER, BYVAL L AS INTEGER, BYVAL PAD AS STRING) AS STRING DECLARE FUNCTION ISODD(BYVAL NUMBER) AS INTEGER DECLARE FUNCTION WORD(BYVAL X AS STRING,XN AS INTEGER) AS STRING '/*------------------------------------------------------------------*/ $CODE SEG "MLIB4" '/*------------------------------------------------------------------*/ ' CF2BOOK FSPEC$,MPOINT&,OPT,NC ' Convert File to Book format for printing with PL2C, PL3C, PL4C, ' PL5C and PL6C routines. This routine takes the contents of FSPEC$ ' uses it to create a file where the data is correctly formatted and ' paginated to print properly in a booklet or double-sided format. ' The result is placed in the file CF2BOOK.DAT. ' FSPEC$ - Name of file to convert. Contents of this file are NOT ' changed. ' MPOINT& - Line number that represents the center of the file. Pass ' this number to PL2C, PL3C and PL4C to pause printer and ' print the back side of each sheet. ' OPT - 0 = Print 1st page to last when printing back side. ' 1 = Print last page to 1st when printing back side (normal). ' NC - Number of page columns on sheet. ' 0 = Booklet print, 80 characters per line. ' 2 = Two pages to a side, 80 characters per line. ' 3 = Three pages to a side, 80 characters per line. ' 4 = Four pages to a side, 40 characters per line. ' 5 = Five pages to a side, 40 characters per line. ' 165 = One page to a side, 165 character per line. ' 242 = One page to a side, 242 caracters per line. ' NOTE: Each page is formatted to 66 lines per page. ' If any line is longer than the allowed number of characters, ' it is truncated at the max character. ' If any line is shorter than the allowed number of characters, ' spaces are added at the end of the line to the max number. ' EXAMPLE: CF2BOOK "C:\CODE\MLIB\TEXT.TXT",1,0 ' | | | ' | | +-- booklet format ' | +---- Last to 1st ' +----------------- Name of file ' ' EXAMPLE: CF2BOOK "C:\CODE\MLIB\TEXT.TXT",1,2 ' | | | ' | | +-- 2 Pages per side ' | +---- Last to 1st ' +----------------- Name of file ' ' EXAMPLE: CF2BOOK "C:\CODE\MLIB\TEXT.TXT",1,3 ' | | | ' | | +-- 3 Pages per side ' | +---- Last to 1st ' +----------------- Name of file ' ' EXAMPLE: CF2BOOK "C:\CODE\MLIB\TEXT.TXT",1,4 ' | | | ' | | +-- 4 Pages per side ' | +---- Last to 1st ' +----------------- Name of file ' ' EXAMPLE: CF2BOOK "C:\CODE\MLIB\TEXT.TXT",1,165 ' | | | ' | | +-- 1 Page per side ' | +---- Last to 1st ' +----------------- Name of file ' ' EXAMPLE: CF2BOOK "C:\CODE\MLIB\TEXT.TXT",1,242 ' | | | ' | | +-- 1 Page per side ' | +---- Last to 1st ' +----------------- Name of file '/*------------------------------------------------------------------*/ SUB CF2BOOK(FSPEC$,CF2BOOKF$,MPOINT&,OPT,NC) PUBLIC LRECL = 0 PL = 0 TPLC = 0 HPATH$ = "" PCNT = 0 LCNT = 0 CNT = 0 DCNT = 0 '/*--- Non-Booklet Specs --- IF NC > 0 AND NC < 13 THEN IF NC = 6 THEN LRECL = 39 PL = 396 END IF IF NC = 5 THEN LRECL = 47 PL = 330 END IF IF NC = 4 THEN LRECL = 40 PL = 264 END IF IF NC = 3 THEN LRECL = 80 PL = 198 END IF IF NC = 2 THEN LRECL = 80 PL = 132 END IF IF NC = 12 THEN NC = 1 LRECL = 121 PL = 132 END IF IF NC = 165 THEN NC = 1 LRECL = 165 PL = 66 END IF IF NC = 242 THEN NC = 1 LRECL = 242 PL = 66 END IF IF OPT = 1 THEN OPT = 5 IF OPT = 2 THEN OPT = 6 TPLC = PL*2 '/* END IF '/*--- Booklet Specified --- ELSE IF NC = 0 THEN NC = 1 LRECL = 80 PL = 66 TPLC = PL*4 ELSE LRECL = NC NC = 1 PL = 66 TPLC = PL*4 END IF END IF LRECL = LRECL + 3 ' SAY 24,1,"LRECL ="+STR$(LRECL)+" PL ="+STR$(PL)+ " TPLC ="+STR$(TPLC),31 HPATH$ = FILESPEC("H",PROGNAME) '/*--- Scan File to Determine Number of Pages --- PCNT = 0 LCNT = 0 CNT = 0 DCNT = 0 PNBR = 1 PLCNT = 1 FF1 = FREEFILE OPEN"I",FF1,FSPEC$ FF2 = FREEFILE '/* IF NC = 1 AND LRECL = 124 THEN BADD = 121-LRECL+3 ELSE BADD = 0 IF NC = 1 AND LRECL = 124 THEN BADD = 13 ELSE BADD = 0 OPEN"O",FF2,CF2BOOKF$+".T1" WHILE NOT EOF(FF1) LINE INPUT#FF1,T$ IF ISODD(PNBR) = 1 AND BADD > 0 THEN T$ = STRING$(BADD,32)+T$ T$ = SUBSTR(T$,1,LRECL-3," ")+":" PRINT#FF2,T$ INCR DCNT INCR CNT INCR LCNT IF PLCNT = 66 THEN INCR PNBR PLCNT = 0 END IF INCR PLCNT IF LCNT = PL THEN INCR PCNT LCNT = 0 END IF IF DCNT = TPLC THEN DCNT = 0 END IF WEND '/*--- Need to Add Lines to Paginate Correctly? --- IF DCNT > 0 AND DCNT < TPLC THEN WHILE DCNT < TPLC INCR DCNT INCR LCNT PRINT#FF2,STRING$(LRECL-3,32)+":" IF LCNT = PL THEN INCR PCNT LCNT = 0 END IF WEND END IF ' SAY 25,1,"PCNT ="+STR$(PCNT)+" DCNT ="+STR$(DCNT),31 ' Y$ = GETKEY CLOSE#FF1 CLOSE#FF2 '/*--- If Odd Page Increment Page Count Again --- IF ISODD(PCNT) = 1 THEN INCR PCNT '/*--- Build Page Control File --- FF1 = FREEFILE OPEN"O",FF1,CF2BOOKF$+".CTL" TCNT = (PCNT/2) LPG = PCNT RLPG = PCNT PPCNT = 1 '/*--- Booklet Last to 1st --- IF OPT = 1 THEN FOR CNT = 1 TO TCNT STEP 2 LPG = (PCNT-CNT+1) RPG = CNT RLPG = LPG RRPG = (PCNT/2)+CNT RLPG = PCNT-RRPG+1 A$ = STR$(LPG) + STR$(RPG) + STR$(RLPG) + STR$(RRPG) PRINT#FF1,A$ INCR PPCNT NEXT CNT END IF '/*--- Booklet 1st to Last --- IF OPT = 2 THEN FOR CNT = 1 TO TCNT STEP 2 LPG = (PCNT-CNT+1) RPG = CNT RLPG = RPG +1 RRPG = LPG -1 A$ = STR$(LPG) + STR$(RPG) + STR$(RLPG) + STR$(RRPG) PRINT#FF1,A$ INCR PPCNT NEXT CNT END IF '/*--- Two Sided - 1 Col - Last to 1st --- IF OPT = 5 THEN FOR CNT = 1 TO PCNT STEP 2 LPG = CNT BPG = (PCNT-CNT) + 1 A$ = STR$(LPG) + STR$(BPG) PRINT#FF1,A$ NEXT CNT END IF '/*--- Two Sided - 1 Col - 1st to Last --- IF OPT = 6 THEN FOR CNT = 1 TO PCNT STEP 2 LPG = CNT BPG = CNT + 1 A$ = STR$(LPG) + STR$(BPG) PRINT#FF1,A$ NEXT CNT END IF CLOSE#FF1 '/*--- Build CF2BOOK.TMP File --- BP = PL*LRECL FF1 = FREEFILE OPEN CF2BOOKF$+".T1" FOR BINARY AS #FF1 FFC = FREEFILE OPEN"I",FFC,CF2BOOKF$+".CTL" FFO = FREEFILE OPEN CF2BOOKF$+".TMP" FOR BINARY AS #FFO WHILE NOT EOF(FFC) LINE INPUT#FFC,CTRL$ LPG = VAL(WORD(CTRL$,1)) RPG = VAL(WORD(CTRL$,2)) SP& = (BP*LPG)-BP SEEK #FF1,SP& GET$ #FF1,BP,T$ PUT$ #FFO,T$ IF OPT = 5 THEN ITERATE SP& = (BP*RPG)-BP SEEK #FF1,SP& GET$ #FF1,BP,T$ PUT$ #FFO,T$ WEND CLOSE#FFC OPEN"I",FFC,CF2BOOKF$+".CTL" WHILE NOT EOF(FFC) LINE INPUT#FFC,CTRL$ IF OPT = 1 OR OPT = 2 THEN LPG = VAL(WORD(CTRL$,3)) RPG = VAL(WORD(CTRL$,4)) END IF IF OPT = 5 THEN LPG = VAL(WORD(CTRL$,2)) SP& = (BP*LPG)-BP SEEK #FF1,SP& GET$ #FF1,BP,T$ PUT$ #FFO,T$ IF OPT <> 5 THEN SP& = (BP*RPG)-BP SEEK #FF1,SP& GET$ #FF1,BP,T$ PUT$ #FFO,T$ END IF WEND PUT$ #FFO,CHR$(26) CLOSE#FFC CLOSE#FF1 CLOSE#FFO '/*--- Remove Last Character --- FFI = FREEFILE OPEN"I",FFI,CF2BOOKF$+".TMP" FFO = FREEFILE OPEN"O",FFO,CF2BOOKF$+".DAT" WHILE NOT EOF(FFI) LINE INPUT#FFI, T$ T$ = LEFT$(T$,LEN(T$)-1) PRINT#FFO,T$ WEND CLOSE#FFI CLOSE#FFO '/*--- Delete Temp Files --- KILL CF2BOOKF$+".T1" KILL CF2BOOKF$+".CTL" KILL CF2BOOKF$+".TMP" '/*--- Determine #Lines in File --- FFI = FREEFILE OPEN CF2BOOKF$+".DAT" FOR BINARY AS #FFI FSIZE& = LOF(FFI) LNBR& = FSIZE&/(LRECL-1) MPOINT& = LNBR&/2 CLOSE#FFI FSPEC$ = CF2BOOKF$+".DAT" OPEN"O",FFI,CF2BOOKF$+".MPT" PRINT#FFI,STR$(MPOINT&) CLOSE#FFI END SUB '/*------------------------------------------------------------------*/ '/*------------------------------------------------------------------*/ ' $INCLUDE "C:\CODE\MLIB\MLIB.INC" ' T$ = UCASE$(COMMAND$) ' F$ = WORD(T$,1) ' CF2BOOKF$ = WORD(T$,2) ' OPT = VAL(WORD(T$,3)) ' NC = VAL(WORD(T$,4)) '/* CF2BOOKF$ = FILESPEC("H",PROGNAME)+"CF"+MID$(T$,1,2)+MID$(T$,4,2)+MID$(T$,7,2) ' CF2BOOK F$,CF2BOOKF$,MPOINT&,OPT,NC '/* CF2BOOK "C:\CODE\lds\bishop.fnl",MPOINT&,1,121 '/* IF NC = 121 THEN PL121 FSPEC$,UD$,1,MPOINT& '/* PL6C "C:\CODE\MLIB\CF2BOOK.DAT",UD$,1,MPOINT& '/* PL5C "C:\CODE\MLIB\CF2BOOK.DAT",UD$,1,MPOINT& '/* PL4C "C:\CODE\MLIB\CF2BOOK.DAT",UD$,1,MPOINT& '/* PL3C "C:\CODE\MLIB\second\CF2BOOK.DAT",UD$,1,MPOINT& '/* PL2C "C:\CODE\MLIB\CF2BOOK.DAT",UD$,1,MPOINT& '/* Y$ = GETKEY