home *** CD-ROM | disk | FTP | other *** search
/ messroms.de / 2007-01-13_www.messroms.de.zip / VZ200 / TOOLS / ZCCSRC.ZIP / scc / preproc.c < prev    next >
C/C++ Source or Header  |  2000-03-06  |  6KB  |  442 lines

  1. /*    File preproc.c: 2.3 (84/11/27,11:47:40) */
  2. /*% cc -O -c %
  3.  *
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include "defs.h"
  9. #include "data.h"
  10. #include "proto.h"
  11.  
  12. /*
  13.  *    open an include file
  14.  */
  15. void doinclude(void)
  16. {
  17.     FILE *inp2;
  18.  
  19.     blanks();
  20.     if (NULL!=(inp2 = fixiname()))
  21.         if (inclsp < INCLSIZ)
  22.         {
  23.             inclstk[inclsp++] = input2;
  24.             input2 = inp2;
  25.         }
  26.         else
  27.         {
  28.             fclose(inp2);
  29.             error("too many nested includes");
  30.         }
  31.     else
  32.     {
  33.         error("Could not open include file");
  34.     }
  35.     kill();
  36. }
  37.  
  38. /*
  39.  *    fixiname - remove "brackets" around include file name
  40.  */
  41. FILE *fixiname(void)
  42. {
  43.     char c1, c2, *p, *ibp;
  44.     char buf[20];
  45.     FILE *fp;
  46.     char buf2[100];
  47.  
  48.     ibp = &buf[0];
  49.  
  50.     if ((c1 = gch()) != '"' && c1 != '<')
  51.         return (NULL);
  52.     for (p = line + lptr; *p;)
  53.         *ibp++ = *p++;
  54.     c2 = *(--p);
  55.     if (c1 == '"' ? (c2 != '"') : (c2 != '>'))
  56.     {
  57.         error("incorrect delimiter");
  58.         return (NULL);
  59.     }
  60.     *(--ibp) = 0;
  61.     fp = NULL;
  62.     if (c1 == '<' || !(fp = fopen(buf, "r")))
  63.     {
  64.         strcpy(buf2, DEFLIB);
  65.         strcat(buf2, buf);
  66.         fp = fopen(buf2, "r");
  67.     }
  68.     return (fp);
  69. }
  70.  
  71. /*
  72.  *    "asm" pseudo-statement
  73.  *
  74.  *    enters mode where assembly language statements are passed
  75.  *    intact through parser
  76.  *
  77.  */
  78. void doasm(void)
  79. {
  80.     cmode = 0;
  81.     for (;;)
  82.     {
  83.         xinline();
  84.         if (match("#endasm"))
  85.             break;
  86.         if (feof(input))
  87.             break;
  88.         outstr(line);
  89.         nl();
  90.     }
  91.     kill();
  92.     cmode = 1;
  93. }
  94.  
  95. /*
  96.  *    This one is called from the pseudo function asm("code")
  97.  */
  98.  
  99. void asmfunc(void)
  100. {
  101.     char c;
  102.  
  103.     needbrack("(");
  104.     if (!match(quote))
  105.     {
  106.         error("Missing opening \" in asm call");
  107.         return;
  108.     }
  109.     do
  110.     {
  111.         while (ch() != '"')
  112.         {
  113.             if (ch() == 0)
  114.                 break;
  115.             c = gch();
  116.             outbyte(c == '\\' ? spechar() : c);
  117.         }
  118.         gch();
  119.     } while (match(quote));
  120.     needbrack(")");
  121.     ns();
  122. }
  123.  
  124. void dodefine(void)
  125. {
  126.     addmac();
  127. }
  128.  
  129. void doundef(void)
  130. {
  131.     int mp;
  132.     char sname[NAMESIZE];
  133.  
  134.     if (!symname(sname))
  135.     {
  136.         illname();
  137.         kill();
  138.         return;
  139.     }
  140.  
  141.     if (0!=(mp = findmac(sname)))
  142.         delmac(mp);
  143.     kill();
  144. }
  145.  
  146. void preprocess(void)
  147. {
  148.     if (ifline())
  149.         return;
  150.     while (cpp())
  151.         ;
  152. }
  153.  
  154. void doifdef(int ifdef)
  155. {
  156.     char sname[NAMESIZE];
  157.     int k;
  158.  
  159.     blanks();
  160.     ++iflevel;
  161.     if (skiplevel)
  162.         return;
  163.     k = symname(sname) && findmac(sname);
  164.     if (k != ifdef)
  165.         skiplevel = iflevel;
  166. }
  167.  
  168. int ifline(void)
  169. {
  170.     for (;;)
  171.     {
  172.         xinline();
  173.         if (feof(input))
  174.             return (1);
  175.         if (match("#ifdef"))
  176.         {
  177.             doifdef(YES);
  178.             continue;
  179.         }
  180.         else
  181.         if (match("#ifndef"))
  182.         {
  183.             doifdef(NO);
  184.             continue;
  185.         }
  186.         else
  187.         if (match("#else"))
  188.         {
  189.             if (iflevel)
  190.             {
  191.                 if (skiplevel == iflevel)
  192.                     skiplevel = 0;
  193.                 else if (skiplevel == 0)
  194.                     skiplevel = iflevel;
  195.             }
  196.             else
  197.                 noiferr();
  198.             continue;
  199.         }
  200.         else
  201.         if (match("#endif"))
  202.         {
  203.             if (iflevel)
  204.             {
  205.                 if (skiplevel == iflevel)
  206.                     skiplevel = 0;
  207.                 --iflevel;
  208.             }
  209.             else
  210.                 noiferr();
  211.             continue;
  212.         }
  213.         if (!skiplevel)
  214.             return (0);
  215.     }
  216. }
  217.  
  218. void noiferr(void)
  219. {
  220.     error("no matching #if...");
  221. }
  222.  
  223.  
  224. int cpp(void)
  225. {
  226.     int k;
  227.     char c, sname[NAMESIZE];
  228.     int tog;
  229.     int cpped;                           /* non-zero if something expanded */
  230.  
  231.     cpped = 0;
  232.     /* don't expand lines with preprocessor commands in them */
  233.     if (!cmode || line[0] == '#')
  234.         return (0);
  235.  
  236.     mptr = lptr = 0;
  237.     while (ch())
  238.     {
  239.         if (ch() == ' ' || ch() == 9)
  240.         {
  241.             keepch(' ');
  242.             while (ch() == ' ' || ch() == 9)
  243.                 gch();
  244.         }
  245.         else
  246.         if (ch() == '"')
  247.         {
  248.             keepch(ch());
  249.             gch();
  250.             while (ch() != '"')
  251.             {
  252.                 if (ch() == 0)
  253.                 {
  254.                     error("missing quote");
  255.                     break;
  256.                 }
  257.                 if (ch() == '\\')
  258.                     keepch(gch());
  259.                 keepch(gch());
  260.             }
  261.             gch();
  262.             keepch('"');
  263.         }
  264.         else
  265.         if (ch() == 39)
  266.         {
  267.             keepch(39);
  268.             gch();
  269.             while (ch() != 39)
  270.             {
  271.                 if (ch() == 0)
  272.                 {
  273.                     error("missing apostrophe");
  274.                     break;
  275.                 }
  276.                 if (ch() == '\\')
  277.                     keepch(gch());
  278.                 keepch(gch());
  279.             }
  280.             gch();
  281.             keepch(39);
  282.         }
  283.         else
  284.         if (ch() == '/' && nch() == '*')
  285.         {
  286.             inchar();
  287.             inchar();
  288.             while ( !((c = ch()) == '*' && nch() == '/') )
  289.             {
  290.                 if (c == '$')
  291.                 {
  292.                     inchar();
  293.                     tog = TRUE;
  294.                     if (ch() == '-')
  295.                     {
  296.                         tog = FALSE;
  297.                         inchar();
  298.                     }
  299.                     if (alpha(c = ch()))
  300.                     {
  301.                         inchar();
  302.                         toggle(c, tog);
  303.                     }
  304.                 }
  305.                 else
  306.                 {
  307.                     if (ch() == 0)
  308.                         xinline();
  309.                     else
  310.                         inchar();
  311.                     if (feof(input))
  312.                         break;
  313.                 }
  314.             }
  315.             inchar();
  316.             inchar();
  317.         }
  318.         else
  319.         if (an(ch()))
  320.         {
  321.             k = 0;
  322.             while (an(ch()))
  323.             {
  324.                 if (k < NAMEMAX)
  325.                     sname[k++] = ch();
  326.                 gch();
  327.             }
  328.             sname[k] = 0;
  329.             if (0!=(k = findmac(sname)))
  330.             {
  331.                 cpped = 1;
  332.                 while (0!=(c = macq[k++]))
  333.                     keepch(c);
  334.             }
  335.             else
  336.             {
  337.                 k = 0;
  338.                 while (0!=(c = sname[k++]))
  339.                     keepch(c);
  340.             }
  341.         }
  342.         else
  343.             keepch(gch());
  344.     }
  345.     keepch(0);
  346.     if (mptr >= MPMAX)
  347.         error("line too long");
  348.     lptr = mptr = 0;
  349.     while (0!=(line[lptr++] = mline[mptr++]))
  350.         ;
  351.     lptr = 0;
  352.     return (cpped);
  353. }
  354.  
  355. char keepch(char c)
  356. {
  357.     mline[mptr] = c;
  358.     if (mptr < MPMAX)
  359.         mptr++;
  360.     return (c);
  361. }
  362.  
  363. void defmac(char *s)
  364. {
  365.     kill();
  366.     strcpy(line, s);
  367.     addmac();
  368. }
  369.  
  370. void addmac(void)
  371. {
  372.     char sname[NAMESIZE];
  373.     int k;
  374.     int mp;
  375.  
  376.     if (!symname(sname))
  377.     {
  378.         illname();
  379.         kill();
  380.         return;
  381.     }
  382.     if (0!=(mp = findmac(sname)))
  383.     {
  384.         error("Duplicate define");
  385.         delmac(mp);
  386.     }
  387.     k = 0;
  388.     while (putmac(sname[k++]))
  389.         ;
  390.     while (ch() == ' ' || ch() == 9)
  391.         gch();
  392.     while (putmac(gch()))
  393.         ;
  394.     if (macptr >= MACMAX)
  395.         error("macro table full");
  396. }
  397.  
  398. void delmac(int mp)
  399. {
  400.     --mp;
  401.     --mp;                               /* step over previous null */
  402.     while (mp >= 0 && macq[mp])
  403.         macq[mp--] = '%';
  404. }
  405.  
  406.  
  407. char putmac(char c)
  408. {
  409.     macq[macptr] = c;
  410.     if (macptr < MACMAX)
  411.         macptr++;
  412.     return (c);
  413. }
  414.  
  415. int findmac(char *sname)
  416. {
  417.     int k;
  418.  
  419.     k = 0;
  420.     while (k < macptr)
  421.     {
  422.         if (astreq(sname, macq + k, NAMEMAX))
  423.         {
  424.             while (macq[k++]) ;
  425.             return (k);
  426.         }
  427.         while (macq[k++]) ;
  428.         while (macq[k++]) ;
  429.     }
  430.     return NULL;
  431. }
  432.  
  433. void toggle(char name, int onoff)
  434. {
  435.     switch (name)
  436.     {
  437.     case 'C':
  438.         ctext = onoff;
  439.         break;
  440.     }
  441. }
  442.