xref: /plan9-contrib/sys/src/cmd/cc/macbody (revision 40d015479ed36701ae6dcfd8814f849fc6285e8d)
13b56890dSDavid du Colombier#define VARMAC 0x80
27dd7cddfSDavid du Colombier
37dd7cddfSDavid du Colombierlong
47dd7cddfSDavid du Colombiergetnsn(void)
57dd7cddfSDavid du Colombier{
67dd7cddfSDavid du Colombier	long n;
77dd7cddfSDavid du Colombier	int c;
87dd7cddfSDavid du Colombier
97dd7cddfSDavid du Colombier	c = getnsc();
107dd7cddfSDavid du Colombier	if(c < '0' || c > '9')
117dd7cddfSDavid du Colombier		return -1;
127dd7cddfSDavid du Colombier	n = 0;
137dd7cddfSDavid du Colombier	while(c >= '0' && c <= '9') {
147dd7cddfSDavid du Colombier		n = n*10 + c-'0';
157dd7cddfSDavid du Colombier		c = getc();
167dd7cddfSDavid du Colombier	}
177dd7cddfSDavid du Colombier	unget(c);
187dd7cddfSDavid du Colombier	return n;
197dd7cddfSDavid du Colombier}
207dd7cddfSDavid du Colombier
21*40d01547SDavid du Colombierstatic void
22*40d01547SDavid du Colombiernextsym(int c)
233e12c5d1SDavid du Colombier{
24*40d01547SDavid du Colombier	int c1;
253e12c5d1SDavid du Colombier	char *cp;
263e12c5d1SDavid du Colombier
273e12c5d1SDavid du Colombier	for(cp = symb;;) {
28*40d01547SDavid du Colombier		if(c >= Runeself) {
29*40d01547SDavid du Colombier			for(c1=0;;) {
30*40d01547SDavid du Colombier				if(cp <= symb+NSYMB-UTFmax)
31*40d01547SDavid du Colombier					cp[c1++] = c;
32*40d01547SDavid du Colombier				if(fullrune(cp, c1))
33*40d01547SDavid du Colombier					break;
34*40d01547SDavid du Colombier				c = getc();
35*40d01547SDavid du Colombier			}
36*40d01547SDavid du Colombier			cp += c1;
37*40d01547SDavid du Colombier		}else
38*40d01547SDavid du Colombier			if(cp <= symb+NSYMB-UTFmax)
393e12c5d1SDavid du Colombier				*cp++ = c;
403e12c5d1SDavid du Colombier		c = getc();
41*40d01547SDavid du Colombier		if(c >= Runeself || isalnum(c) || c == '_')
423e12c5d1SDavid du Colombier			continue;
433e12c5d1SDavid du Colombier		unget(c);
443e12c5d1SDavid du Colombier		break;
453e12c5d1SDavid du Colombier	}
463e12c5d1SDavid du Colombier	*cp = 0;
47*40d01547SDavid du Colombier	if(cp > symb+NSYMB-UTFmax)
483e12c5d1SDavid du Colombier		yyerror("symbol too large: %s", symb);
49*40d01547SDavid du Colombier}
50*40d01547SDavid du Colombier
51*40d01547SDavid du ColombierSym*
52*40d01547SDavid du Colombiergetsym(void)
53*40d01547SDavid du Colombier{
54*40d01547SDavid du Colombier	int c;
55*40d01547SDavid du Colombier
56*40d01547SDavid du Colombier	c = getnsc();
57*40d01547SDavid du Colombier	if(c < Runeself && !isalpha(c) && c != '_') {
58*40d01547SDavid du Colombier		unget(c);
59*40d01547SDavid du Colombier		return S;
60*40d01547SDavid du Colombier	}
61*40d01547SDavid du Colombier	nextsym(c);
623e12c5d1SDavid du Colombier	return lookup();
633e12c5d1SDavid du Colombier}
643e12c5d1SDavid du Colombier
653b56890dSDavid du ColombierSym*
663b56890dSDavid du Colombiergetsymdots(int *dots)
673b56890dSDavid du Colombier{
683b56890dSDavid du Colombier	int c;
693b56890dSDavid du Colombier	Sym *s;
703b56890dSDavid du Colombier
713b56890dSDavid du Colombier	s = getsym();
723b56890dSDavid du Colombier	if(s != S)
733b56890dSDavid du Colombier		return s;
743b56890dSDavid du Colombier
753b56890dSDavid du Colombier	c = getnsc();
763b56890dSDavid du Colombier	if(c != '.'){
773b56890dSDavid du Colombier		unget(c);
783b56890dSDavid du Colombier		return S;
793b56890dSDavid du Colombier	}
803b56890dSDavid du Colombier	if(getc() != '.' || getc() != '.')
813b56890dSDavid du Colombier		yyerror("bad dots in macro");
823b56890dSDavid du Colombier	*dots = 1;
833b56890dSDavid du Colombier	return slookup("__VA_ARGS__");
843b56890dSDavid du Colombier}
853b56890dSDavid du Colombier
86219b2ee8SDavid du Colombierint
87219b2ee8SDavid du Colombiergetcom(void)
88219b2ee8SDavid du Colombier{
89219b2ee8SDavid du Colombier	int c;
90219b2ee8SDavid du Colombier
91219b2ee8SDavid du Colombier	for(;;) {
92219b2ee8SDavid du Colombier		c = getnsc();
93219b2ee8SDavid du Colombier		if(c != '/')
94219b2ee8SDavid du Colombier			break;
95219b2ee8SDavid du Colombier		c = getc();
967dd7cddfSDavid du Colombier		if(c == '/') {
977dd7cddfSDavid du Colombier			while(c != '\n')
987dd7cddfSDavid du Colombier				c = getc();
997dd7cddfSDavid du Colombier			break;
1007dd7cddfSDavid du Colombier		}
101219b2ee8SDavid du Colombier		if(c != '*')
102219b2ee8SDavid du Colombier			break;
103219b2ee8SDavid du Colombier		c = getc();
104219b2ee8SDavid du Colombier		for(;;) {
105219b2ee8SDavid du Colombier			if(c == '*') {
106219b2ee8SDavid du Colombier				c = getc();
107219b2ee8SDavid du Colombier				if(c != '/')
108219b2ee8SDavid du Colombier					continue;
109219b2ee8SDavid du Colombier				c = getc();
110219b2ee8SDavid du Colombier				break;
111219b2ee8SDavid du Colombier			}
112219b2ee8SDavid du Colombier			if(c == '\n') {
113219b2ee8SDavid du Colombier				yyerror("comment across newline");
114219b2ee8SDavid du Colombier				break;
115219b2ee8SDavid du Colombier			}
116219b2ee8SDavid du Colombier			c = getc();
117219b2ee8SDavid du Colombier		}
118219b2ee8SDavid du Colombier		if(c == '\n')
119219b2ee8SDavid du Colombier			break;
120219b2ee8SDavid du Colombier	}
121219b2ee8SDavid du Colombier	return c;
122219b2ee8SDavid du Colombier}
123219b2ee8SDavid du Colombier
1243e12c5d1SDavid du Colombiervoid
1253e12c5d1SDavid du Colombierdodefine(char *cp)
1263e12c5d1SDavid du Colombier{
1273e12c5d1SDavid du Colombier	Sym *s;
1283e12c5d1SDavid du Colombier	char *p;
1293e12c5d1SDavid du Colombier	long l;
1303e12c5d1SDavid du Colombier
1313e12c5d1SDavid du Colombier	strcpy(symb, cp);
1323e12c5d1SDavid du Colombier	p = strchr(symb, '=');
1333e12c5d1SDavid du Colombier	if(p) {
1343e12c5d1SDavid du Colombier		*p++ = 0;
1353e12c5d1SDavid du Colombier		s = lookup();
1363e12c5d1SDavid du Colombier		l = strlen(p) + 2;	/* +1 null, +1 nargs */
1373e12c5d1SDavid du Colombier		while(l & 3)
1383e12c5d1SDavid du Colombier			l++;
1393e12c5d1SDavid du Colombier		while(nhunk < l)
1403e12c5d1SDavid du Colombier			gethunk();
1413e12c5d1SDavid du Colombier		*hunk = 0;
1423e12c5d1SDavid du Colombier		strcpy(hunk+1, p);
1433e12c5d1SDavid du Colombier		s->macro = hunk;
1443e12c5d1SDavid du Colombier		hunk += l;
1453e12c5d1SDavid du Colombier		nhunk -= l;
1463e12c5d1SDavid du Colombier	} else {
1473e12c5d1SDavid du Colombier		s = lookup();
1483e12c5d1SDavid du Colombier		s->macro = "\0001";	/* \000 is nargs */
1493e12c5d1SDavid du Colombier	}
150219b2ee8SDavid du Colombier	if(debug['m'])
151219b2ee8SDavid du Colombier		print("#define (-D) %s %s\n", s->name, s->macro+1);
1523e12c5d1SDavid du Colombier}
1533e12c5d1SDavid du Colombier
1543e12c5d1SDavid du Colombierstruct
1553e12c5d1SDavid du Colombier{
1563e12c5d1SDavid du Colombier	char	*macname;
1573e12c5d1SDavid du Colombier	void	(*macf)(void);
1583e12c5d1SDavid du Colombier} mactab[] =
1593e12c5d1SDavid du Colombier{
1603e12c5d1SDavid du Colombier	"ifdef",	0,	/* macif(0) */
1613e12c5d1SDavid du Colombier	"ifndef",	0,	/* macif(1) */
1623e12c5d1SDavid du Colombier	"else",		0,	/* macif(2) */
1633e12c5d1SDavid du Colombier
1643e12c5d1SDavid du Colombier	"line",		maclin,
1653e12c5d1SDavid du Colombier	"define",	macdef,
1663e12c5d1SDavid du Colombier	"include",	macinc,
1673e12c5d1SDavid du Colombier	"undef",	macund,
1683e12c5d1SDavid du Colombier
1693e12c5d1SDavid du Colombier	"pragma",	macprag,
1703e12c5d1SDavid du Colombier	"endif",	macend,
1713e12c5d1SDavid du Colombier	0
1723e12c5d1SDavid du Colombier};
1733e12c5d1SDavid du Colombier
1743e12c5d1SDavid du Colombiervoid
1753e12c5d1SDavid du Colombierdomacro(void)
1763e12c5d1SDavid du Colombier{
1773e12c5d1SDavid du Colombier	int i;
1783e12c5d1SDavid du Colombier	Sym *s;
1793e12c5d1SDavid du Colombier
1803e12c5d1SDavid du Colombier	s = getsym();
1813e12c5d1SDavid du Colombier	if(s == S)
1823e12c5d1SDavid du Colombier		s = slookup("endif");
1833e12c5d1SDavid du Colombier	for(i=0; mactab[i].macname; i++)
1843e12c5d1SDavid du Colombier		if(strcmp(s->name, mactab[i].macname) == 0) {
1853e12c5d1SDavid du Colombier			if(mactab[i].macf)
1863e12c5d1SDavid du Colombier				(*mactab[i].macf)();
1873e12c5d1SDavid du Colombier			else
1883e12c5d1SDavid du Colombier				macif(i);
1893e12c5d1SDavid du Colombier			return;
1903e12c5d1SDavid du Colombier		}
1913e12c5d1SDavid du Colombier	yyerror("unknown #: %s", s->name);
1923e12c5d1SDavid du Colombier	macend();
1933e12c5d1SDavid du Colombier}
1943e12c5d1SDavid du Colombier
1953e12c5d1SDavid du Colombiervoid
1963e12c5d1SDavid du Colombiermacund(void)
1973e12c5d1SDavid du Colombier{
1983e12c5d1SDavid du Colombier	Sym *s;
1993e12c5d1SDavid du Colombier
2003e12c5d1SDavid du Colombier	s = getsym();
2013e12c5d1SDavid du Colombier	macend();
2023e12c5d1SDavid du Colombier	if(s == S) {
2033e12c5d1SDavid du Colombier		yyerror("syntax in #undef");
2043e12c5d1SDavid du Colombier		return;
2053e12c5d1SDavid du Colombier	}
2063e12c5d1SDavid du Colombier	s->macro = 0;
2073e12c5d1SDavid du Colombier}
2083e12c5d1SDavid du Colombier
2093e12c5d1SDavid du Colombier#define	NARG	25
2103e12c5d1SDavid du Colombiervoid
2113e12c5d1SDavid du Colombiermacdef(void)
2123e12c5d1SDavid du Colombier{
2133e12c5d1SDavid du Colombier	Sym *s, *a;
214*40d01547SDavid du Colombier	char *args[NARG], *base;
2153b56890dSDavid du Colombier	int n, i, c, len, dots;
216feebb65bSDavid du Colombier	int ischr;
2173e12c5d1SDavid du Colombier
2183e12c5d1SDavid du Colombier	s = getsym();
2193e12c5d1SDavid du Colombier	if(s == S)
2203e12c5d1SDavid du Colombier		goto bad;
2213e12c5d1SDavid du Colombier	if(s->macro)
2223e12c5d1SDavid du Colombier		yyerror("macro redefined: %s", s->name);
2233e12c5d1SDavid du Colombier	c = getc();
2243e12c5d1SDavid du Colombier	n = -1;
2253b56890dSDavid du Colombier	dots = 0;
2263e12c5d1SDavid du Colombier	if(c == '(') {
2273e12c5d1SDavid du Colombier		n++;
2283e12c5d1SDavid du Colombier		c = getnsc();
2293e12c5d1SDavid du Colombier		if(c != ')') {
2303e12c5d1SDavid du Colombier			unget(c);
2313e12c5d1SDavid du Colombier			for(;;) {
2323b56890dSDavid du Colombier				a = getsymdots(&dots);
2333e12c5d1SDavid du Colombier				if(a == S)
2343e12c5d1SDavid du Colombier					goto bad;
2353e12c5d1SDavid du Colombier				if(n >= NARG) {
2363e12c5d1SDavid du Colombier					yyerror("too many arguments in #define: %s", s->name);
2373e12c5d1SDavid du Colombier					goto bad;
2383e12c5d1SDavid du Colombier				}
2393e12c5d1SDavid du Colombier				args[n++] = a->name;
2403e12c5d1SDavid du Colombier				c = getnsc();
2413e12c5d1SDavid du Colombier				if(c == ')')
2423e12c5d1SDavid du Colombier					break;
2433b56890dSDavid du Colombier				if(c != ',' || dots)
2443e12c5d1SDavid du Colombier					goto bad;
2453e12c5d1SDavid du Colombier			}
2463e12c5d1SDavid du Colombier		}
2473e12c5d1SDavid du Colombier		c = getc();
2483e12c5d1SDavid du Colombier	}
2493e12c5d1SDavid du Colombier	if(isspace(c))
2503e12c5d1SDavid du Colombier		if(c != '\n')
2513e12c5d1SDavid du Colombier			c = getnsc();
2523e12c5d1SDavid du Colombier	base = hunk;
2533e12c5d1SDavid du Colombier	len = 1;
254feebb65bSDavid du Colombier	ischr = 0;
2553e12c5d1SDavid du Colombier	for(;;) {
256*40d01547SDavid du Colombier		if(c >= Runeself || isalpha(c) || c == '_') {
257*40d01547SDavid du Colombier			nextsym(c);
2583e12c5d1SDavid du Colombier			c = getc();
2593e12c5d1SDavid du Colombier			for(i=0; i<n; i++)
2603e12c5d1SDavid du Colombier				if(strcmp(symb, args[i]) == 0)
2613e12c5d1SDavid du Colombier					break;
2623e12c5d1SDavid du Colombier			if(i >= n) {
2633e12c5d1SDavid du Colombier				i = strlen(symb);
2647dd7cddfSDavid du Colombier				base = allocn(base, len, i);
2653e12c5d1SDavid du Colombier				memcpy(base+len, symb, i);
2663e12c5d1SDavid du Colombier				len += i;
2673e12c5d1SDavid du Colombier				continue;
2683e12c5d1SDavid du Colombier			}
2697dd7cddfSDavid du Colombier			base = allocn(base, len, 2);
2703e12c5d1SDavid du Colombier			base[len++] = '#';
2713e12c5d1SDavid du Colombier			base[len++] = 'a' + i;
2723e12c5d1SDavid du Colombier			continue;
2733e12c5d1SDavid du Colombier		}
274feebb65bSDavid du Colombier		if(ischr){
275feebb65bSDavid du Colombier			if(c == '\\'){
276feebb65bSDavid du Colombier				base = allocn(base, len, 1);
277feebb65bSDavid du Colombier				base[len++] = c;
278feebb65bSDavid du Colombier				c = getc();
279feebb65bSDavid du Colombier			}else if(c == ischr)
280feebb65bSDavid du Colombier				ischr = 0;
281feebb65bSDavid du Colombier		}else{
282feebb65bSDavid du Colombier			if(c == '"' || c == '\''){
283feebb65bSDavid du Colombier				base = allocn(base, len, 1);
284feebb65bSDavid du Colombier				base[len++] = c;
285feebb65bSDavid du Colombier				ischr = c;
286feebb65bSDavid du Colombier				c = getc();
287feebb65bSDavid du Colombier				continue;
288feebb65bSDavid du Colombier			}
2893e12c5d1SDavid du Colombier			if(c == '/') {
2903e12c5d1SDavid du Colombier				c = getc();
291705edaf8SDavid du Colombier				if(c == '/'){
292705edaf8SDavid du Colombier					c = getc();
293705edaf8SDavid du Colombier					for(;;) {
294705edaf8SDavid du Colombier						if(c == '\n')
295705edaf8SDavid du Colombier							break;
296705edaf8SDavid du Colombier						c = getc();
297705edaf8SDavid du Colombier					}
2983e12c5d1SDavid du Colombier					continue;
2993e12c5d1SDavid du Colombier				}
300705edaf8SDavid du Colombier				if(c == '*'){
3013e12c5d1SDavid du Colombier					c = getc();
3023e12c5d1SDavid du Colombier					for(;;) {
3033e12c5d1SDavid du Colombier						if(c == '*') {
3043e12c5d1SDavid du Colombier							c = getc();
3053e12c5d1SDavid du Colombier							if(c != '/')
3063e12c5d1SDavid du Colombier								continue;
3073e12c5d1SDavid du Colombier							c = getc();
3083e12c5d1SDavid du Colombier							break;
3093e12c5d1SDavid du Colombier						}
310*40d01547SDavid du Colombier						if(0 && c == '\n') {
3113e12c5d1SDavid du Colombier							yyerror("comment and newline in define: %s", s->name);
3123e12c5d1SDavid du Colombier							break;
3133e12c5d1SDavid du Colombier						}
3143e12c5d1SDavid du Colombier						c = getc();
3153e12c5d1SDavid du Colombier					}
3163e12c5d1SDavid du Colombier					continue;
3173e12c5d1SDavid du Colombier				}
318705edaf8SDavid du Colombier				base = allocn(base, len, 1);
319705edaf8SDavid du Colombier				base[len++] = '/';
320705edaf8SDavid du Colombier				continue;
321705edaf8SDavid du Colombier			}
322feebb65bSDavid du Colombier		}
3233e12c5d1SDavid du Colombier		if(c == '\\') {
3243e12c5d1SDavid du Colombier			c = getc();
3253e12c5d1SDavid du Colombier			if(c == '\n') {
3263e12c5d1SDavid du Colombier				c = getc();
3273e12c5d1SDavid du Colombier				continue;
3283e12c5d1SDavid du Colombier			}
329375daca8SDavid du Colombier			else if(c == '\r') {
330375daca8SDavid du Colombier				c = getc();
331375daca8SDavid du Colombier				if(c == '\n') {
332375daca8SDavid du Colombier					c = getc();
333375daca8SDavid du Colombier					continue;
334375daca8SDavid du Colombier				}
335375daca8SDavid du Colombier			}
3367dd7cddfSDavid du Colombier			base = allocn(base, len, 1);
3373e12c5d1SDavid du Colombier			base[len++] = '\\';
3383e12c5d1SDavid du Colombier			continue;
3393e12c5d1SDavid du Colombier		}
3403e12c5d1SDavid du Colombier		if(c == '\n')
3413e12c5d1SDavid du Colombier			break;
3423e12c5d1SDavid du Colombier		if(c == '#')
3433e12c5d1SDavid du Colombier		if(n > 0) {
3447dd7cddfSDavid du Colombier			base = allocn(base, len, 1);
3453e12c5d1SDavid du Colombier			base[len++] = c;
3463e12c5d1SDavid du Colombier		}
3477dd7cddfSDavid du Colombier		base = allocn(base, len, 1);
3483e12c5d1SDavid du Colombier		base[len++] = c;
3493e12c5d1SDavid du Colombier		c = ((--fi.c < 0)? filbuf(): (*fi.p++ & 0xff));
3503e12c5d1SDavid du Colombier		if(c == '\n')
3513e12c5d1SDavid du Colombier			lineno++;
3523e12c5d1SDavid du Colombier		if(c == -1) {
3533e12c5d1SDavid du Colombier			yyerror("eof in a macro: %s", s->name);
3543e12c5d1SDavid du Colombier			break;
3553e12c5d1SDavid du Colombier		}
3563e12c5d1SDavid du Colombier	}
3573e12c5d1SDavid du Colombier	do {
3587dd7cddfSDavid du Colombier		base = allocn(base, len, 1);
3593e12c5d1SDavid du Colombier		base[len++] = 0;
3603e12c5d1SDavid du Colombier	} while(len & 3);
3613e12c5d1SDavid du Colombier
3623e12c5d1SDavid du Colombier	*base = n+1;
3633b56890dSDavid du Colombier	if(dots)
3643b56890dSDavid du Colombier		*base |= VARMAC;
3653e12c5d1SDavid du Colombier	s->macro = base;
3663e12c5d1SDavid du Colombier	if(debug['m'])
3673e12c5d1SDavid du Colombier		print("#define %s %s\n", s->name, s->macro+1);
3683e12c5d1SDavid du Colombier	return;
3693e12c5d1SDavid du Colombier
3703e12c5d1SDavid du Colombierbad:
3713e12c5d1SDavid du Colombier	if(s == S)
3723e12c5d1SDavid du Colombier		yyerror("syntax in #define");
3733e12c5d1SDavid du Colombier	else
3743e12c5d1SDavid du Colombier		yyerror("syntax in #define: %s", s->name);
3753e12c5d1SDavid du Colombier	macend();
3763e12c5d1SDavid du Colombier}
3773e12c5d1SDavid du Colombier
3783e12c5d1SDavid du Colombiervoid
3793e12c5d1SDavid du Colombiermacexpand(Sym *s, char *b)
3803e12c5d1SDavid du Colombier{
3813e12c5d1SDavid du Colombier	char buf[2000];
3823e12c5d1SDavid du Colombier	int n, l, c, nargs;
3833b56890dSDavid du Colombier	char *arg[NARG], *cp, *ob, *ecp, dots;
3843e12c5d1SDavid du Colombier
3853e12c5d1SDavid du Colombier	ob = b;
3863b56890dSDavid du Colombier	if(*s->macro == 0) {
3873e12c5d1SDavid du Colombier		strcpy(b, s->macro+1);
3883e12c5d1SDavid du Colombier		if(debug['m'])
3893e12c5d1SDavid du Colombier			print("#expand %s %s\n", s->name, ob);
3903e12c5d1SDavid du Colombier		return;
3913e12c5d1SDavid du Colombier	}
3923b56890dSDavid du Colombier
3933b56890dSDavid du Colombier	nargs = (char)(*s->macro & ~VARMAC) - 1;
3943b56890dSDavid du Colombier	dots = *s->macro & VARMAC;
3953b56890dSDavid du Colombier
3963e12c5d1SDavid du Colombier	c = getnsc();
3973e12c5d1SDavid du Colombier	if(c != '(')
3983e12c5d1SDavid du Colombier		goto bad;
3993e12c5d1SDavid du Colombier	n = 0;
4003e12c5d1SDavid du Colombier	c = getc();
4013e12c5d1SDavid du Colombier	if(c != ')') {
4023e12c5d1SDavid du Colombier		unget(c);
4033e12c5d1SDavid du Colombier		l = 0;
4043e12c5d1SDavid du Colombier		cp = buf;
405*40d01547SDavid du Colombier		ecp = cp + sizeof(buf)-UTFmax;
4063e12c5d1SDavid du Colombier		arg[n++] = cp;
4073e12c5d1SDavid du Colombier		for(;;) {
4083e12c5d1SDavid du Colombier			if(cp >= ecp)
4093e12c5d1SDavid du Colombier				goto toobig;
4103e12c5d1SDavid du Colombier			c = getc();
4113e12c5d1SDavid du Colombier			if(c == '"')
4123e12c5d1SDavid du Colombier				for(;;) {
4133e12c5d1SDavid du Colombier					if(cp >= ecp)
4143e12c5d1SDavid du Colombier						goto toobig;
4153e12c5d1SDavid du Colombier					*cp++ = c;
4163e12c5d1SDavid du Colombier					c = getc();
4173e12c5d1SDavid du Colombier					if(c == '\\') {
4183e12c5d1SDavid du Colombier						*cp++ = c;
4193e12c5d1SDavid du Colombier						c = getc();
4203e12c5d1SDavid du Colombier						continue;
4213e12c5d1SDavid du Colombier					}
4223e12c5d1SDavid du Colombier					if(c == '\n')
4233e12c5d1SDavid du Colombier						goto bad;
4243e12c5d1SDavid du Colombier					if(c == '"')
4253e12c5d1SDavid du Colombier						break;
4263e12c5d1SDavid du Colombier				}
4273e12c5d1SDavid du Colombier			if(c == '\'')
4283e12c5d1SDavid du Colombier				for(;;) {
4293e12c5d1SDavid du Colombier					if(cp >= ecp)
4303e12c5d1SDavid du Colombier						goto toobig;
4313e12c5d1SDavid du Colombier					*cp++ = c;
4323e12c5d1SDavid du Colombier					c = getc();
4333e12c5d1SDavid du Colombier					if(c == '\\') {
4343e12c5d1SDavid du Colombier						*cp++ = c;
4353e12c5d1SDavid du Colombier						c = getc();
4363e12c5d1SDavid du Colombier						continue;
4373e12c5d1SDavid du Colombier					}
4383e12c5d1SDavid du Colombier					if(c == '\n')
4393e12c5d1SDavid du Colombier						goto bad;
4403e12c5d1SDavid du Colombier					if(c == '\'')
4413e12c5d1SDavid du Colombier						break;
4423e12c5d1SDavid du Colombier				}
4435d459b5aSDavid du Colombier			if(c == '/') {
4445d459b5aSDavid du Colombier				c = getc();
4455d459b5aSDavid du Colombier				switch(c) {
4465d459b5aSDavid du Colombier				case '*':
4475d459b5aSDavid du Colombier					for(;;) {
4485d459b5aSDavid du Colombier						c = getc();
4495d459b5aSDavid du Colombier						if(c == '*') {
4505d459b5aSDavid du Colombier							c = getc();
4515d459b5aSDavid du Colombier							if(c == '/')
4525d459b5aSDavid du Colombier								break;
4535d459b5aSDavid du Colombier						}
4545d459b5aSDavid du Colombier					}
4555d459b5aSDavid du Colombier					*cp++ = ' ';
4565d459b5aSDavid du Colombier					continue;
4575d459b5aSDavid du Colombier				case '/':
4585d459b5aSDavid du Colombier					while((c = getc()) != '\n')
4595d459b5aSDavid du Colombier						;
4605d459b5aSDavid du Colombier					break;
4615d459b5aSDavid du Colombier				default:
4625d459b5aSDavid du Colombier					unget(c);
4635d459b5aSDavid du Colombier					c = '/';
4645d459b5aSDavid du Colombier				}
4655d459b5aSDavid du Colombier			}
4663e12c5d1SDavid du Colombier			if(l == 0) {
4673e12c5d1SDavid du Colombier				if(c == ',') {
4683b56890dSDavid du Colombier					if(n == nargs && dots) {
4693b56890dSDavid du Colombier						*cp++ = ',';
4703b56890dSDavid du Colombier						continue;
4713b56890dSDavid du Colombier					}
4723e12c5d1SDavid du Colombier					*cp++ = 0;
4733e12c5d1SDavid du Colombier					arg[n++] = cp;
4743e12c5d1SDavid du Colombier					if(n > nargs)
4753e12c5d1SDavid du Colombier						break;
4763e12c5d1SDavid du Colombier					continue;
4773e12c5d1SDavid du Colombier				}
4783e12c5d1SDavid du Colombier				if(c == ')')
4793e12c5d1SDavid du Colombier					break;
4803e12c5d1SDavid du Colombier			}
4813e12c5d1SDavid du Colombier			if(c == '\n')
4823e12c5d1SDavid du Colombier				c = ' ';
4833e12c5d1SDavid du Colombier			*cp++ = c;
4843e12c5d1SDavid du Colombier			if(c == '(')
4853e12c5d1SDavid du Colombier				l++;
4863e12c5d1SDavid du Colombier			if(c == ')')
4873e12c5d1SDavid du Colombier				l--;
4883e12c5d1SDavid du Colombier		}
4893e12c5d1SDavid du Colombier		*cp = 0;
4903e12c5d1SDavid du Colombier	}
4913e12c5d1SDavid du Colombier	if(n != nargs) {
4923e12c5d1SDavid du Colombier		yyerror("argument mismatch expanding: %s", s->name);
4933e12c5d1SDavid du Colombier		*b = 0;
4943e12c5d1SDavid du Colombier		return;
4953e12c5d1SDavid du Colombier	}
4963e12c5d1SDavid du Colombier	cp = s->macro+1;
4973e12c5d1SDavid du Colombier	for(;;) {
4983e12c5d1SDavid du Colombier		c = *cp++;
499b85a8364SDavid du Colombier		if(c == '\n')
500b85a8364SDavid du Colombier			c = ' ';
5013e12c5d1SDavid du Colombier		if(c != '#') {
5023e12c5d1SDavid du Colombier			*b++ = c;
5033e12c5d1SDavid du Colombier			if(c == 0)
5043e12c5d1SDavid du Colombier				break;
5053e12c5d1SDavid du Colombier			continue;
5063e12c5d1SDavid du Colombier		}
5073e12c5d1SDavid du Colombier		c = *cp++;
5083e12c5d1SDavid du Colombier		if(c == 0)
5093e12c5d1SDavid du Colombier			goto bad;
5103e12c5d1SDavid du Colombier		if(c == '#') {
5113e12c5d1SDavid du Colombier			*b++ = c;
5123e12c5d1SDavid du Colombier			continue;
5133e12c5d1SDavid du Colombier		}
5143e12c5d1SDavid du Colombier		c -= 'a';
5153e12c5d1SDavid du Colombier		if(c < 0 || c >= n)
5163e12c5d1SDavid du Colombier			continue;
5173e12c5d1SDavid du Colombier		strcpy(b, arg[c]);
5183e12c5d1SDavid du Colombier		b += strlen(arg[c]);
5193e12c5d1SDavid du Colombier	}
5203e12c5d1SDavid du Colombier	*b = 0;
5213e12c5d1SDavid du Colombier	if(debug['m'])
5223e12c5d1SDavid du Colombier		print("#expand %s %s\n", s->name, ob);
5233e12c5d1SDavid du Colombier	return;
5243e12c5d1SDavid du Colombier
5253e12c5d1SDavid du Colombierbad:
5263e12c5d1SDavid du Colombier	yyerror("syntax in macro expansion: %s", s->name);
5273e12c5d1SDavid du Colombier	*b = 0;
5283e12c5d1SDavid du Colombier	return;
5293e12c5d1SDavid du Colombier
5303e12c5d1SDavid du Colombiertoobig:
5313e12c5d1SDavid du Colombier	yyerror("too much text in macro expansion: %s", s->name);
5323e12c5d1SDavid du Colombier	*b = 0;
5333e12c5d1SDavid du Colombier}
5343e12c5d1SDavid du Colombier
5353e12c5d1SDavid du Colombiervoid
5363e12c5d1SDavid du Colombiermacinc(void)
5373e12c5d1SDavid du Colombier{
5383e12c5d1SDavid du Colombier	int c0, c, i, f;
5393e12c5d1SDavid du Colombier	char str[STRINGSZ], *hp;
5403e12c5d1SDavid du Colombier
5413e12c5d1SDavid du Colombier	c0 = getnsc();
5423e12c5d1SDavid du Colombier	if(c0 != '"') {
5433e12c5d1SDavid du Colombier		c = c0;
5443e12c5d1SDavid du Colombier		if(c0 != '<')
5453e12c5d1SDavid du Colombier			goto bad;
5463e12c5d1SDavid du Colombier		c0 = '>';
5473e12c5d1SDavid du Colombier	}
5483e12c5d1SDavid du Colombier	for(hp = str;;) {
5493e12c5d1SDavid du Colombier		c = getc();
5503e12c5d1SDavid du Colombier		if(c == c0)
5513e12c5d1SDavid du Colombier			break;
5523e12c5d1SDavid du Colombier		if(c == '\n')
5533e12c5d1SDavid du Colombier			goto bad;
5543e12c5d1SDavid du Colombier		*hp++ = c;
5553e12c5d1SDavid du Colombier	}
5563e12c5d1SDavid du Colombier	*hp = 0;
557219b2ee8SDavid du Colombier
558219b2ee8SDavid du Colombier	c = getcom();
5593e12c5d1SDavid du Colombier	if(c != '\n')
5603e12c5d1SDavid du Colombier		goto bad;
561219b2ee8SDavid du Colombier
5623e12c5d1SDavid du Colombier	f = -1;
5633e12c5d1SDavid du Colombier	for(i=0; i<ninclude; i++) {
5643e12c5d1SDavid du Colombier		if(i == 0 && c0 == '>')
5653e12c5d1SDavid du Colombier			continue;
5663e12c5d1SDavid du Colombier		strcpy(symb, include[i]);
5673e12c5d1SDavid du Colombier		strcat(symb, "/");
5683e12c5d1SDavid du Colombier		if(strcmp(symb, "./") == 0)
5693e12c5d1SDavid du Colombier			symb[0] = 0;
5703e12c5d1SDavid du Colombier		strcat(symb, str);
5713e12c5d1SDavid du Colombier		f = open(symb, 0);
5723e12c5d1SDavid du Colombier		if(f >= 0)
5733e12c5d1SDavid du Colombier			break;
5743e12c5d1SDavid du Colombier	}
5753e12c5d1SDavid du Colombier	if(f < 0)
5763e12c5d1SDavid du Colombier		strcpy(symb, str);
5773e12c5d1SDavid du Colombier	c = strlen(symb) + 1;
5783e12c5d1SDavid du Colombier	while(c & 3)
5793e12c5d1SDavid du Colombier		c++;
5803e12c5d1SDavid du Colombier	while(nhunk < c)
5813e12c5d1SDavid du Colombier		gethunk();
5823e12c5d1SDavid du Colombier	hp = hunk;
5833e12c5d1SDavid du Colombier	memcpy(hunk, symb, c);
5843e12c5d1SDavid du Colombier	nhunk -= c;
5853e12c5d1SDavid du Colombier	hunk += c;
5863e12c5d1SDavid du Colombier	newio();
5873e12c5d1SDavid du Colombier	pushio();
5883e12c5d1SDavid du Colombier	newfile(hp, f);
5893e12c5d1SDavid du Colombier	return;
5903e12c5d1SDavid du Colombier
5913e12c5d1SDavid du Colombierbad:
5923e12c5d1SDavid du Colombier	unget(c);
5933e12c5d1SDavid du Colombier	yyerror("syntax in #include");
5943e12c5d1SDavid du Colombier	macend();
5953e12c5d1SDavid du Colombier}
5963e12c5d1SDavid du Colombier
5973e12c5d1SDavid du Colombiervoid
5983e12c5d1SDavid du Colombiermaclin(void)
5993e12c5d1SDavid du Colombier{
6003e12c5d1SDavid du Colombier	char *cp;
6013e12c5d1SDavid du Colombier	int c;
6023e12c5d1SDavid du Colombier	long n;
6033e12c5d1SDavid du Colombier
6047dd7cddfSDavid du Colombier	n = getnsn();
6053e12c5d1SDavid du Colombier	c = getc();
6067dd7cddfSDavid du Colombier	if(n < 0)
6077dd7cddfSDavid du Colombier		goto bad;
6087dd7cddfSDavid du Colombier
6093e12c5d1SDavid du Colombier	for(;;) {
6103e12c5d1SDavid du Colombier		if(c == ' ' || c == '\t') {
6113e12c5d1SDavid du Colombier			c = getc();
6123e12c5d1SDavid du Colombier			continue;
6133e12c5d1SDavid du Colombier		}
6143e12c5d1SDavid du Colombier		if(c == '"')
6153e12c5d1SDavid du Colombier			break;
6163e12c5d1SDavid du Colombier		if(c == '\n') {
6173e12c5d1SDavid du Colombier			strcpy(symb, "<noname>");
6183e12c5d1SDavid du Colombier			goto nn;
6193e12c5d1SDavid du Colombier		}
6203e12c5d1SDavid du Colombier		goto bad;
6213e12c5d1SDavid du Colombier	}
6223e12c5d1SDavid du Colombier	cp = symb;
6233e12c5d1SDavid du Colombier	for(;;) {
6243e12c5d1SDavid du Colombier		c = getc();
6253e12c5d1SDavid du Colombier		if(c == '"')
6263e12c5d1SDavid du Colombier			break;
6273e12c5d1SDavid du Colombier		*cp++ = c;
6283e12c5d1SDavid du Colombier	}
6293e12c5d1SDavid du Colombier	*cp = 0;
630219b2ee8SDavid du Colombier	c = getcom();
6313e12c5d1SDavid du Colombier	if(c != '\n')
6323e12c5d1SDavid du Colombier		goto bad;
6333e12c5d1SDavid du Colombier
6343e12c5d1SDavid du Colombiernn:
6353e12c5d1SDavid du Colombier	c = strlen(symb) + 1;
6363e12c5d1SDavid du Colombier	while(c & 3)
6373e12c5d1SDavid du Colombier		c++;
6383e12c5d1SDavid du Colombier	while(nhunk < c)
6393e12c5d1SDavid du Colombier		gethunk();
6403e12c5d1SDavid du Colombier	cp = hunk;
6413e12c5d1SDavid du Colombier	memcpy(hunk, symb, c);
6423e12c5d1SDavid du Colombier	nhunk -= c;
6433e12c5d1SDavid du Colombier	hunk += c;
6443e12c5d1SDavid du Colombier	linehist(cp, n);
6453e12c5d1SDavid du Colombier	return;
6463e12c5d1SDavid du Colombier
6473e12c5d1SDavid du Colombierbad:
6483e12c5d1SDavid du Colombier	unget(c);
6493e12c5d1SDavid du Colombier	yyerror("syntax in #line");
6503e12c5d1SDavid du Colombier	macend();
6513e12c5d1SDavid du Colombier}
6523e12c5d1SDavid du Colombier
6533e12c5d1SDavid du Colombiervoid
6543e12c5d1SDavid du Colombiermacif(int f)
6553e12c5d1SDavid du Colombier{
6563e12c5d1SDavid du Colombier	int c, l, bol;
6573e12c5d1SDavid du Colombier	Sym *s;
6583e12c5d1SDavid du Colombier
6593e12c5d1SDavid du Colombier	if(f == 2)
6603e12c5d1SDavid du Colombier		goto skip;
6613e12c5d1SDavid du Colombier	s = getsym();
662219b2ee8SDavid du Colombier	if(s == S)
663219b2ee8SDavid du Colombier		goto bad;
664219b2ee8SDavid du Colombier	if(getcom() != '\n')
6653e12c5d1SDavid du Colombier		goto bad;
6663e12c5d1SDavid du Colombier	if((s->macro != 0) ^ f)
6673e12c5d1SDavid du Colombier		return;
6683e12c5d1SDavid du Colombier
6693e12c5d1SDavid du Colombierskip:
6703e12c5d1SDavid du Colombier	bol = 1;
6713e12c5d1SDavid du Colombier	l = 0;
6723e12c5d1SDavid du Colombier	for(;;) {
6733e12c5d1SDavid du Colombier		c = getc();
6743e12c5d1SDavid du Colombier		if(c != '#') {
6753e12c5d1SDavid du Colombier			if(!isspace(c))
6763e12c5d1SDavid du Colombier				bol = 0;
6773e12c5d1SDavid du Colombier			if(c == '\n')
6783e12c5d1SDavid du Colombier				bol = 1;
6793e12c5d1SDavid du Colombier			continue;
6803e12c5d1SDavid du Colombier		}
6813e12c5d1SDavid du Colombier		if(!bol)
6823e12c5d1SDavid du Colombier			continue;
6833e12c5d1SDavid du Colombier		s = getsym();
6843e12c5d1SDavid du Colombier		if(s == S)
6853e12c5d1SDavid du Colombier			continue;
6863e12c5d1SDavid du Colombier		if(strcmp(s->name, "endif") == 0) {
6873e12c5d1SDavid du Colombier			if(l) {
6883e12c5d1SDavid du Colombier				l--;
6893e12c5d1SDavid du Colombier				continue;
6903e12c5d1SDavid du Colombier			}
6913e12c5d1SDavid du Colombier			macend();
6923e12c5d1SDavid du Colombier			return;
6933e12c5d1SDavid du Colombier		}
6943e12c5d1SDavid du Colombier		if(strcmp(s->name, "ifdef") == 0 || strcmp(s->name, "ifndef") == 0) {
6953e12c5d1SDavid du Colombier			l++;
6963e12c5d1SDavid du Colombier			continue;
6973e12c5d1SDavid du Colombier		}
6983e12c5d1SDavid du Colombier		if(l == 0 && f != 2 && strcmp(s->name, "else") == 0) {
6993e12c5d1SDavid du Colombier			macend();
7003e12c5d1SDavid du Colombier			return;
7013e12c5d1SDavid du Colombier		}
7023e12c5d1SDavid du Colombier	}
7033e12c5d1SDavid du Colombier
7043e12c5d1SDavid du Colombierbad:
7053e12c5d1SDavid du Colombier	yyerror("syntax in #if(n)def");
7063e12c5d1SDavid du Colombier	macend();
7073e12c5d1SDavid du Colombier}
7083e12c5d1SDavid du Colombier
7093e12c5d1SDavid du Colombiervoid
7103e12c5d1SDavid du Colombiermacprag(void)
7113e12c5d1SDavid du Colombier{
7123e12c5d1SDavid du Colombier	Sym *s;
7133e12c5d1SDavid du Colombier	int c0, c;
7143e12c5d1SDavid du Colombier	char *hp;
7153e12c5d1SDavid du Colombier	Hist *h;
7163e12c5d1SDavid du Colombier
7173e12c5d1SDavid du Colombier	s = getsym();
7187dd7cddfSDavid du Colombier
7197dd7cddfSDavid du Colombier	if(s && strcmp(s->name, "lib") == 0)
7207dd7cddfSDavid du Colombier		goto praglib;
7219847521cSDavid du Colombier	if(s && strcmp(s->name, "pack") == 0) {
7229847521cSDavid du Colombier		pragpack();
7237dd7cddfSDavid du Colombier		return;
7247dd7cddfSDavid du Colombier	}
7257dd7cddfSDavid du Colombier	if(s && strcmp(s->name, "fpround") == 0) {
7267dd7cddfSDavid du Colombier		pragfpround();
7277dd7cddfSDavid du Colombier		return;
7287dd7cddfSDavid du Colombier	}
729e288d156SDavid du Colombier	if(s && strcmp(s->name, "profile") == 0) {
730e288d156SDavid du Colombier		pragprofile();
731e288d156SDavid du Colombier		return;
732e288d156SDavid du Colombier	}
7337dd7cddfSDavid du Colombier	if(s && strcmp(s->name, "varargck") == 0) {
7347dd7cddfSDavid du Colombier		pragvararg();
7353e12c5d1SDavid du Colombier		return;
7363e12c5d1SDavid du Colombier	}
737375daca8SDavid du Colombier	if(s && strcmp(s->name, "incomplete") == 0) {
738375daca8SDavid du Colombier		pragincomplete();
739375daca8SDavid du Colombier		return;
740375daca8SDavid du Colombier	}
7417dd7cddfSDavid du Colombier	while(getnsc() != '\n')
7427dd7cddfSDavid du Colombier		;
7437dd7cddfSDavid du Colombier	return;
7447dd7cddfSDavid du Colombier
7457dd7cddfSDavid du Colombierpraglib:
7463e12c5d1SDavid du Colombier	c0 = getnsc();
7473e12c5d1SDavid du Colombier	if(c0 != '"') {
7483e12c5d1SDavid du Colombier		c = c0;
7493e12c5d1SDavid du Colombier		if(c0 != '<')
7503e12c5d1SDavid du Colombier			goto bad;
7513e12c5d1SDavid du Colombier		c0 = '>';
7523e12c5d1SDavid du Colombier	}
7533e12c5d1SDavid du Colombier	for(hp = symb;;) {
7543e12c5d1SDavid du Colombier		c = getc();
7553e12c5d1SDavid du Colombier		if(c == c0)
7563e12c5d1SDavid du Colombier			break;
7573e12c5d1SDavid du Colombier		if(c == '\n')
7583e12c5d1SDavid du Colombier			goto bad;
7593e12c5d1SDavid du Colombier		*hp++ = c;
7603e12c5d1SDavid du Colombier	}
7613e12c5d1SDavid du Colombier	*hp = 0;
762219b2ee8SDavid du Colombier	c = getcom();
7633e12c5d1SDavid du Colombier	if(c != '\n')
7643e12c5d1SDavid du Colombier		goto bad;
7653e12c5d1SDavid du Colombier
7663e12c5d1SDavid du Colombier	/*
7673e12c5d1SDavid du Colombier	 * put pragma-line in as a funny history
7683e12c5d1SDavid du Colombier	 */
7693e12c5d1SDavid du Colombier	c = strlen(symb) + 1;
7703e12c5d1SDavid du Colombier	while(c & 3)
7713e12c5d1SDavid du Colombier		c++;
7723e12c5d1SDavid du Colombier	while(nhunk < c)
7733e12c5d1SDavid du Colombier		gethunk();
7743e12c5d1SDavid du Colombier	hp = hunk;
7753e12c5d1SDavid du Colombier	memcpy(hunk, symb, c);
7763e12c5d1SDavid du Colombier	nhunk -= c;
7773e12c5d1SDavid du Colombier	hunk += c;
7783e12c5d1SDavid du Colombier
7797dd7cddfSDavid du Colombier	h = alloc(sizeof(Hist));
7803e12c5d1SDavid du Colombier	h->name = hp;
7813e12c5d1SDavid du Colombier	h->line = lineno;
7823e12c5d1SDavid du Colombier	h->offset = -1;
7833e12c5d1SDavid du Colombier	h->link = H;
7843e12c5d1SDavid du Colombier	if(ehist == H) {
7853e12c5d1SDavid du Colombier		hist = h;
7863e12c5d1SDavid du Colombier		ehist = h;
7873e12c5d1SDavid du Colombier		return;
7883e12c5d1SDavid du Colombier	}
7893e12c5d1SDavid du Colombier	ehist->link = h;
7903e12c5d1SDavid du Colombier	ehist = h;
7913e12c5d1SDavid du Colombier	return;
7923e12c5d1SDavid du Colombier
7933e12c5d1SDavid du Colombierbad:
7943e12c5d1SDavid du Colombier	unget(c);
7953e12c5d1SDavid du Colombier	yyerror("syntax in #pragma lib");
7963e12c5d1SDavid du Colombier	macend();
7973e12c5d1SDavid du Colombier}
7983e12c5d1SDavid du Colombier
7993e12c5d1SDavid du Colombiervoid
8003e12c5d1SDavid du Colombiermacend(void)
8013e12c5d1SDavid du Colombier{
8023e12c5d1SDavid du Colombier	int c;
8033e12c5d1SDavid du Colombier
8043e12c5d1SDavid du Colombier	for(;;) {
8053e12c5d1SDavid du Colombier		c = getnsc();
8063e12c5d1SDavid du Colombier		if(c < 0 || c == '\n')
8073e12c5d1SDavid du Colombier			return;
8083e12c5d1SDavid du Colombier	}
8093e12c5d1SDavid du Colombier}
8103e12c5d1SDavid du Colombier
8113e12c5d1SDavid du Colombiervoid
8123e12c5d1SDavid du Colombierlinehist(char *f, int offset)
8133e12c5d1SDavid du Colombier{
8143e12c5d1SDavid du Colombier	Hist *h;
8153e12c5d1SDavid du Colombier
8163e12c5d1SDavid du Colombier	/*
8173e12c5d1SDavid du Colombier	 * overwrite the last #line directive if
8183e12c5d1SDavid du Colombier	 * no alloc has happened since the last one
8193e12c5d1SDavid du Colombier	 */
8203e12c5d1SDavid du Colombier	if(newflag == 0 && ehist != H && offset != 0 && ehist->offset != 0)
8213e12c5d1SDavid du Colombier		if(f && ehist->name && strcmp(f, ehist->name) == 0) {
8223e12c5d1SDavid du Colombier			ehist->line = lineno;
8233e12c5d1SDavid du Colombier			ehist->offset = offset;
8243e12c5d1SDavid du Colombier			return;
8253e12c5d1SDavid du Colombier		}
826219b2ee8SDavid du Colombier
827219b2ee8SDavid du Colombier	if(debug['f'])
828219b2ee8SDavid du Colombier		if(f) {
829219b2ee8SDavid du Colombier			if(offset)
8307dd7cddfSDavid du Colombier				print("%4ld: %s (#line %d)\n", lineno, f, offset);
831219b2ee8SDavid du Colombier			else
8327dd7cddfSDavid du Colombier				print("%4ld: %s\n", lineno, f);
833219b2ee8SDavid du Colombier		} else
8347dd7cddfSDavid du Colombier			print("%4ld: <pop>\n", lineno);
8353e12c5d1SDavid du Colombier	newflag = 0;
8363e12c5d1SDavid du Colombier
8377dd7cddfSDavid du Colombier	h = alloc(sizeof(Hist));
8383e12c5d1SDavid du Colombier	h->name = f;
8393e12c5d1SDavid du Colombier	h->line = lineno;
8403e12c5d1SDavid du Colombier	h->offset = offset;
8413e12c5d1SDavid du Colombier	h->link = H;
8423e12c5d1SDavid du Colombier	if(ehist == H) {
8433e12c5d1SDavid du Colombier		hist = h;
8443e12c5d1SDavid du Colombier		ehist = h;
8453e12c5d1SDavid du Colombier		return;
8463e12c5d1SDavid du Colombier	}
8473e12c5d1SDavid du Colombier	ehist->link = h;
8483e12c5d1SDavid du Colombier	ehist = h;
8493e12c5d1SDavid du Colombier}
8503e12c5d1SDavid du Colombier
8513e12c5d1SDavid du Colombiervoid
8523e12c5d1SDavid du Colombiergethunk(void)
8533e12c5d1SDavid du Colombier{
8543e12c5d1SDavid du Colombier	char *h;
8553e12c5d1SDavid du Colombier	long nh;
8563e12c5d1SDavid du Colombier
8573e12c5d1SDavid du Colombier	nh = NHUNK;
8583e12c5d1SDavid du Colombier	if(thunk >= 10L*NHUNK)
8593e12c5d1SDavid du Colombier		nh = 10L*NHUNK;
8607dd7cddfSDavid du Colombier	h = (char*)mysbrk(nh);
8613e12c5d1SDavid du Colombier	if(h == (char*)-1) {
8623e12c5d1SDavid du Colombier		yyerror("out of memory");
8633e12c5d1SDavid du Colombier		errorexit();
8643e12c5d1SDavid du Colombier	}
8653e12c5d1SDavid du Colombier	hunk = h;
8663e12c5d1SDavid du Colombier	nhunk = nh;
8673e12c5d1SDavid du Colombier	thunk += nh;
8683e12c5d1SDavid du Colombier}
869