home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
443.lha
/
dj_v1.0
/
dj.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-12-02
|
6KB
|
281 lines
/*
* DJ - Print files to Deskjet+ 2 pages side-by-side landscape mode.
*
* DJ will output files to a HP Deskjet+ printer connected to the PAR:
* device. It prints 2 pages side-by-side by putting the printer into
* tiny print landscape mode. Each page has a header which include
* file modification time (or current time if redirected input),
* file name and page #.
*
* DJ [file1] [file2 ... fileN] OR
* DJ <redirected file
*
* DJ.C an Amiga page formatter for HP Deskjet Plus printer.
*
* Copywrite (c) 1990 Jeff Kunzelman
* CIS: 76224,102
*
* This software is freely redistributable, as long as all code,
* comments, and documentation are included unaltered, and no other
* conditions are imposed on its redistribution.
*
* This software is provided 'AS IS' if it doesn't work very well,
* sorry.
*
* Compiled and linked with Lattice/SAS Ver 5.10 'lc -L dj.c'
* Ignore the character const warnings.
*
* Modification History:
*
* 16-Oct-90 Jeff
* Ver 1.0 1st release.
*/
#include <stdio.h>
#include <dos.h>
#include <time.h>
typedef int bool;
#define IS_NIL(x) ((bool)((x) == NULL))
#define EOS '\0'
#define MAXPAGES 2
#define MAXROWS 90
#define MAXLINE 170
#define LHS 0
#define RHS 1
#define PAGE_END_COL 95
#define MIDDLE_COL (PAGE_END_COL + 5)
#define LAST_COL (MIDDLE_COL*2)
#define UNDERWIDTH 80
#define SEPCHAR 179
#define UNDERCHAR 196
#define TABWIDTH 4 /* Must be 4, 8, 16 ... */
static char *eosPtr = "";
static void
initPrinter(FILE *outHandle)
{
fprintf(outHandle, "\033&l1O"); /* landscape */
fprintf(outHandle, "\033&l4C");
fprintf(outHandle, "\033(s20hs6V\r");
}
static void
resetPrinter(FILE *outHandle)
{
fprintf(outHandle, "\033E");
}
static void
printLines(FILE *outHandle, char *lhsPtr, char *rhsPtr, bool doSep)
{
int tabCol;
int col;
int loc;
char c;
/*
* Reset current tab location and column pointer.
* Output the line expanding tabs as we go.
*/
for (tabCol = -1, loc = col = 0; col < PAGE_END_COL;) {
c = lhsPtr[loc];
if (c == '\n' || c == EOS)
break;
else if (c == '\t') {
if (tabCol == -1)
tabCol = TABWIDTH - (col & (TABWIDTH - 1));
else if (tabCol) {
fputc(' ', outHandle);
col++;
tabCol--;
} else {
tabCol = -1;
loc++;
}
} else {
fputc(c, outHandle);
col++;
loc++;
}
}
/*
* Check for RHS text, skip separator and line if none.
*/
if (*rhsPtr != EOS) {
/*
* Skip to center column.
*/
for (; col < MIDDLE_COL; col++)
fputc(' ', outHandle);
/*
* Print separator if requested.
*/
fputc(doSep ? SEPCHAR : ' ', outHandle);
/*
* Print an nice comfy gap
*/
fprintf(outHandle, " ");
/*
* Output the line expanding tabs as we go.
*/
for (tabCol = -1, loc = col = 0; col < PAGE_END_COL;) {
c = rhsPtr[loc];
if (c == '\n' || c == EOS)
break;
else if (c == '\t') {
if (tabCol == -1)
tabCol = TABWIDTH - (col & (TABWIDTH - 1));
else if (tabCol) {
fputc(' ', outHandle);
col++;
tabCol--;
} else {
tabCol = -1;
loc++;
}
} else {
fputc(c, outHandle);
col++;
loc++;
}
}
}
fprintf(outHandle, "\n\r");
}
static void
printFile(register FILE *inHandle, register FILE *outHandle,
char *name, char *fTime)
{
static char pageBuffer[MAXPAGES][MAXROWS][MAXLINE+1];
static char titleBuffer[MAXPAGES][MAXLINE+1];
register int bufPage;
register int line;
register bool eof;
int page = 1;
int col;
bool haveRHS;
do {
/*
* Read lines upto a full page buffer worth.
*/
for (eof = FALSE, bufPage = 0; bufPage < MAXPAGES && !eof; bufPage++)
{
/*
* Load a page worth of text.
*/
for (line = 0; line < MAXROWS && !eof; line++)
eof = IS_NIL(fgets(pageBuffer[bufPage][line],
MAXLINE, inHandle));
/*
* Terminate empty part of this page buffer.
*/
for (; line < MAXROWS; line++)
pageBuffer[bufPage][line][0] = EOS;
}
haveRHS = bufPage > 1;
/*
* Terminate empty part of next page if we hit EOF.
*/
for (; bufPage < MAXPAGES; bufPage++)
for (line = 0; line < MAXROWS; line++)
pageBuffer[bufPage][line][0] = EOS;
/*
* Output page title text header line.
*/
sprintf(titleBuffer[LHS], "%s File: %-39sPage %3d",
fTime, name, page);
sprintf(titleBuffer[RHS], "%s File: %-39sPage %3d",
fTime, name, page + 1);
printLines(outHandle, titleBuffer[LHS],
haveRHS ? titleBuffer[RHS] : eosPtr, FALSE);
/*
* Add in header division underline.
*/
for (col = 0; col < UNDERWIDTH; col++)
titleBuffer[LHS][col] = UNDERCHAR;
titleBuffer[LHS][col] = EOS;
printLines(outHandle, titleBuffer[LHS],
haveRHS ? titleBuffer[LHS] : eosPtr, FALSE);
fprintf(outHandle, "\n\n\r");
/*
* Output page text contents.
*/
for (line = 0; line < MAXROWS && pageBuffer[LHS][line] != EOS;
line++) {
printLines(outHandle, pageBuffer[LHS][line],
pageBuffer[RHS][line], TRUE);
}
/*
* Eject page and advance page count.
*/
fputc('\f', outHandle);
page += 2;
} while (!eof);
}
static char *
fileTime(long time)
{
return asctime(gmtime(&time));
}
static char *
sysTime(long time)
{
return ctime(&time);
}
void
main(int argc, char **argv)
{
FILE *fh;
FILE *oh;
char *timeString;
printf("\x9b1mDJ Ver 1.0\x9b0m (c) 1990 Jeff Kunzelman.\n");
if (IS_NIL(oh = fopen("par:", "w"))) {
fprintf(stderr, "Cannot open PAR: device for output.\n");
exit(1);
}
initPrinter(oh);
if (argc == 1) {
timeString = sysTime(time(NULL));
timeString[strlen(timeString) - 1] = EOS; /* strip \n from string */
printFile(stdin, oh, "Standard Input", timeString);
} else for (argc--, argv++; argc; argc--, argv++) {
fh = fopen(*argv, "r");
if (!IS_NIL(fh)) {
timeString = fileTime(getft(*argv));
timeString[strlen(timeString) - 1] = EOS;
printf("Printing: %s...\n", *argv);
printFile(fh, oh, *argv, timeString);
fclose(fh);
} else
fprintf(stderr, "Cannot open %s.\n", *argv);
}
resetPrinter(oh);
exit(0);
}