Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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);
}