home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d1xx / d197 / nro.lha / Nro / prnro.c < prev    next >
C/C++ Source or Header  |  1989-03-28  |  3KB  |  196 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. char KosmoSoftID[] = "(@)# prnro.c 1.0 V14.04.88 (C) KosmoSoft";
  5.  
  6. /*
  7.  *    prnro.c
  8.  *
  9.  *    konverteer ANSI printerkodes naar epson-kode.
  10.  *    Alleen geschikt voor gebruik met NRO, omdat alleen
  11.  *    bold/italic/underline ondersteund worden.
  12.  *    Voor de aardigheid heb ik er ook nog NLQ aan/uit bij
  13.  *    gedaan.
  14.  *
  15.  *    Werkt van stdin naar stdout.
  16.  *
  17.  *    (C) Copyright KosmoSoft 1988
  18.  *
  19.  */
  20.  
  21. void AnsiToEpson(), DoEscape(), DoCSI(), CollectCommand();
  22. void DoSGR(), DoDEN(), Initialize();
  23. int CollectParameter();
  24.  
  25. FILE *in, *out;
  26.  
  27. int Parameter[8];
  28. int NumPars;
  29. int Command;
  30.  
  31. #define SGR    'm'
  32. #define DEN    '"'
  33.  
  34. #define    NBSP    0xA0
  35. #define ESC    0x1B
  36. #define CSI    0x9B
  37. #define CSI2    '['
  38.  
  39. main(argc, argv)
  40. int argc;
  41. char *argv[];
  42. {
  43.     in = stdin;
  44.     out = stdout;
  45.     AnsiToEpson();
  46. }
  47.  
  48. void AnsiToEpson()
  49. {
  50.     int chr;
  51.  
  52.     Initialize();    /* Start in bekende toestand */
  53.  
  54.     while ((chr = getc(in)) != EOF) {
  55.         switch (chr) {
  56.         case NBSP:
  57.             putc(' ', out);
  58.             continue;
  59.         case ESC:
  60.             DoEscape();
  61.             continue;
  62.         case CSI:
  63.             DoCSI();
  64.             continue;
  65.         default:
  66.             putc(chr, out);
  67.         }
  68.     }
  69.     
  70.     Initialize();    /* en laat geen rommel achter */
  71. }
  72.  
  73. void DoEscape()
  74. {
  75.     int chr;
  76.  
  77.     if ((chr = getc(in)) == CSI2) {
  78.         DoCSI();
  79.     } else if (chr != EOF) {
  80.         putc(chr, out);
  81.     }
  82. }
  83.  
  84. void DoCSI()
  85. {
  86.     CollectCommand();
  87.  
  88.     switch (Command) {
  89.     case SGR:
  90.         DoSGR();
  91.         break;
  92.     case DEN:
  93.         DoDEN();
  94.         break;
  95.     }
  96. }
  97.  
  98. void CollectCommand()
  99. {
  100.     register int chr;
  101.  
  102.     NumPars = 0;
  103.  
  104.     while ( (chr = CollectParameter()) == ';')
  105.         ;
  106.     
  107.     Command = chr;
  108. }
  109.  
  110. int CollectParameter()
  111. {
  112.     register int chr;
  113.     register int par;
  114.  
  115.     par = 0;
  116.  
  117.     while (isdigit(chr = getc(in))) {
  118.         par *= 10;
  119.         par += chr - '0';
  120.     }
  121.  
  122.     Parameter[NumPars++] = par;
  123.  
  124.     return chr;
  125. }
  126.  
  127. char SGR0[] = "\0335\033-0\033F",    /* normal characters */
  128.      SGR3[] = "\0334",            /* italics on */
  129.      SGR23[]= "\0335",            /*         off */
  130.      SGR4[] = "\033-1",            /* underline on */
  131.      SGR24[]= "\033-0",            /*           off */
  132.      SGR1[] = "\033E",            /* boldface on */
  133.      SGR22[]= "\033F";            /*          off */
  134.  
  135. void DoSGR()
  136. {
  137.     register int i;
  138.     register char *string = NULL;
  139.  
  140.     for (i = 0; i < NumPars; i++) {
  141.         switch (Parameter[i]) {
  142.         case 0:
  143.             string = SGR0;
  144.             break;
  145.         case 3:
  146.             string = SGR3;
  147.             break;
  148.         case 23:
  149.             string = SGR23;
  150.             break;
  151.         case 4:
  152.             string = SGR4;
  153.             break;
  154.         case 24:
  155.             string = SGR24;
  156.             break;
  157.         case 1:
  158.             string = SGR1;
  159.             break;
  160.         case 22:
  161.             string = SGR22;
  162.             break;
  163.         }
  164.         if (string)
  165.             fputs(string, out);
  166.     }
  167. }
  168.  
  169. char DEN1[] = "\033x0",        /* NLQ off */
  170.      DEN2[] = "\033x1",        /*     on */
  171.      DEN3[] = "\033H",        /* double strike off */
  172.      DEN4[] = "\033G";        /*               on */
  173.  
  174. char *DENs[] = {
  175.     "", DEN1, DEN2, DEN3, DEN4 
  176. };
  177.  
  178. void DoDEN()
  179. {
  180.     register int i;
  181.     register int den;
  182.  
  183.     for (i = 0; i < NumPars; i++) {
  184.         if ( (den = Parameter[i]) <= 4)
  185.             fputs(DENs[den], out);
  186.     }
  187. }
  188.  
  189.  
  190. char RIS[] = "\375\033@\375";
  191.  
  192. void Initialize()
  193. {
  194.     fputs(SGR0, out);
  195. }
  196.