home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume5 / smallc / part2 / lex.c < prev    next >
Encoding:
C/C++ Source or Header  |  1986-11-30  |  2.0 KB  |  173 lines

  1. /*    File lex.c: 2.1 (83/03/20,16:02:09) */
  2. /*% cc -O -c %
  3.  *
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include "defs.h"
  8. #include "data.h"
  9.  
  10. /*
  11.  *    semicolon enforcer
  12.  *
  13.  *    called whenever syntax requires a semicolon
  14.  *
  15.  */
  16. ns ()
  17. {
  18.     if (!match (";"))
  19.         error ("missing semicolon");
  20. }
  21.  
  22. junk ()
  23. {
  24.     if (an (inbyte ()))
  25.         while (an (ch ()))
  26.             gch ();
  27.     else
  28.         while (an (ch ())) {
  29.             if (ch () == 0)
  30.                 break;
  31.             gch ();
  32.         }
  33.     blanks ();
  34. }
  35.  
  36. endst ()
  37. {
  38.     blanks ();
  39.     return ((streq (line + lptr, ";") | (ch () == 0)));
  40. }
  41.  
  42. needbrack (str)
  43. char    *str;
  44. {
  45.     if (!match (str)) {
  46.         error ("missing bracket");
  47.         comment ();
  48.         outstr (str);
  49.         nl ();
  50.     }
  51. }
  52.  
  53. /*
  54.  *    test if given character is alpha
  55.  *
  56.  */
  57. alpha (c)
  58. char    c;
  59. {
  60.     c = c & 127;
  61.     return (((c >= 'a') & (c <= 'z')) |
  62.         ((c >= 'A') & (c <= 'Z')) |
  63.         (c == '_'));
  64. }
  65.  
  66. /*
  67.  *    test if given character is numeric
  68.  *
  69.  */
  70. numeric (c)
  71. char    c;
  72. {
  73.     c = c & 127;
  74.     return ((c >= '0') & (c <= '9'));
  75. }
  76.  
  77. /*
  78.  *    test if given character is alphanumeric
  79.  *
  80.  */
  81. an (c)
  82. char    c;
  83. {
  84.     return ((alpha (c)) | (numeric (c)));
  85. }
  86.  
  87. sstreq (str1) char *str1; {
  88.     return (streq(line + lptr, str1));
  89. }
  90.  
  91. streq (str1, str2)
  92. char    str1[], str2[];
  93. {
  94.     int    k;
  95.  
  96.     k = 0;
  97.     while (str2[k]) {
  98.         if ((str1[k] != str2[k]))
  99.             return (0);
  100.         k++;
  101.     }
  102.     return (k);
  103. }
  104.  
  105. astreq (str1, str2, len)
  106. char    str1[], str2[];
  107. int    len;
  108. {
  109.     int    k;
  110.  
  111.     k = 0;
  112.     while (k < len) {
  113.         if ((str1[k] != str2[k]))
  114.             break;
  115.         if (str1[k] == 0)
  116.             break;
  117.         if (str2[k] == 0)
  118.             break;
  119.         k++;
  120.     }
  121.     if (an (str1[k]))
  122.         return (0);
  123.     if (an (str2[k]))
  124.         return (0);
  125.     return (k);
  126. }
  127.  
  128. match (lit)
  129. char    *lit;
  130. {
  131.     int    k;
  132.  
  133.     blanks ();
  134.     if (k = streq (line + lptr, lit)) {
  135.         lptr = lptr + k;
  136.         return (1);
  137.     }
  138.     return (0);
  139. }
  140.  
  141. amatch (lit, len)
  142. char    *lit;
  143. int    len;
  144. {
  145.     int    k;
  146.  
  147.     blanks ();
  148.     if (k = astreq (line + lptr, lit, len)) {
  149.         lptr = lptr + k;
  150.         while (an (ch ()))
  151.             inbyte ();
  152.         return (1);
  153.     }
  154.     return (0);
  155. }
  156.  
  157. blanks ()
  158. {
  159.     FOREVER {
  160.         while (ch () == 0) {
  161.             preprocess ();
  162.             if (feof (input))
  163.                 break;
  164.         }
  165.         if (ch () == ' ')
  166.             gch ();
  167.         else if (ch () == 9)
  168.             gch ();
  169.         else
  170.             return;
  171.     }
  172. }
  173.