[comp.sys.ibm.pc] LJP - a printer program for the LaserJet Series II

jwg@duke.cs.duke.edu (Jeffrey William Gillette) (03/17/88)

[]

	Now that I have a LaserJet Series II, I need some excuse to
justify its existence.  LJP is a small program I wrote to dump out
text files in 2 column lineprinter format.  Since I haven't noticed
a similar program on the net, I am posting LJP, in the hope that someone
else might find it useful.

	LJP runs in PC8 character set, so it should handle all upper
ASCII characters.

	Making "d" the first command line argument puts LJP in a
"doubleprint" mode.  LJP will print all odd pages, prompt the user
to turn the paper stack over, and then print the even pages.  LJP
prints the even pages in descending order to handle the LJ II collating
feature.  Thus it is not necessary to shuffle or recollate the printout.

================================ CUT HERE ==================================
/*
                                     LJP.C

                           Jeffrey William Gillette
                                  Durham, NC

    LJP is a text print utility for the LaserJet Series II printer.
    It prints files, 2 columns to a landscape page, in the small
    lineprinter (16.6cpi) font.  To reduce further the size of 
    listings, the "d" command line switch can be used to print
    on both sides of the paper (odd pages first, then even pages).

    LJP uses the PC8 character set, so all IBM characters ought to
    print correctly.  LJP also observes the LJ II collate sequence
    in the doubleprint mode, so it is not necessary to shuffle paper
    in a long print.  In both these features, the LJ II differs from
    the original recepie LaserJet, so LJP will probably need some
    modifications to work with the earlier printer.

    Compile LJP with MSC (version 4 or 5).

    I have placed LJP in the public domain.  Use it as you please.
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define LINES_PER_PAGE 57
#define TRUE 1
#define FALSE !TRUE

#define MAX_PAGES 1000
long PageBreak[MAX_PAGES];
int  PagePtr = 0;

int PageNumber = 0;
char FileName[80];

main(argc,argv)
    int argc; char *argv[];
{
    long lDate;
    int DoubleFlag = TRUE;
    int argCount = 1;
    int i;
    FILE *fd;
    char buf[80], c;

    if ( !strcmp(argv[1],"d") ) {
        DoubleFlag = FALSE;
        argCount++;
    }

    /*  Set up printer - requires Series II */
    fprintf(stdprn,"%c&l1O%c(10U%c(s16.6h0T",27,27,27);
    fprintf(stdprn,"%c&l68p8D",27);

    /*  Do for each file on command line    */
    for ( ; argCount < argc; argCount++ ) {

        /*  First open the file */
        if ( (fd = fopen(argv[argCount],"r")) == NULL ) {
            sprintf(buf,"Cannot open file %s ", argv[argCount] );
            printf(buf);
            continue;
        }

        /*  Copy to FileName    */
        strcpy(FileName,argv[argCount]);
        printf("\nPrinting file: %s -    ",FileName);

        /*  Do pages until done */
        while ( !feof(fd) ) {
            printf("\b\b\b%3d",PageNumber+1);
            DoPage(fd,0,TRUE);
            DoPage(fd,1,TRUE);
            StampPage(TRUE);
            printf("\b\b\b%3d",PageNumber+1);
            PageBreak[PagePtr++] = ftell(fd);
            DoPage(fd,0,DoubleFlag);
            DoPage(fd,1,DoubleFlag);
            StampPage(DoubleFlag);
        }

        /*  For DoubleFlag, turn paper over and do file again   */
        if ( !DoubleFlag ) {
            putchar(6);
            printf("\n\nFinished side 1, turn paper over for side 2.\n");
            printf("Hit Enter key to continue ");
            do c = getche();
            while ( c != '\r' && c != '\r' );
            printf("\n\nPrinting file: %s -    ",FileName);
            for ( i = PagePtr -1; i >= 0; i-- ) {
                PageNumber = 2 * i + 1;
                printf("\b\b\b%3d",PageNumber+1);
                if ( PageBreak[i] < 0 ) {
                    fprintf(stdprn,"%c",12);
                    continue;
                }
                fseek(fd,PageBreak[i],SEEK_SET);
                DoPage(fd,0,TRUE);
                DoPage(fd,1,TRUE);
                StampPage(TRUE);
            }
        }

        /*  Done with file      */
        fclose(fd);
    }

    /*  Re-initialize printer   */
    fprintf(stdprn,"%cE",27);

    exit(0);
}

int DoPage(fd,Side,Flag)
    FILE *fd; int Side, Flag;
{
    int i;
    char buf[80];

    /*  Set left margin */
    fprintf(stdprn,"%c&a%dL", 27, Side ? 92 : 8 );
    fprintf(stdprn,"%c&a0r%dC",27, Side ? 92 : 8 );

    for ( i = 0; !feof(fd), i < LINES_PER_PAGE; i++ ) {
        if ( !fgets(buf, sizeof(buf),fd) ) continue;
        if ( Flag ) fprintf(stdprn,"%s\r",buf);
    }

    return(TRUE);
}

int StampPage( Flag )
    int Flag;
{
    char buf[80],DateBuf[40],TimeBuf[40];
    time_t TimePtr;

    PageNumber++;

    if ( Flag ) {
        fprintf(stdprn,"%c9%c&a59r8CFile: %s",27,27,FileName);
        TimePtr = time(NULL);
        sprintf(buf,"Page %-3d   %8s   %8s", PageNumber,
            _strdate(DateBuf), _strtime(TimeBuf) );
        fprintf(stdprn,"%c&a134C%37s",27,buf);
        fprintf(stdprn,"%c",12);
    }

    return(TRUE);
}


/*	That's all	*/
-- 
Jeffrey William Gillette	uucp:   jwg at duke.edu
Duke University                 bitnet: DYBBUK at TUCCVM