home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume17 / pps / text.c < prev   
C/C++ Source or Header  |  1989-02-06  |  2KB  |  122 lines

  1. #ifndef lint
  2. static char rcsid[] = "$Header: text.c,v 0.0 88/06/22 05:22:51 on Rel $";
  3. #endif
  4. #include <stdio.h>
  5. #include <ctype.h>
  6. #include "pps.h"
  7. /*
  8.  * "Lexical analizer" for plain text (e.g. the output of nroff(1)):
  9.  * Prints _\b. and .\b_ in italics; c\bc in bold.
  10.  */
  11. FILE *yyin = stdin;
  12. FILE *yyout = stdout;
  13. char *keywords[1];
  14.  
  15. static
  16. struct ca {
  17.     char c;        /* character to print */
  18.     char a;        /* font to use */
  19. } ca[BUFSIZ];
  20.  
  21. #define ITALIC    'S'
  22. #define NORM    'I'
  23. #define BOLD    'K'
  24.  
  25. /*
  26.  * Add character c at position cap.
  27.  */
  28. static
  29. caput(c, cap)
  30. register c;
  31. register struct ca *cap;
  32. {
  33.     switch (cap->c) {
  34.         case '_':
  35.             cap->a = ITALIC;
  36.             break;
  37.         case '\0':
  38.         case ' ':
  39.             cap->a = NORM;
  40.             break;
  41.         default:
  42.             switch (c) {
  43.                 case '_':
  44.                     cap->a = ITALIC;
  45.                     return;
  46.                 default:
  47.                     if (cap->c == c)
  48.                         cap->a = BOLD;
  49.                 case ' ':
  50.                     break;
  51.             }
  52.     }
  53.     cap->c = c;
  54. }
  55.  
  56. /*
  57.  * Print text collected so far.
  58.  */
  59. static
  60. caflush(caend)
  61. struct ca *caend;
  62. {
  63.     char buf[BUFSIZ];
  64.     register struct ca *cap;
  65.     static struct ca zeroca;
  66.  
  67.     for (cap = ca; cap < caend;) {
  68.         register char *cp = buf;
  69.  
  70.         while (cap < caend && cap->a == *font) {
  71.             *cp++ = cap->c;
  72.             *cap++ = zeroca;
  73.         }
  74.         *cp = '\0';
  75.         echo(buf);
  76.         sput();
  77.         if (cap->a)
  78.             *font = cap->a;
  79.     }
  80. }
  81.  
  82. /*
  83.  * Process input text:
  84.  *    Call space() for [\t\n\f],
  85.  *    Save others in ca.
  86.  */
  87. yylex()
  88. {
  89.     register struct ca *cap = ca;
  90.     static char sp[2];
  91.  
  92.     for (;;) {
  93.         register c;
  94.  
  95.         while (isprint(c = getc(yyin)) || c == ' ')
  96.             caput(c, cap++);
  97.         
  98.         switch (c) {
  99.             default:
  100.                 continue;
  101.             case '\b':
  102.                 if (cap > ca)
  103.                     cap--;
  104.                 continue;
  105.             case '\r':    /* BUG -- won't work after \t */
  106.                 cap = ca;
  107.                 continue;
  108.             case '\t':
  109.             case '\n':
  110.             case '\f':
  111.             case EOF:
  112.                 break;
  113.         }
  114.         caflush(cap);
  115.         cap = ca;
  116.         if (c == EOF)
  117.             return;
  118.         *sp = c;
  119.         space(sp);
  120.     }
  121. }
  122.