home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast.iso / printer / nobs.c < prev    next >
Internet Message Format  |  1994-03-05  |  4KB

  1. From: att!mtunb!dmt@ucbvax.berkeley.edu (Dave Tutelman)
  2. Newsgroups: comp.sys.ibm.pc
  3. Subject: Re: Printer can't backspace (was Help with IBM Graphics Printer)
  4. Date: 13 Sep 88 13:40:47 GMT
  5. Summary: Here's a filter to solve the problem.
  6.  
  7. randy@umn-cs.cs.umn.edu (Randy Orrison) writes:
  8. >Could someone tell me how to set up my IBM Personal Computer Graphics
  9. >Printer so that it understands what a backspace is, instead of just
  10. >ignoring it? ...  I have a big document with
  11. >lots of _^Hs_^Ht_^Hu_^Hf_^Hf in it that I would really like to be able
  12. >to print.  It also has IBM printer specific escape codes in it, so I can't
  13. >just use a different printer.
  14.  
  15. Gee, that's the second such request I've seen this morning.  I had the
  16. same problem last week with my AT&T 473 printer (a "clone"), and wrote a
  17. little filter that fixes the problem.  It scans through a line at a
  18. time, and converts overstrikes to full-line overstrikes; backspace may
  19. not work on my printer, but carriage return does.
  20.  
  21. I've attached the C source.  I compiled it using Turbo 1.0, but it's
  22. vanilla C and even compiles on UNIX systems.  I call it NOBS (for NO
  23. BackSpace).
  24.  
  25. +---------------------------------------------------------------+
  26. |    Dave Tutelman                        |
  27. |    Physical - AT&T Bell Labs  -  Lincroft, NJ            |
  28. |    Logical -  ...att!mtunb!dmt                |
  29. |    Audible -  (201) 576 2442                    |
  30. +---------------------------------------------------------------+
  31. /**********************************************************************
  32.  *
  33.  *    This program is a filter to fix up text for a printer that
  34.  *    doesn't support BackSpace (NO BackSpace = NOBS).
  35.  *    It replaces backspace sequences with carriage return sequences.
  36.  *
  37.  *    Dave Tutelman - September 1988
  38.  */
  39.  
  40. /*    #define    DEBUG    */
  41.  
  42. #include <stdio.h>
  43.  
  44. #define    LL    200    /* line length */
  45. #define    LD    8    /* line (overstrike) depth */
  46. #define    CR    13
  47. #define    LF    10
  48. #define    FF    12
  49. #define    VT    11
  50.  
  51. char    line [LD] [LL];
  52. int    quit=0;
  53.  
  54. main ()
  55. {
  56.     while ( !quit )
  57.         do_line ();
  58. }
  59.  
  60. /*********************************************************************/
  61.  
  62. do_line ()
  63. {
  64.     int    col=0;        /* current column */
  65.     int    c;        /* current input character */
  66.     int    eol=0;        /* end of line.. "quit" for do_line */
  67.  
  68.     clear_line ();        /* zero out the array */
  69.  
  70.     while (!eol) {        /* get characters till end of line */
  71.         c = getchar ();
  72.         switch (c) {
  73.           case EOF:
  74.             col=0;
  75.             eol=1;
  76.             quit=1;
  77.             break;
  78.  
  79.           case FF:        /* Form Feed - done with page */
  80.           case LF:        /* Line Feed - done with line */
  81.             col=0;
  82.             eol=1;
  83.             break;
  84.  
  85.           case VT:        /* Vertical Tab - no more line */
  86.             eol = 1;
  87.             break;
  88.  
  89.           case CR:        /* Carriage Return - back to col 0 */
  90.             col = 0;
  91.             break;
  92.  
  93.           case '\t':        /* Tab - move to good col */
  94.             col = (col / 8)*8 + 8;
  95.             break;
  96.  
  97.           case '\b':        /* BackSpace - back off a column */
  98.             if (col>0) col--;
  99.             break;
  100.  
  101.           default:        /* put c into lines [..] array */
  102.             insert_c (c, col);
  103.             col ++;
  104.             break;
  105.         }
  106.     }
  107.  
  108.     print_line (col);
  109.     putchar (c);        /* use same line-ender that we got */
  110. }
  111.  
  112. /**********************************************************************
  113.  *    clear the line[][] array to nulls
  114.  */
  115.  
  116. clear_line ()
  117. {
  118.     int    i,j;
  119.  
  120.     for (i=0; i<LD; i++)
  121.         for (j=0; j<LL; j++)
  122.             line [i][j] = '\0';
  123. }
  124.  
  125. /**********************************************************************
  126.  *    Put c into the line[..] array at column n.
  127.  */
  128.  
  129. insert_c (c, n)
  130.   char    c;
  131.   int    n;
  132. {
  133.     int    d;
  134.  
  135.     if (n >= LL)        /* past end of line */
  136.         return;
  137.  
  138.     for (d=0; d<LD-1; d++)        /* how deep? */
  139.         if (line [d][n] == '\0')
  140.             break;
  141.  
  142.     line [d][n] = c;
  143. }
  144.  
  145. /**********************************************************************
  146.  *    The line is done. Put to stdout from line[..] array.
  147.  */
  148.  
  149. print_line (col)
  150.   int    col;
  151. {
  152.     int    i,j;
  153.     int    jmax;
  154.     char    c;
  155.  
  156.     for (i=0; i<LD; i++) {
  157.         if (i>0) {
  158.             putchar (CR);
  159. #ifdef DEBUG
  160.             putchar (LF);
  161. #endif
  162.             col = 0;
  163.         }
  164.  
  165.         for (jmax=LL-1; jmax>=0; jmax--)
  166.             if (line [i][jmax])  break;
  167.         if (jmax < 0)  break;
  168.  
  169.         for (j=col; j<=jmax; j++) {
  170.             c = line [i] [j];
  171.             if (c == '\0')
  172.                 c = ' ';
  173.             putchar (c);
  174.         }
  175.     }
  176. }
  177.