From: att!mtunb!dmt@ucbvax.berkeley.edu (Dave Tutelman) Newsgroups: comp.sys.ibm.pc Subject: Re: Printer can't backspace (was Help with IBM Graphics Printer) Date: 13 Sep 88 13:40:47 GMT Summary: Here's a filter to solve the problem. randy@umn-cs.cs.umn.edu (Randy Orrison) writes: >Could someone tell me how to set up my IBM Personal Computer Graphics >Printer so that it understands what a backspace is, instead of just >ignoring it? ... I have a big document with >lots of _^Hs_^Ht_^Hu_^Hf_^Hf in it that I would really like to be able >to print. It also has IBM printer specific escape codes in it, so I can't >just use a different printer. Gee, that's the second such request I've seen this morning. I had the same problem last week with my AT&T 473 printer (a "clone"), and wrote a little filter that fixes the problem. It scans through a line at a time, and converts overstrikes to full-line overstrikes; backspace may not work on my printer, but carriage return does. I've attached the C source. I compiled it using Turbo 1.0, but it's vanilla C and even compiles on UNIX systems. I call it NOBS (for NO BackSpace). +---------------------------------------------------------------+ | Dave Tutelman | | Physical - AT&T Bell Labs - Lincroft, NJ | | Logical - ...att!mtunb!dmt | | Audible - (201) 576 2442 | +---------------------------------------------------------------+ /********************************************************************** * * This program is a filter to fix up text for a printer that * doesn't support BackSpace (NO BackSpace = NOBS). * It replaces backspace sequences with carriage return sequences. * * Dave Tutelman - September 1988 */ /* #define DEBUG */ #include #define LL 200 /* line length */ #define LD 8 /* line (overstrike) depth */ #define CR 13 #define LF 10 #define FF 12 #define VT 11 char line [LD] [LL]; int quit=0; main () { while ( !quit ) do_line (); } /*********************************************************************/ do_line () { int col=0; /* current column */ int c; /* current input character */ int eol=0; /* end of line.. "quit" for do_line */ clear_line (); /* zero out the array */ while (!eol) { /* get characters till end of line */ c = getchar (); switch (c) { case EOF: col=0; eol=1; quit=1; break; case FF: /* Form Feed - done with page */ case LF: /* Line Feed - done with line */ col=0; eol=1; break; case VT: /* Vertical Tab - no more line */ eol = 1; break; case CR: /* Carriage Return - back to col 0 */ col = 0; break; case '\t': /* Tab - move to good col */ col = (col / 8)*8 + 8; break; case '\b': /* BackSpace - back off a column */ if (col>0) col--; break; default: /* put c into lines [..] array */ insert_c (c, col); col ++; break; } } print_line (col); putchar (c); /* use same line-ender that we got */ } /********************************************************************** * clear the line[][] array to nulls */ clear_line () { int i,j; for (i=0; i= LL) /* past end of line */ return; for (d=0; d0) { putchar (CR); #ifdef DEBUG putchar (LF); #endif col = 0; } for (jmax=LL-1; jmax>=0; jmax--) if (line [i][jmax]) break; if (jmax < 0) break; for (j=col; j<=jmax; j++) { c = line [i] [j]; if (c == '\0') c = ' '; putchar (c); } } }