home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / utils / asmutl / make-ds.lbr / MACRO.CQ / MACRO.C
Encoding:
C/C++ Source or Header  |  1986-09-04  |  2.5 KB  |  131 lines

  1. /* File MACRO.C BDS-C Ver 1.0 03Apr85 */
  2. #include <bdscio.h>
  3. #include "make.h"
  4.  
  5. /*
  6.  * Macro processing
  7.  */
  8.  
  9.  
  10. /*
  11.  * Perform macro substitution from 'orig' to 'dest'.
  12.  * Return number of macro substitutions made.
  13.  * A macro reference is in one of two forms:
  14.  *        <MACCHAR>(macro-name)
  15.  *      or    <MACCHAR><single-character>
  16.  *
  17.  * "<MACCHAR><MACCHAR>" expands to a single '<MACCHAR>'
  18.  */
  19. mexpand(orig, dest, destsiz, macchar)
  20. char *orig, *dest;
  21. int destsiz;
  22. char macchar;
  23. {
  24.     char *s, *d, mname[STRSIZ];
  25.     int di, count;
  26.     MACRO *m;
  27.  
  28.     di = count = 0;
  29.     for(s=orig; *s;)
  30.         if(*s == macchar)
  31.         {
  32.             if(*++s == macchar)
  33.             {
  34.                 if(di < destsiz-1) dest[di++] = *s++;
  35.                 continue;
  36.             }
  37.  
  38.             if(!*s) break;
  39.             d = mname;
  40.             if(*s != '(') *d++ = *s++;
  41.             else
  42.             {
  43.                 for(++s; *s && *s!=')';) *d++ = *s++;
  44.                 if(*s != ')') puts("Missed matching ')'");
  45.                 else ++s;
  46.             }
  47.             *d = 0;
  48.             if((d = gmacro(mname)) == NULL)
  49.                 printf("Undefined macro: %s\n", mname);
  50.             else
  51.             {
  52.                 while(*d && di < (destsiz - 1))
  53.                     dest[di++] = *d++;
  54.                 ++count;
  55.             }
  56.         } else if(di < destsiz-1)
  57.             dest[di++] = *s++;
  58.  
  59.     dest[di]=0;
  60.     return count;
  61. }
  62.  
  63.  
  64. /*
  65.  * Define a macro.
  66.  * Give the macro called 'name' the string expansion 'def'.
  67.  * Old macro-names are superseded, NOT replaced.
  68.  * Return ERROR if can't define the macro.
  69.  */
  70. defmac(name, def)
  71. char *name, *def;
  72. {
  73.     MACRO *m;
  74.  
  75.     if((m = /*(MACRO *)*/alloc(sizeof *m)) == NULL) allerr();
  76.     if((m->mname = /*(char *)*/alloc(strlen(name)+1)) == NULL) allerr();
  77.     if((m->mvalue = /*(char *)*/alloc(strlen(def)+1)) == NULL) allerr();
  78.  
  79.     strcpy(m->mname, name);
  80.     strcpy(m->mvalue, def);
  81.     m->mnext = mroot;
  82.     mroot = m;
  83. }
  84.  
  85.  
  86. /*
  87.  * undefmac - undefine a macro.
  88.  * Return 0 if macro was succesfully undefined, -1 if not found.
  89.  */
  90. undefmac(name)
  91. char *name;
  92. {
  93.     MACRO *m;
  94.     MACRO *prev;
  95.  
  96.     m = mroot;
  97.     prev = NULL;
  98.  
  99.     while(m != NULL && !strcieq(name, m->mname))
  100.     {
  101.         prev = m;
  102.         m = m->mnext;
  103.     }
  104.  
  105.     if(m == NULL) return -1;
  106.     if(prev == NULL) mroot = m->mnext;
  107.         else prev->mnext = m->mnext;
  108.  
  109.     free(m->mname);
  110.     free(m->mvalue);
  111.     free(m);
  112.     return 0;
  113. }
  114.  
  115.  
  116. /*
  117.  * Lookup a macro called 'name'.
  118.  * Return a pointer to its definition,
  119.  * or NULL if it does not exist.
  120.  */
  121. char *gmacro(name)
  122. char *name;
  123. {
  124.     MACRO *m;
  125.  
  126.     for(m=mroot; m != NULL; m=m->mnext)
  127.         if(strcieq(name, m->mname)) return m->mvalue;
  128.     return NULL;
  129. }
  130. 
  131.