|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T e
Length: 2769 (0xad1) Types: TextFile Names: »expand.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« └─⟦e5a54fb17⟧ └─⟦this⟧ »pp-5.0/Lib/util/expand.c«
/* expand.c */ # ifndef lint static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Lib/util/RCS/expand.c,v 5.0 90/09/20 16:17:15 pp Exp Locker: pp $"; # endif /* * $Header: /cs/research/pp/hubris/pp-beta/Lib/util/RCS/expand.c,v 5.0 90/09/20 16:17:15 pp Exp Locker: pp $ * * $Log: expand.c,v $ * Revision 5.0 90/09/20 16:17:15 pp * rcsforce : 5.0 public release * */ #include "util.h" #include "expand.h" /* * E X P A N D . C * * Expand expands a text string expanding macros provided * in a vector of key and value pairs. * * e.g. expand(buf, "$A+$B=$(RESULT)", array) * with Expand array[] = {"A", "1", * "B", "2", * "RESULT", "3", * 0, 0}; * gives "1+2=3" in buf. * * wja@uk.ac.nott.maths Wed Feb 22 15:00:26 GMT 1984 * DPK@BRL, 13 Apr 84 Made more portable and changed array usage. * jpo@cs.nott.ac.uk 18 July 1989 Changed to structure. * pac@cs.nott.ac.uk Mon Mar 12 19:54:39 1990 * added expand_dyn */ static char *exname(), *exlookup(); #define INC BUFSIZ char *expand_dyn(fmt, macros) char *fmt; Expand macros[]; { register char *bp = NULLCP, *cp; int ix = 0, len = 0; char name[LINESIZE]; bp = (char *) malloc(INC * sizeof(*bp)); len += INC; while (fmt && *fmt) { if (ix >= len) { /* resize */ len += INC; bp = (char *) realloc(bp, (unsigned)(len*sizeof(char))); } if (*fmt != '$') bp[ix++] = *fmt++; else if (*++fmt == '$') bp[ix++] = *fmt++; else { fmt = exname(name, fmt); cp = exlookup (name, macros); while (cp && *cp) { if (ix >= len) { /* resize */ len += INC; bp = (char *) realloc(bp, (unsigned)(len*sizeof(char))); } bp[ix++] = *cp++; } } } if (ix >= len) { /* resize */ len += INC; bp = (char *) realloc(bp, (unsigned)(len*sizeof(char))); } bp[ix] = '\0'; len = strlen(bp); bp = (char *) realloc(bp, (unsigned) (len*sizeof(char))); return bp; } char *expand(buf, fmt, macros) char *buf, *fmt; Expand macros[]; { register char *bp = buf, *cp; char name[LINESIZE]; while(fmt && *fmt) { if(*fmt != '$') *bp++ = *fmt++; else if(*++fmt == '$') *bp++ = *fmt++; else { fmt = exname(name, fmt); cp = exlookup(name, macros); while(cp && *cp) *bp++ = *cp++; } } *bp = '\0'; return buf; } static char * exname(buf, str) register char *buf, *str; { if(*str == '(') { str++; while(*str != ')' && *str != '\0') *buf++ = *str++; if(*str != '\0') str++; } else *buf++ = *str++; *buf = '\0'; return str; } static char * exlookup(name, list) register char *name; Expand list[]; { register Expand *ep; for (ep = list; ep -> macro; ep++) { if(lexequ(name, ep -> macro) == 0) return (ep -> expansion); } return (""); }