home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume27 / genmake / part01 / cpp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-01-17  |  5.3 KB  |  307 lines

  1. /* cpp.c */
  2.  
  3. #include <stdio.h>
  4. #include "types.h"
  5.  
  6. /* quick (and growing :-( ) hack to get a cpp front end going */
  7.  
  8. cpp_parse(buf,cpp_stack,symtab)
  9. char        *buf;
  10. CPPN        **cpp_stack;
  11. SYMENT        **symtab;
  12. {
  13.     char        tok[BUFSIZE];
  14.     char        tok2[BUFSIZE];
  15.     int        cp = 0;
  16.  
  17.     if (buf[0] != '#')
  18.         return(0);
  19.     if ((cp = gettok(NULL,buf,tok,cp,NULL,NULL)) < 0)
  20.         return(0);
  21.     if ((cp = gettok(NULL,buf,tok,cp,NULL,NULL)) < 0)
  22.         return(0);
  23.     if (!strcmp("define",tok) && cpp_useline(cpp_stack)) {
  24.         if ((cp = gettok(NULL,buf,tok,cp,NULL,NULL)) < 0)
  25.             return(0);
  26.         add_sym(symtab,tok);
  27.     }
  28.     else if (!strcmp("undef",tok) && cpp_useline(cpp_stack)) {
  29.         if ((cp = gettok(NULL,buf,tok,cp,NULL,NULL)) < 0)
  30.             return(0);
  31.         del_sym(symtab,tok);
  32.     }
  33.     else if (!strcmp("ifdef",tok) && cpp_useline(cpp_stack)) {
  34. #ifdef DEBUG
  35.         printf("#ifdef\n");
  36. #endif
  37.         if ((cp = gettok(NULL,buf,tok,cp,NULL,NULL)) < 0)
  38.             return(0);
  39.         if (find_sym(symtab,tok))
  40.             push_if(cpp_stack,1);
  41.         else
  42.             push_if(cpp_stack,0);
  43.     }
  44.     else if (!strcmp("ifndef",tok) && cpp_useline(cpp_stack)) {
  45. #ifdef DEBUG
  46.         printf("#ifndef\n");
  47. #endif
  48.         if ((cp = gettok(NULL,buf,tok,cp,NULL,NULL)) < 0)
  49.             return(0);
  50.         if (!find_sym(symtab,tok))
  51.             push_if(cpp_stack,1);
  52.         else
  53.             push_if(cpp_stack,0);
  54.     }
  55.     else if (!strcmp("if",tok) && cpp_useline(cpp_stack)) {
  56. #ifdef DEBUG
  57.         printf("#if\n");
  58. #endif
  59.         /* fprintf(stderr,"Warning:  #if not supported\n"); */
  60.         push_if(cpp_stack,0);
  61.     }
  62.     else if (!strcmp("else",tok)) {
  63. #ifdef DEBUG
  64.         printf("#else\n");
  65. #endif
  66.         set_else(cpp_stack);
  67.     }
  68.     else if (!strcmp("endif",tok)) {
  69. #ifdef DEBUG
  70.         printf("#endif\n");
  71. #endif
  72.         pop_if(cpp_stack);
  73.     }
  74.     else if (!strcmp("include",tok) && cpp_useline(cpp_stack)) {
  75.         if ((cp = gettok(NULL,buf,tok,cp,NULL,NULL)) < 0)
  76.             return(0);
  77.         if (tok[0] == '<') {
  78.             char    itok[BUFSIZE];
  79.  
  80.             itok[0] = '\0';
  81.             if ((cp = gettok(NULL,buf,tok,cp,NULL,NULL)) < 0)
  82.                 return(0);
  83.             while (tok[0] != '>') {
  84.                 strcat(itok,tok);
  85.                 if ((cp = gettok(NULL,buf,tok,cp,NULL,NULL)) < 0)
  86.                     return(0);
  87.             }
  88.             sprintf(tok2,"/usr/include/%s",itok);
  89.             if (!cpp_include(cpp_stack,symtab,tok2))
  90.                 return(-1);
  91.         } else if (tok[0] == '\"') {
  92.             int i;
  93.             
  94.             for (i = 1; tok[i] != '\"' && tok[i] != NULL; i++)
  95.                 tok2[i-1] = tok[i];
  96.             tok2[i-1] = NULL;
  97.             if (!cpp_include(cpp_stack,symtab,tok2)) {
  98.                 sprintf(tok,"/usr/include/%s",tok2);
  99.                 if (!cpp_include(cpp_stack,symtab,tok))
  100.                     return(-1);
  101.             }
  102.         }
  103.     }
  104.     return(1);
  105. }
  106.  
  107. cpp_useline(cpp_stack)
  108. CPPN        **cpp_stack;
  109. {
  110.     CPPN        *cur;
  111.  
  112.     if (*cpp_stack == NULL) {
  113.         return(1);
  114.     }
  115.     cur = *cpp_stack;
  116.     if (cur->expr_val != 0 && cur->in_else == 0) {
  117.         return(1);
  118.     }
  119.     else if (cur->expr_val == 0 && cur->in_else != 0) {
  120.         return(1);
  121.     }
  122.     else {
  123.         return(0);
  124.     }
  125. }
  126.  
  127. cpp_rel(cpp_stack,symtab)
  128. CPPN        **cpp_stack;
  129. SYMENT        **symtab;
  130. {
  131.     CPPN    *cur;
  132.     CPPN    *next;
  133.     SYMENT    *scur;
  134.     SYMENT    *snext;
  135.  
  136.     cur = *cpp_stack;
  137.     while (cur != NULL) {
  138.         next = cur->next;
  139.         free(cur);
  140.         cur = next;
  141.     }    
  142.     free(cpp_stack);
  143.     scur = *symtab;
  144.     while (scur != NULL) {
  145.         snext = scur->next;
  146.         free(scur->name);
  147.         free(scur);
  148.         scur = snext;
  149.     }
  150.     free(symtab);
  151. }
  152.  
  153. add_sym(symtab,name)
  154. SYMENT        **symtab;
  155. char        *name;
  156. {
  157.     SYMENT        *cur;
  158.     SYMENT        *prev;
  159.     SYMENT        *new;
  160.  
  161.     if (find_sym(symtab,name) != NULL)
  162.         return(1);
  163.     prev = NULL;
  164.     cur = *symtab;
  165.     while (cur != NULL) {
  166.         prev = cur;
  167.         if (!strcmp(cur->name,name))
  168.             break;
  169.         cur = cur->next;
  170.     }
  171.     if (cur != NULL)
  172.         return(1);
  173.     new = (SYMENT *)malloc(sizeof(SYMENT));
  174.     new->name = (char *)malloc(strlen(name)+1);
  175.     strcpy(new->name,name);
  176.     new->next = NULL;
  177.     if (prev == NULL)
  178.         *symtab = new;
  179.     else
  180.         prev->next = new;
  181.     return(1);
  182. }
  183.  
  184. del_sym(symtab,name)
  185. SYMENT        **symtab;
  186. char        *name;
  187. {
  188.     SYMENT        *cur;
  189.     SYMENT        *prev;
  190.  
  191.     prev = NULL;
  192.     cur = *symtab;
  193.     while (cur != NULL) {
  194.         if (!strcmp(cur->name,name))
  195.             break;
  196.         prev = cur;
  197.         cur = cur->next;
  198.     }
  199.     if (cur == NULL)
  200.         return(0);
  201.     if (prev == NULL) {
  202.         free(cur->name);
  203.         free(cur);
  204.         *symtab = NULL;
  205.     }
  206.     else {
  207.         prev->next = cur->next;
  208.         free(cur->name);
  209.         free(cur);
  210.     }
  211.     return(1);
  212. }
  213.  
  214. find_sym(symtab,name)
  215. SYMENT        **symtab;
  216. char        *name;
  217. {
  218.     SYMENT        *cur;
  219.  
  220.     cur = *symtab;
  221.     while (cur != NULL) {
  222. #ifdef DEBUG
  223.         printf("cur->name = '%s'\n",cur->name);
  224. #endif
  225.         if (!strcmp(cur->name,name))
  226.             break;
  227.         cur = cur->next;
  228.     }
  229.     if (cur != NULL)
  230.         return(1);
  231.     return(0);
  232. }
  233.  
  234. push_if(cpp_stack,val)
  235. CPPN        **cpp_stack;
  236. int        val;
  237. {
  238.     CPPN        *new;
  239.  
  240.     new = (CPPN *)malloc(sizeof(CPPN));
  241.     new->expr_val = val;
  242.     new->in_else = 0;
  243.     new->next = *cpp_stack;
  244.     *cpp_stack = new;
  245. }
  246.  
  247. set_else(cpp_stack)
  248. CPPN        **cpp_stack;
  249. {
  250.     CPPN        *cur;
  251.  
  252.     cur = *cpp_stack;
  253.     if (cur == NULL) {
  254. /*
  255.         fprintf(stderr,"#else without matching #if[[n]def]\n");
  256. */
  257.         return;
  258.     }
  259.     cur->in_else = 1;
  260. }
  261.  
  262. pop_if(cpp_stack)
  263. CPPN        **cpp_stack;
  264. {
  265.     CPPN        *next;
  266.     CPPN        *cur;
  267.  
  268.     cur = *cpp_stack;
  269.     if (cur == NULL) {
  270. /*
  271.         fprintf(stderr,"#endif without matching #if[[n]def]\n");
  272. */
  273.         return;
  274.     }
  275.     next = cur->next;
  276.     free(cur);
  277.     *cpp_stack = next;
  278. }
  279.  
  280. cpp_include(cpp_stack,symtab,name)
  281. CPPN        **cpp_stack;
  282. SYMENT        **symtab;
  283. char        *name;
  284. {
  285.     char        buf[BUFSIZE];
  286.     char        tok[BUFSIZE];
  287.     int        cp;
  288.     FILE        *fp;
  289.  
  290. #ifdef DEBUG
  291.     printf("#include file = '%s'\n",name);
  292. #endif
  293.     if ((fp = fopen(name,"r")) == NULL) {
  294.         fprintf(stderr,"cpp_include():  can't open file '%s'\n",name);
  295.         return(0);
  296.     }
  297.     buf[0] = NULL;
  298.     cp = 0;
  299.     while ((cp = gettok(fp,buf,tok,cp,cpp_stack,symtab)) >= 0)
  300.         ;
  301. #ifdef DEBUG
  302.     printf("ending #include file = '%s'\n",name);
  303. #endif
  304.     fclose(fp);
  305.     return(1);
  306. }
  307.