home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
RBBS in a Box Volume 1 #3.1
/
RBBSIABOX31.cdr
/
basw
/
bakprint.c
< prev
next >
Wrap
Text File
|
1985-05-13
|
6KB
|
181 lines
/*
BAKPRINT.C Vers 1.0 By Craig Derouen May 12,1985
Bakprint is a little printer utility that is most useful from printing
documents and other text files that have 'backspaces' inserted in the
text. These backspaces are inserted in the text to implement text
formatting such as undserscore or bold print. There are many printers out
there such as my OKI 92A that do not accept a backspace character. This
program is designed to filter out the backspaces and convert the format
to a readable one accepted by most any printer. This program was done out
of necessity because of all the un-forgiving PD author's who put out text
files with backspaces in them! Do they think we all have Epson FX-80's!!
The program works by reading a line of text into a buffer. When it encounters
a backspace, it will set a flag and save the next character and its position
for later manipulation. The line buffer is scanned up to a cr-lf set. Then
the line is printed out to the printer WITHOUT a linefeed. A cr is also
sent to the printer which will return the printer head back to the start of
the line, then the backspace/chars are output at their respective positions.
Spaces are inserted to produce a full line. The printer is advanced to the
next line and the process starts over. BAKPRINT will read in a file
specified. To read in a file from backprint type the following:
BAKPRINT (pathname) [(output pathname)]
Wild cards are not accepted at this time. Pathname is any legal DOS path
name. If no output pathname is specified, the output goes to the standard
printer output. If the input pathname can not be opened, the filter mode
will be set. If the output file already exists it will be re-written. If
the output name is illegal or can not be opened, output goes to printer.
As an additional feature this program will convert XENIX text files
(terminated with cr only) to a cr-lf terminator accepted by MS-DOS. Also
tabs are expanded, again because most printers can not accept tabs!
*/
#define vers 1.00
#include "stdio.h"
#include "ctype.h"
#define maxlen 132 /* Maximum length of line from input file */
#define true 1
#define false 0
#define lf 0x0a
#define cr 0x0d
#define bsp 0x08
#define tab 0x07
#define blank 0x20
#define tabpos 8 /* Spaces between tabs */
FILE *infile,*outfile;
int _fmode = 0x8000; /* Raw mode */
int testchar,outcount,backcount,line;
char outline[maxlen+1];
char bkspline[maxlen*2];
char testline[maxlen];
int linecount=0,charpos=0,backflag,notcon=false;
main (argc,argv)
int argc;
char *argv[];
{
if (argc < 2) { /* No files were specified so make us a filter */
infile = fopen(stdin,"r");
outfile = fopen(stdout,"w");
}
else if ((infile = fopen(argv[1],"r")) == NULL ) {
printf ("\007Sorry,bad filename\n");
exit (1);
}
if (argc > 2) {
if ((outfile = fopen(argv[2],"w")) == NULL ) {
outfile = fopen(stdout,"w"); /* to the console instead */
printf("\007Bad output file, output will goto console\n");
}
else notcon=true;
}
else outfile = fopen(stdout,"w");
if (notcon) printf("BAKPRINT Ver: %04f By Craig Derouen\n\n",vers);
while (!(feof(infile))) {
getline();
if (notcon) printf("\tNow printing line %d\r",linecount);
fputs(outline,outfile); /* print out the line minus backspaces */
backline(); /* Print any chars that were paired with backspaces */
putc (lf,outfile);
}
fclose(infile);
fclose(outfile);
if (notcon) printf("\n");
exit (0);
}
getline () {
int tabcount=0;
/* Read in a line of text and put it into the buffer. Strip
all the backspaces and their respective characters */
charpos=0; /* Starting fresh */
outcount=0; /* Number of chars in the line */
backcount=0;
backflag=false;
line=false;
while (((testchar=getc(infile)) != EOF ) && (!line)) {
switch(testchar) {
case cr : { /* We must be at the end of the line */
++linecount;
outline[outcount++]=testchar;
line=true;
break;
}
case lf : {
line=true;
break; /* Just swallow the linefeeds */
}
case bsp : { /* This is the one we are looking for */
backflag=true;
testchar=getc(infile); /* Get the next character */
if (testchar !=cr) {
bkspline[backcount++] = charpos; /* Get the current position */
bkspline[backcount++] = testchar; /* Put in the character */
}
else ungetc(testchar,infile); /* Put it back */
break;
}
case tab : { /* Expand any tabs */
tabcount=tabpos-(charpos & tabpos);
while (tabcount) {
outline[outcount++]=blank; /* Put in a blank */
charpos++;
tabcount--;
}
}
default : { /* the rest of the story */
outline[outcount++]=testchar; /* save it */
charpos++;
break;
}
}
}
outline[outcount++]=NULL;
}
backline() {
/* This function will print any characters that were paired with the
backspace key in the original line. They will be placed in their proper
position in the line */
int count=0,skip;
if (backflag) {
/* Create a string of blanks */
while (count < maxlen)
testline[count++]=blank;
count=0;
while (backcount) {
skip=bkspline[count++]; /* Get the char position */
testline[skip-1]=bkspline[count++];
backcount --;
backcount --;
}
testline[outcount++]=cr;
testline[outcount]=NULL;
fputs(testline,outfile);
}
}
b