home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Lib / util / expand.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  2.6 KB  |  145 lines

  1. /* expand.c */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Lib/util/RCS/expand.c,v 6.0 1991/12/18 20:25:18 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Lib/util/RCS/expand.c,v 6.0 1991/12/18 20:25:18 jpo Rel $
  9.  *
  10.  * $Log: expand.c,v $
  11.  * Revision 6.0  1991/12/18  20:25:18  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include "util.h"
  19. #include "expand.h"
  20.  
  21. /*
  22.  *            E X P A N D . C
  23.  *
  24.  *    Expand expands a text string expanding macros provided
  25.  *  in a vector of key and value pairs.
  26.  *
  27.  *  e.g.    expand(buf, "$A+$B=$(RESULT)", array)
  28.  *  with    Expand array[] = {"A", "1",
  29.  *                 "B", "2",
  30.  *                 "RESULT", "3",
  31.  *                 0, 0};
  32.  *  gives    "1+2=3" in buf.
  33.  *
  34.  *  wja@uk.ac.nott.maths        Wed Feb 22 15:00:26 GMT 1984
  35.  *  DPK@BRL, 13 Apr 84    Made more portable and changed array usage.
  36.  *  jpo@cs.nott.ac.uk 18 July 1989    Changed to structure.
  37.  *  pac@cs.nott.ac.uk             Mon Mar 12 19:54:39 1990
  38.  *                    added expand_dyn
  39.  */
  40.  
  41.  
  42. static  char *exname(), *exlookup();
  43.  
  44. #define    INC    BUFSIZ
  45.  
  46. char *expand_dyn(fmt, macros)
  47. char    *fmt;
  48. Expand    macros[];
  49. {
  50.     register char *bp = NULLCP, *cp;
  51.     int    ix = 0, len = 0;
  52.     char    name[LINESIZE];
  53.  
  54.     bp = (char *) malloc(INC * sizeof(*bp));
  55.     len += INC;
  56.  
  57.     while (fmt && *fmt) {
  58.         if (ix >= len) {
  59.             /* resize */
  60.             len += INC;
  61.             bp = (char *) realloc(bp, (unsigned)(len*sizeof(char)));
  62.         }
  63.         if (*fmt != '$') 
  64.             bp[ix++] =  *fmt++;
  65.         else if (*++fmt == '$')
  66.             bp[ix++] = *fmt++;
  67.         else {
  68.             fmt = exname(name, fmt);
  69.             cp = exlookup (name, macros);
  70.             while (cp && *cp) {
  71.                 if (ix >= len) {
  72.                     /* resize */
  73.                     len += INC;
  74.                     bp = (char *) realloc(bp, 
  75.                                   (unsigned)(len*sizeof(char)));
  76.                 }
  77.                 bp[ix++] = *cp++;
  78.             }
  79.         }
  80.     }
  81.     if (ix >= len) {
  82.         /* resize */
  83.         len += INC;
  84.         bp = (char *) realloc(bp, (unsigned)(len*sizeof(char)));
  85.     }
  86.     bp[ix] = '\0';
  87.     len = strlen(bp);
  88.     bp = (char *) realloc(bp, (unsigned) ((len+1)*sizeof(char)));
  89.     return bp;
  90. }
  91.  
  92. char *expand(buf, fmt, macros)
  93. char *buf, *fmt;
  94. Expand macros[];
  95. {
  96.     register char *bp = buf, *cp;
  97.     char name[LINESIZE];
  98.  
  99.     while(fmt && *fmt) {
  100.         if(*fmt != '$')
  101.             *bp++ = *fmt++;
  102.         else if(*++fmt == '$')
  103.             *bp++ = *fmt++;
  104.         else {
  105.             fmt = exname(name, fmt);
  106.             cp = exlookup(name, macros);
  107.             while(cp && *cp)
  108.                 *bp++ = *cp++;
  109.         }
  110.     }
  111.     *bp = '\0';
  112.     return buf;
  113. }
  114.  
  115. static char *
  116. exname(buf, str)
  117. register char *buf, *str;
  118. {
  119.     if(*str == '(') {
  120.         str++;
  121.         while(*str != ')' && *str != '\0')
  122.             *buf++ = *str++;
  123.         if(*str != '\0')
  124.             str++;
  125.     }
  126.     else
  127.         *buf++ = *str++;
  128.     *buf = '\0';
  129.     return str;
  130. }
  131.  
  132. static char *
  133. exlookup(name, list)
  134. register char *name;
  135. Expand list[];
  136. {
  137.     register Expand *ep;
  138.  
  139.     for (ep = list; ep -> macro; ep++) {
  140.         if(lexequ(name, ep -> macro) == 0)
  141.             return (ep -> expansion);
  142.     }
  143.     return ("");
  144. }
  145.