Word * varsub(char **s) { Bufblock *b; Word *w; if(**s == '{') /* either ${name} or ${name: A%B==C%D}*/ return expandvar(s); b = varname(s); if(b == 0) return 0; w = varmatch(b->start, s); freebuf(b); return w; }
static Word* expandvar(char **s) { Word *w; Bufblock *buf; Symtab *sym; char *cp, *begin, *end; begin = *s; (*s)++; /* skip the '{' */ buf = varname(s); if (buf == 0) return 0; cp = *s; if (*cp == '}') { /* ${name} variant*/ (*s)++; /* skip the '}' */ w = varmatch(buf->start, s); freebuf(buf); return w; } if (*cp != ':') { SYNERR(-1); fprint(2, "bad variable name <%s>\n", buf->start); freebuf(buf); return 0; } cp++; end = charin(cp , "}"); if(end == 0){ SYNERR(-1); fprint(2, "missing '}': %s\n", begin); Exit(); } *end = 0; *s = end+1; sym = symlook(buf->start, S_VAR, 0); if(sym == 0 || sym->value == 0) w = newword(buf->start); else w = subsub((Word*) sym->value, cp, end); freebuf(buf); return w; }
static char * scan4var( /* scan for variable from fp */ char *buf, int buflen, char *vname, FILE *fp ) { int cval; register char *cp; /* search out matching line */ while ((cval = varmatch(buf, vname))) { if (cval > 0) /* gone too far? */ return(NULL); buf[0] = '\0'; /* else get next line */ if (fgetline(buf, buflen, fp) == NULL) return(NULL); } /* skip variable name and '=' */ for (cp = buf; *cp++ != '='; ) ; while (isspace(*cp)) cp++; return(cp); }