home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume6 / lbl / src / rescan.c < prev    next >
Encoding:
C/C++ Source or Header  |  1986-11-30  |  2.6 KB  |  149 lines

  1. /* (C) C.D.F. Miller, Heriot-Watt University, March 1984
  2.  *
  3.  *    Permission is hereby given to reproduce or modify this
  4.  *    software freely, provided that this notice be retained,
  5.  *    and that no use be made of the software for commercial
  6.  *    purposes without the express written permission of the
  7.  *    author.
  8.  */
  9.  
  10. /* rescan.c:
  11.  *    read temporary file, substituting for defined labels
  12.  */
  13.  
  14. #include    <lbl.h>
  15. #include    <ctype.h>
  16.  
  17. extern char    delimiter;
  18. extern char    *filename;
  19. extern FILE    *tempfile;
  20. extern long    fileline;
  21.  
  22. int    translate = 1;
  23.  
  24. rescan()
  25. {
  26.     rg int    c;
  27.         /* Keep tempfile, delimiter and translate flag in registers to
  28.          * speed up this routine; the last two need to be reloaded after
  29.          * and only after calls to domagic()
  30.          */
  31.     rg FILE *tf = tempfile;
  32.     rg int    dlm = delimiter;
  33.     rg int    tr = translate;
  34.  
  35.     while ((c = getc(tf)) != EOF)
  36.     {
  37.         if (c == MAGIC1)
  38.         {
  39.             if ((c = getc(tf)) == MAGIC2)
  40.             {
  41.                 domagic();
  42.                 dlm = delimiter;
  43.                 tr = translate;
  44.                 continue;
  45.             }
  46.             else
  47.                 ungetc(c, tf);
  48.         }
  49.         if (c == dlm && tr)
  50.         {
  51.             doreplace();
  52.             continue;
  53.         }
  54.         if (c == '\n')
  55.             fileline++;
  56.         putchar(c);
  57.     }
  58. }
  59.  
  60. domagic()
  61. {
  62.     int        c;
  63.     static char    buffer[BUFSIZ];
  64.  
  65.     switch (getc(tempfile))
  66.     {
  67.         case M_DELIM:
  68.             c = getc(tempfile);
  69.             if (c == '\n')
  70.                 translate = 0;
  71.             else
  72.             {
  73.                 translate = 1;
  74.                 delimiter = c;
  75.                 getc(tempfile);
  76.             }
  77.             break;
  78.         case M_FILE:
  79.             fgets(buffer, BUFSIZ, tempfile);
  80.             buffer[strlen(buffer)-1] = '\0';
  81.             filename = buffer;
  82.             fileline = 1;
  83.             break;
  84.     }
  85. }
  86.  
  87. doreplace()
  88. {
  89.     rg int        c;
  90.     char        typename[BUFSIZ];
  91.     char        labelname[BUFSIZ];
  92.     rg type        *tp;
  93.     rg label    *lp;
  94.  
  95.     /* <delimiter><delimiter> gives <delimiter> as output */
  96.     if ((c = getc(tempfile)) == delimiter)
  97.     {
  98.         putchar(delimiter);
  99.         return;
  100.     }
  101.     ungetc(c, tempfile);
  102.     getword(typename);
  103.     getword(labelname);
  104.     if ((c = getc(tempfile)) != delimiter)
  105.     {
  106.         error("malformed label reference");
  107.         while (c != delimiter)
  108.         {
  109.             if (c == EOF || c == '\n')
  110.                 break;
  111.             c = getc(tempfile);
  112.         }
  113.         return;
  114.     }
  115.     if ((tp = findtype(typename, 0)) == NULL)
  116.     {
  117.         error("undefined type '%s'", typename);
  118.         printf("<<%s %s>>", typename, labelname);
  119.         return;
  120.     }
  121.     if ((lp = findlabel(tp, labelname)) == NULL)
  122.     {
  123.         error("undefined label '%s'", labelname);
  124.         printf("<<%s %s>>", typename, labelname);
  125.         return;
  126.     }
  127.     printl(lp, stdout);
  128. }
  129.  
  130. getword(buffer)
  131.     rg char    *buffer;
  132. {
  133.     rg int    c;
  134.     rg int    dlm = delimiter;
  135.     rg FILE *tf = tempfile;
  136.  
  137.     c = getc(tf);
  138.     while (isspace(c))
  139.         c = getc(tf);
  140.     while (c != dlm && !isspace(c) && c != '\n' && c != EOF)
  141.     {
  142.         *buffer++ = c;
  143.         c = getc(tf);
  144.     }
  145.     *buffer = '\0';
  146.     if (!isspace(c) && c != EOF)
  147.         ungetc(c, tf);
  148. }
  149.