home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_07_02 / v7n2096c.txt < prev    next >
Text File  |  1988-12-15  |  4KB  |  188 lines

  1. #include <stdio.h>
  2.  
  3. #include "fsm.h"
  4.  
  5. #define DEBUG 1
  6.  
  7. int state;
  8. int token;
  9. int lex_val;
  10. FILE *infile, *outfile;
  11.  
  12. int count; /* how many spaces have I seen */
  13.  
  14. void report(void)
  15. {
  16. printf("\nState=%d, input=%d char=",state,token);
  17. }
  18.  
  19. /* a nasty kludge to get end of line markers */
  20. void putcr(int c, FILE *stream)
  21. {
  22. switch (c){
  23.   case '\n': putc(0x0d,stream);
  24.              putc(0x0a,stream);
  25.              break;
  26.   case 0x0d: break;
  27.   default:   putc(c,stream);
  28.   }
  29. }
  30.  
  31. int next_token(void)
  32. {
  33. do {
  34.    switch (lex_val=getc(infile)){
  35.      case '-':  return CAP;
  36.      case ' ':  return SPACE;
  37.      case 0x0a: lex_val = '\n';
  38.                 return NL;
  39.      case 0x0d: break; 
  40.         /*avoids 0d 0d 0a output */
  41.      case EOF:  lex_val = 0x1a;
  42.                 return FEND;
  43.      default:   if (toupper(lex_val) == lex_val) return CAP;
  44.                 else return OTHER;
  45.      }
  46.    } while (lex_val == 0x0d);
  47. return FORBID;
  48. }
  49.  
  50.  
  51. void usage(void)
  52. {
  53. printf("\nUSAGE: demo1 infile outfile");
  54. exit();
  55. }
  56.  
  57. void skip(void)
  58. { return; }
  59.  
  60. void echo(void)
  61. {
  62. #ifdef DEBUG
  63. if ((lex_val < ' ') || (lex_val > 'z')) putchar ('.');
  64. else putchar(lex_val);
  65. printf(" %2.2x",lex_val);
  66. #endif
  67. putcr(lex_val,outfile);
  68. count = 0;
  69. }
  70.  
  71. void fault(void)
  72. {
  73. printf("\nInternal error ");
  74. report();
  75. putchar(lex_val);
  76. exit();
  77. }
  78.  
  79. void tally(void)
  80. {
  81. count += 1;
  82. }
  83.  
  84. void markg(void)
  85. {
  86. putcr('\n',outfile);
  87. putc(lex_val,outfile);
  88. count = 0;
  89. }
  90.  
  91. void smarkg(void)
  92. {
  93. putcr('\n',outfile);
  94. while(count--) putc(' ',outfile);
  95. putc(lex_val,outfile);
  96. count = 0;
  97. }
  98.  
  99. void zero(void)
  100. {
  101. count = 0;
  102. }
  103.  
  104.  
  105. void secho(void)
  106. {
  107. putc(' ',outfile);
  108. putcr(lex_val,outfile);
  109.  
  110. #ifdef DEBUG
  111. printf(" %x", lex_val);
  112. #endif
  113.  
  114. count = 0;
  115. }
  116.  
  117. void init_fsm(int argc, char **argv)
  118. if (argc < 3) { 
  119.     usage(); /* exit from there */
  120.     } 
  121. if ((infile = fopen(argv[1],"r"))== NULL){
  122.     printf("Can't open %s",argv[1]);
  123.     exit();
  124.     }
  125. if ((outfile = fopen(argv[2],"w")) == NULL){
  126.     printf("Can't open %s", argv[2]);
  127.     exit();
  128.     }
  129.  
  130. /*initialize counter*/
  131. count = 0;
  132.  
  133. }
  134.  
  135. void fini_fsm(int argc, char **argv)
  136. fclose(infile);
  137. fclose(outfile);
  138. }
  139.  
  140. struct trans s_table[][MAX_ALPH]={
  141.    { /*Start*/
  142.       { /*empty*/  FORBID,  fault},
  143.       { /*CAP   */ SETEXT , echo },
  144.       { /*space */ START  , skip },
  145.       { /*fend  */ END    , skip },
  146.       { /*NL    */ START  , skip },
  147.       { /*other */ SETEXT , echo } },
  148.    { /*setext*/
  149.       { /*empty*/  FORBID,  fault},
  150.       { /*CAP   */ SETEXT , echo },
  151.       { /*space */ SESPC  , skip },
  152.       { /*fend  */ END    , skip },
  153.       { /*NL    */ LNEWG  , echo },
  154.       { /*other */ SETEXT , echo } },
  155.    { /*sespc*/
  156.       { /*empty*/  FORBID,  fault},
  157.       { /*CAP   */ SETEXT , secho},
  158.       { /*space */ SESPC  , skip },
  159.       { /*fend  */ END    , skip },
  160.       { /*NL    */ LNEWG  , echo },
  161.       { /*other */ SETEXT , secho} },
  162.    { /*secode*/
  163.       { /*empty*/  FORBID,  fault},
  164.       { /*CAP   */ SECODE , echo },
  165.       { /*space */ SECODE , echo },
  166.       { /*fend  */ END    , skip },
  167.       { /*NL    */ LNEWG  , echo },
  168.       { /*other */ SECODE , echo } },
  169.    { /*lnewg*/
  170.       { /*empty*/  FORBID,  fault},
  171.       { /*CAP   */ SETEXT , echo },
  172.       { /*space */ NGMARK , tally},
  173.       { /*fend  */ END    , skip },
  174.       { /*NL    */ NGMARK , zero },
  175.       { /*other */ SETEXT , echo } },
  176.    { /*ngmark*/
  177.       { /*empty*/  FORBID,  fault},
  178.       { /*CAP   */ SETEXT , markg},
  179.       { /*space */ NGMARK , tally},
  180.       { /*fend  */ END    , skip },
  181.       { /*NL    */ NGMARK , zero },
  182.       { /*other */ SECODE , smarkg} }
  183.  
  184.    };
  185.  
  186.