xref: /plan9/sys/src/cmd/cc/lexbody (revision 183e6fd711797f00777ca42f9c4f8f07249f1b3d)
13e12c5d1SDavid du Colombier/*
23e12c5d1SDavid du Colombier * common code for all the assemblers
33e12c5d1SDavid du Colombier */
43e12c5d1SDavid du Colombier
5e288d156SDavid du Colombiervoid
69847521cSDavid du Colombierpragpack(void)
7e288d156SDavid du Colombier{
8e288d156SDavid du Colombier	while(getnsc() != '\n')
9e288d156SDavid du Colombier		;
10e288d156SDavid du Colombier}
11e288d156SDavid du Colombier
12e288d156SDavid du Colombiervoid
13e288d156SDavid du Colombierpragvararg(void)
14e288d156SDavid du Colombier{
15e288d156SDavid du Colombier	while(getnsc() != '\n')
16e288d156SDavid du Colombier		;
17e288d156SDavid du Colombier}
18e288d156SDavid du Colombier
19e288d156SDavid du Colombiervoid
20e288d156SDavid du Colombierpragfpround(void)
21e288d156SDavid du Colombier{
22e288d156SDavid du Colombier	while(getnsc() != '\n')
23e288d156SDavid du Colombier		;
24e288d156SDavid du Colombier}
25e288d156SDavid du Colombier
26e288d156SDavid du Colombiervoid
27e288d156SDavid du Colombierpragprofile(void)
28e288d156SDavid du Colombier{
29e288d156SDavid du Colombier	while(getnsc() != '\n')
30e288d156SDavid du Colombier		;
31e288d156SDavid du Colombier}
32e288d156SDavid du Colombier
33375daca8SDavid du Colombiervoid
34375daca8SDavid du Colombierpragincomplete(void)
35375daca8SDavid du Colombier{
36375daca8SDavid du Colombier	while(getnsc() != '\n')
37375daca8SDavid du Colombier		;
38375daca8SDavid du Colombier}
39375daca8SDavid du Colombier
407dd7cddfSDavid du Colombier/*
417dd7cddfSDavid du Colombier * real allocs
427dd7cddfSDavid du Colombier */
437dd7cddfSDavid du Colombiervoid*
447dd7cddfSDavid du Colombieralloc(long n)
457dd7cddfSDavid du Colombier{
467dd7cddfSDavid du Colombier	void *p;
477dd7cddfSDavid du Colombier
484de34a7eSDavid du Colombier	while((uintptr)hunk & MAXALIGN) {
497dd7cddfSDavid du Colombier		hunk++;
507dd7cddfSDavid du Colombier		nhunk--;
517dd7cddfSDavid du Colombier	}
527dd7cddfSDavid du Colombier	while(nhunk < n)
537dd7cddfSDavid du Colombier		gethunk();
547dd7cddfSDavid du Colombier	p = hunk;
557dd7cddfSDavid du Colombier	nhunk -= n;
567dd7cddfSDavid du Colombier	hunk += n;
577dd7cddfSDavid du Colombier	return p;
587dd7cddfSDavid du Colombier}
597dd7cddfSDavid du Colombier
607dd7cddfSDavid du Colombiervoid*
617dd7cddfSDavid du Colombierallocn(void *p, long on, long n)
627dd7cddfSDavid du Colombier{
637dd7cddfSDavid du Colombier	void *q;
647dd7cddfSDavid du Colombier
657dd7cddfSDavid du Colombier	q = (uchar*)p + on;
667dd7cddfSDavid du Colombier	if(q != hunk || nhunk < n) {
677dd7cddfSDavid du Colombier		while(nhunk < on+n)
687dd7cddfSDavid du Colombier			gethunk();
697dd7cddfSDavid du Colombier		memmove(hunk, p, on);
707dd7cddfSDavid du Colombier		p = hunk;
717dd7cddfSDavid du Colombier		hunk += on;
727dd7cddfSDavid du Colombier		nhunk -= on;
737dd7cddfSDavid du Colombier	}
747dd7cddfSDavid du Colombier	hunk += n;
757dd7cddfSDavid du Colombier	nhunk -= n;
767dd7cddfSDavid du Colombier	return p;
777dd7cddfSDavid du Colombier}
787dd7cddfSDavid du Colombier
797dd7cddfSDavid du Colombiervoid
807dd7cddfSDavid du Colombiersetinclude(char *p)
817dd7cddfSDavid du Colombier{
827dd7cddfSDavid du Colombier	int i;
837dd7cddfSDavid du Colombier
847dd7cddfSDavid du Colombier	if(p == 0)
857dd7cddfSDavid du Colombier		return;
867dd7cddfSDavid du Colombier	for(i=1; i < ninclude; i++)
877dd7cddfSDavid du Colombier		if(strcmp(p, include[i]) == 0)
887dd7cddfSDavid du Colombier			return;
897dd7cddfSDavid du Colombier
907dd7cddfSDavid du Colombier	if(ninclude >= nelem(include)) {
917dd7cddfSDavid du Colombier		yyerror("ninclude too small %d", nelem(include));
927dd7cddfSDavid du Colombier		exits("ninclude");
937dd7cddfSDavid du Colombier	}
947dd7cddfSDavid du Colombier	include[ninclude++] = p;
957dd7cddfSDavid du Colombier}
967dd7cddfSDavid du Colombier
973e12c5d1SDavid du Colombiervoid
983e12c5d1SDavid du Colombiererrorexit(void)
993e12c5d1SDavid du Colombier{
1003e12c5d1SDavid du Colombier
1013e12c5d1SDavid du Colombier	if(outfile)
1023e12c5d1SDavid du Colombier		remove(outfile);
1033e12c5d1SDavid du Colombier	exits("error");
1043e12c5d1SDavid du Colombier}
1053e12c5d1SDavid du Colombier
1063e12c5d1SDavid du Colombiervoid
1073e12c5d1SDavid du Colombierpushio(void)
1083e12c5d1SDavid du Colombier{
1093e12c5d1SDavid du Colombier	Io *i;
1103e12c5d1SDavid du Colombier
1113e12c5d1SDavid du Colombier	i = iostack;
1123e12c5d1SDavid du Colombier	if(i == I) {
1133e12c5d1SDavid du Colombier		yyerror("botch in pushio");
1143e12c5d1SDavid du Colombier		errorexit();
1153e12c5d1SDavid du Colombier	}
1163e12c5d1SDavid du Colombier	i->p = fi.p;
1173e12c5d1SDavid du Colombier	i->c = fi.c;
1183e12c5d1SDavid du Colombier}
1193e12c5d1SDavid du Colombier
1203e12c5d1SDavid du Colombiervoid
1213e12c5d1SDavid du Colombiernewio(void)
1223e12c5d1SDavid du Colombier{
1233e12c5d1SDavid du Colombier	Io *i;
124375daca8SDavid du Colombier	static int pushdepth = 0;
1253e12c5d1SDavid du Colombier
1263e12c5d1SDavid du Colombier	i = iofree;
1273e12c5d1SDavid du Colombier	if(i == I) {
1283e12c5d1SDavid du Colombier		pushdepth++;
1293e12c5d1SDavid du Colombier		if(pushdepth > 1000) {
1303e12c5d1SDavid du Colombier			yyerror("macro/io expansion too deep");
1313e12c5d1SDavid du Colombier			errorexit();
1323e12c5d1SDavid du Colombier		}
1337dd7cddfSDavid du Colombier		i = alloc(sizeof(*i));
1343e12c5d1SDavid du Colombier	} else
1353e12c5d1SDavid du Colombier		iofree = i->link;
1363e12c5d1SDavid du Colombier	i->c = 0;
1373e12c5d1SDavid du Colombier	i->f = -1;
1383e12c5d1SDavid du Colombier	ionext = i;
1393e12c5d1SDavid du Colombier}
1403e12c5d1SDavid du Colombier
1413e12c5d1SDavid du Colombiervoid
1423e12c5d1SDavid du Colombiernewfile(char *s, int f)
1433e12c5d1SDavid du Colombier{
1443e12c5d1SDavid du Colombier	Io *i;
1453e12c5d1SDavid du Colombier
1463e12c5d1SDavid du Colombier	i = ionext;
1473e12c5d1SDavid du Colombier	i->link = iostack;
1483e12c5d1SDavid du Colombier	iostack = i;
1493e12c5d1SDavid du Colombier	i->f = f;
1503e12c5d1SDavid du Colombier	if(f < 0)
1513e12c5d1SDavid du Colombier		i->f = open(s, 0);
1523e12c5d1SDavid du Colombier	if(i->f < 0) {
1537dd7cddfSDavid du Colombier		yyerror("%ca: %r: %s", thechar, s);
1543e12c5d1SDavid du Colombier		errorexit();
1553e12c5d1SDavid du Colombier	}
1563e12c5d1SDavid du Colombier	fi.c = 0;
1573e12c5d1SDavid du Colombier	linehist(s, 0);
1583e12c5d1SDavid du Colombier}
1593e12c5d1SDavid du Colombier
1603e12c5d1SDavid du ColombierSym*
1613e12c5d1SDavid du Colombierslookup(char *s)
1623e12c5d1SDavid du Colombier{
1633e12c5d1SDavid du Colombier
1643e12c5d1SDavid du Colombier	strcpy(symb, s);
1653e12c5d1SDavid du Colombier	return lookup();
1663e12c5d1SDavid du Colombier}
1673e12c5d1SDavid du Colombier
1683e12c5d1SDavid du ColombierSym*
1693e12c5d1SDavid du Colombierlookup(void)
1703e12c5d1SDavid du Colombier{
1713e12c5d1SDavid du Colombier	Sym *s;
172219b2ee8SDavid du Colombier	long h;
173219b2ee8SDavid du Colombier	char *p;
174219b2ee8SDavid du Colombier	int c, l;
1753e12c5d1SDavid du Colombier
1763e12c5d1SDavid du Colombier	h = 0;
177219b2ee8SDavid du Colombier	for(p=symb; c = *p; p++)
178219b2ee8SDavid du Colombier		h = h+h+h + c;
179219b2ee8SDavid du Colombier	l = (p - symb) + 1;
1803e12c5d1SDavid du Colombier	if(h < 0)
1813e12c5d1SDavid du Colombier		h = ~h;
1823e12c5d1SDavid du Colombier	h %= NHASH;
183219b2ee8SDavid du Colombier	c = symb[0];
1843e12c5d1SDavid du Colombier	for(s = hash[h]; s != S; s = s->link) {
185219b2ee8SDavid du Colombier		if(s->name[0] != c)
1863e12c5d1SDavid du Colombier			continue;
187219b2ee8SDavid du Colombier		if(memcmp(s->name, symb, l) == 0)
1883e12c5d1SDavid du Colombier			return s;
1893e12c5d1SDavid du Colombier	}
1907dd7cddfSDavid du Colombier	s = alloc(sizeof(*s));
1917dd7cddfSDavid du Colombier	s->name = alloc(l);
192219b2ee8SDavid du Colombier	memmove(s->name, symb, l);
193219b2ee8SDavid du Colombier
1943e12c5d1SDavid du Colombier	s->link = hash[h];
1953e12c5d1SDavid du Colombier	hash[h] = s;
1963e12c5d1SDavid du Colombier	syminit(s);
1973e12c5d1SDavid du Colombier	return s;
1983e12c5d1SDavid du Colombier}
1993e12c5d1SDavid du Colombier
2003e12c5d1SDavid du Colombierlong
2013e12c5d1SDavid du Colombieryylex(void)
2023e12c5d1SDavid du Colombier{
2033e12c5d1SDavid du Colombier	int c, c1;
2043e12c5d1SDavid du Colombier	char *cp;
2053e12c5d1SDavid du Colombier	Sym *s;
2063e12c5d1SDavid du Colombier
2073e12c5d1SDavid du Colombier	c = peekc;
2083e12c5d1SDavid du Colombier	if(c != IGN) {
2093e12c5d1SDavid du Colombier		peekc = IGN;
2103e12c5d1SDavid du Colombier		goto l1;
2113e12c5d1SDavid du Colombier	}
2123e12c5d1SDavid du Colombierl0:
2133e12c5d1SDavid du Colombier	c = GETC();
2143e12c5d1SDavid du Colombier
2153e12c5d1SDavid du Colombierl1:
2163e12c5d1SDavid du Colombier	if(c == EOF) {
2173e12c5d1SDavid du Colombier		peekc = EOF;
2183e12c5d1SDavid du Colombier		return -1;
2193e12c5d1SDavid du Colombier	}
2203e12c5d1SDavid du Colombier	if(isspace(c)) {
2213e12c5d1SDavid du Colombier		if(c == '\n') {
2223e12c5d1SDavid du Colombier			lineno++;
2233e12c5d1SDavid du Colombier			return ';';
2243e12c5d1SDavid du Colombier		}
2253e12c5d1SDavid du Colombier		goto l0;
2263e12c5d1SDavid du Colombier	}
2273e12c5d1SDavid du Colombier	if(isalpha(c))
2283e12c5d1SDavid du Colombier		goto talph;
2293e12c5d1SDavid du Colombier	if(isdigit(c))
2303e12c5d1SDavid du Colombier		goto tnum;
2313e12c5d1SDavid du Colombier	switch(c)
2323e12c5d1SDavid du Colombier	{
2333e12c5d1SDavid du Colombier	case '\n':
2343e12c5d1SDavid du Colombier		lineno++;
2353e12c5d1SDavid du Colombier		return ';';
2363e12c5d1SDavid du Colombier
2373e12c5d1SDavid du Colombier	case '#':
2383e12c5d1SDavid du Colombier		domacro();
2393e12c5d1SDavid du Colombier		goto l0;
2403e12c5d1SDavid du Colombier
2413e12c5d1SDavid du Colombier	case '.':
2423e12c5d1SDavid du Colombier		c = GETC();
2433e12c5d1SDavid du Colombier		if(isalpha(c)) {
2443e12c5d1SDavid du Colombier			cp = symb;
2453e12c5d1SDavid du Colombier			*cp++ = '.';
2463e12c5d1SDavid du Colombier			goto aloop;
2473e12c5d1SDavid du Colombier		}
2483e12c5d1SDavid du Colombier		if(isdigit(c)) {
2493e12c5d1SDavid du Colombier			cp = symb;
2503e12c5d1SDavid du Colombier			*cp++ = '.';
2513e12c5d1SDavid du Colombier			goto casedot;
2523e12c5d1SDavid du Colombier		}
2533e12c5d1SDavid du Colombier		peekc = c;
2543e12c5d1SDavid du Colombier		return '.';
2553e12c5d1SDavid du Colombier
2563e12c5d1SDavid du Colombier	talph:
2573e12c5d1SDavid du Colombier	case '_':
2583e12c5d1SDavid du Colombier	case '@':
2593e12c5d1SDavid du Colombier		cp = symb;
2603e12c5d1SDavid du Colombier
2613e12c5d1SDavid du Colombier	aloop:
2623e12c5d1SDavid du Colombier		*cp++ = c;
2633e12c5d1SDavid du Colombier		c = GETC();
2647dd7cddfSDavid du Colombier		if(isalpha(c) || isdigit(c) || c == '_' || c == '$')
2653e12c5d1SDavid du Colombier			goto aloop;
2663e12c5d1SDavid du Colombier		*cp = 0;
2673e12c5d1SDavid du Colombier		peekc = c;
2683e12c5d1SDavid du Colombier		s = lookup();
2693e12c5d1SDavid du Colombier		if(s->macro) {
2703e12c5d1SDavid du Colombier			newio();
2713e12c5d1SDavid du Colombier			cp = ionext->b;
2723e12c5d1SDavid du Colombier			macexpand(s, cp);
2733e12c5d1SDavid du Colombier			pushio();
2743e12c5d1SDavid du Colombier			ionext->link = iostack;
2753e12c5d1SDavid du Colombier			iostack = ionext;
2763e12c5d1SDavid du Colombier			fi.p = cp;
2773e12c5d1SDavid du Colombier			fi.c = strlen(cp);
2783e12c5d1SDavid du Colombier			if(peekc != IGN) {
2793e12c5d1SDavid du Colombier				cp[fi.c++] = peekc;
2803e12c5d1SDavid du Colombier				cp[fi.c] = 0;
2813e12c5d1SDavid du Colombier				peekc = IGN;
2823e12c5d1SDavid du Colombier			}
2833e12c5d1SDavid du Colombier			goto l0;
2843e12c5d1SDavid du Colombier		}
2853e12c5d1SDavid du Colombier		if(s->type == 0)
2863e12c5d1SDavid du Colombier			s->type = LNAME;
2873e12c5d1SDavid du Colombier		if(s->type == LNAME ||
2883e12c5d1SDavid du Colombier		   s->type == LVAR ||
2893e12c5d1SDavid du Colombier		   s->type == LLAB) {
2903e12c5d1SDavid du Colombier			yylval.sym = s;
2913e12c5d1SDavid du Colombier			return s->type;
2923e12c5d1SDavid du Colombier		}
2933e12c5d1SDavid du Colombier		yylval.lval = s->value;
2943e12c5d1SDavid du Colombier		return s->type;
2953e12c5d1SDavid du Colombier
2963e12c5d1SDavid du Colombier	tnum:
2973e12c5d1SDavid du Colombier		cp = symb;
2983e12c5d1SDavid du Colombier		if(c != '0')
2993e12c5d1SDavid du Colombier			goto dc;
3003e12c5d1SDavid du Colombier		*cp++ = c;
3013e12c5d1SDavid du Colombier		c = GETC();
3023e12c5d1SDavid du Colombier		c1 = 3;
3033e12c5d1SDavid du Colombier		if(c == 'x' || c == 'X') {
3043e12c5d1SDavid du Colombier			c1 = 4;
3053e12c5d1SDavid du Colombier			c = GETC();
3063e12c5d1SDavid du Colombier		} else
3073e12c5d1SDavid du Colombier		if(c < '0' || c > '7')
3083e12c5d1SDavid du Colombier			goto dc;
3093e12c5d1SDavid du Colombier		yylval.lval = 0;
3103e12c5d1SDavid du Colombier		for(;;) {
3113e12c5d1SDavid du Colombier			if(c >= '0' && c <= '9') {
3123e12c5d1SDavid du Colombier				if(c > '7' && c1 == 3)
3133e12c5d1SDavid du Colombier					break;
3143e12c5d1SDavid du Colombier				yylval.lval <<= c1;
3153e12c5d1SDavid du Colombier				yylval.lval += c - '0';
3163e12c5d1SDavid du Colombier				c = GETC();
3173e12c5d1SDavid du Colombier				continue;
3183e12c5d1SDavid du Colombier			}
3193e12c5d1SDavid du Colombier			if(c1 == 3)
3203e12c5d1SDavid du Colombier				break;
3213e12c5d1SDavid du Colombier			if(c >= 'A' && c <= 'F')
3223e12c5d1SDavid du Colombier				c += 'a' - 'A';
3233e12c5d1SDavid du Colombier			if(c >= 'a' && c <= 'f') {
3243e12c5d1SDavid du Colombier				yylval.lval <<= c1;
3253e12c5d1SDavid du Colombier				yylval.lval += c - 'a' + 10;
3263e12c5d1SDavid du Colombier				c = GETC();
3273e12c5d1SDavid du Colombier				continue;
3283e12c5d1SDavid du Colombier			}
3293e12c5d1SDavid du Colombier			break;
3303e12c5d1SDavid du Colombier		}
3313e12c5d1SDavid du Colombier		goto ncu;
3323e12c5d1SDavid du Colombier
3333e12c5d1SDavid du Colombier	dc:
3343e12c5d1SDavid du Colombier		for(;;) {
3353e12c5d1SDavid du Colombier			if(!isdigit(c))
3363e12c5d1SDavid du Colombier				break;
3373e12c5d1SDavid du Colombier			*cp++ = c;
3383e12c5d1SDavid du Colombier			c = GETC();
3393e12c5d1SDavid du Colombier		}
3403e12c5d1SDavid du Colombier		if(c == '.')
3413e12c5d1SDavid du Colombier			goto casedot;
3423e12c5d1SDavid du Colombier		if(c == 'e' || c == 'E')
3433e12c5d1SDavid du Colombier			goto casee;
3443e12c5d1SDavid du Colombier		*cp = 0;
34524c25b93SDavid du Colombier		if(sizeof(yylval.lval) == sizeof(vlong))
34624c25b93SDavid du Colombier			yylval.lval = strtoll(symb, nil, 10);
34724c25b93SDavid du Colombier		else
34824c25b93SDavid du Colombier			yylval.lval = strtol(symb, nil, 10);
3493e12c5d1SDavid du Colombier
3503e12c5d1SDavid du Colombier	ncu:
35124c25b93SDavid du Colombier		while(c == 'U' || c == 'u' || c == 'l' || c == 'L')
35224c25b93SDavid du Colombier			c = GETC();
3533e12c5d1SDavid du Colombier		peekc = c;
3543e12c5d1SDavid du Colombier		return LCONST;
3553e12c5d1SDavid du Colombier
3563e12c5d1SDavid du Colombier	casedot:
3573e12c5d1SDavid du Colombier		for(;;) {
3583e12c5d1SDavid du Colombier			*cp++ = c;
3593e12c5d1SDavid du Colombier			c = GETC();
3603e12c5d1SDavid du Colombier			if(!isdigit(c))
3613e12c5d1SDavid du Colombier				break;
3623e12c5d1SDavid du Colombier		}
3633e12c5d1SDavid du Colombier		if(c == 'e' || c == 'E')
3643e12c5d1SDavid du Colombier			goto casee;
3653e12c5d1SDavid du Colombier		goto caseout;
3663e12c5d1SDavid du Colombier
3673e12c5d1SDavid du Colombier	casee:
3683e12c5d1SDavid du Colombier		*cp++ = 'e';
3693e12c5d1SDavid du Colombier		c = GETC();
3703e12c5d1SDavid du Colombier		if(c == '+' || c == '-') {
3713e12c5d1SDavid du Colombier			*cp++ = c;
3723e12c5d1SDavid du Colombier			c = GETC();
3733e12c5d1SDavid du Colombier		}
3743e12c5d1SDavid du Colombier		while(isdigit(c)) {
3753e12c5d1SDavid du Colombier			*cp++ = c;
3763e12c5d1SDavid du Colombier			c = GETC();
3773e12c5d1SDavid du Colombier		}
3783e12c5d1SDavid du Colombier
3793e12c5d1SDavid du Colombier	caseout:
3803e12c5d1SDavid du Colombier		*cp = 0;
3813e12c5d1SDavid du Colombier		peekc = c;
3823e12c5d1SDavid du Colombier		if(FPCHIP) {
3833e12c5d1SDavid du Colombier			yylval.dval = atof(symb);
3843e12c5d1SDavid du Colombier			return LFCONST;
3853e12c5d1SDavid du Colombier		}
3863e12c5d1SDavid du Colombier		yyerror("assembler cannot interpret fp constants");
3873e12c5d1SDavid du Colombier		yylval.lval = 1L;
3883e12c5d1SDavid du Colombier		return LCONST;
3893e12c5d1SDavid du Colombier
3903e12c5d1SDavid du Colombier	case '"':
3913e12c5d1SDavid du Colombier		memcpy(yylval.sval, nullgen.sval, sizeof(yylval.sval));
3923e12c5d1SDavid du Colombier		cp = yylval.sval;
3933e12c5d1SDavid du Colombier		c1 = 0;
3943e12c5d1SDavid du Colombier		for(;;) {
3953e12c5d1SDavid du Colombier			c = escchar('"');
3963e12c5d1SDavid du Colombier			if(c == EOF)
3973e12c5d1SDavid du Colombier				break;
3983e12c5d1SDavid du Colombier			if(c1 < sizeof(yylval.sval))
3993e12c5d1SDavid du Colombier				*cp++ = c;
4003e12c5d1SDavid du Colombier			c1++;
4013e12c5d1SDavid du Colombier		}
4023e12c5d1SDavid du Colombier		if(c1 > sizeof(yylval.sval))
4033e12c5d1SDavid du Colombier			yyerror("string constant too long");
4043e12c5d1SDavid du Colombier		return LSCONST;
4053e12c5d1SDavid du Colombier
4063e12c5d1SDavid du Colombier	case '\'':
4073e12c5d1SDavid du Colombier		c = escchar('\'');
4083e12c5d1SDavid du Colombier		if(c == EOF)
4093e12c5d1SDavid du Colombier			c = '\'';
4103e12c5d1SDavid du Colombier		if(escchar('\'') != EOF)
4113e12c5d1SDavid du Colombier			yyerror("missing '");
4123e12c5d1SDavid du Colombier		yylval.lval = c;
4133e12c5d1SDavid du Colombier		return LCONST;
4143e12c5d1SDavid du Colombier
4153e12c5d1SDavid du Colombier	case '/':
4163e12c5d1SDavid du Colombier		c1 = GETC();
4177dd7cddfSDavid du Colombier		if(c1 == '/') {
4187dd7cddfSDavid du Colombier			for(;;) {
4197dd7cddfSDavid du Colombier				c = GETC();
420*183e6fd7SDavid du Colombier				if(c == '\n')
421*183e6fd7SDavid du Colombier					goto l1;
4227dd7cddfSDavid du Colombier				if(c == EOF) {
4237dd7cddfSDavid du Colombier					yyerror("eof in comment");
4247dd7cddfSDavid du Colombier					errorexit();
4257dd7cddfSDavid du Colombier				}
4267dd7cddfSDavid du Colombier			}
4277dd7cddfSDavid du Colombier		}
4283e12c5d1SDavid du Colombier		if(c1 == '*') {
4293e12c5d1SDavid du Colombier			for(;;) {
4303e12c5d1SDavid du Colombier				c = GETC();
4313e12c5d1SDavid du Colombier				while(c == '*') {
4323e12c5d1SDavid du Colombier					c = GETC();
4333e12c5d1SDavid du Colombier					if(c == '/')
4343e12c5d1SDavid du Colombier						goto l0;
4353e12c5d1SDavid du Colombier				}
4363e12c5d1SDavid du Colombier				if(c == EOF) {
4373e12c5d1SDavid du Colombier					yyerror("eof in comment");
4383e12c5d1SDavid du Colombier					errorexit();
4393e12c5d1SDavid du Colombier				}
4403e12c5d1SDavid du Colombier				if(c == '\n')
4413e12c5d1SDavid du Colombier					lineno++;
4423e12c5d1SDavid du Colombier			}
4433e12c5d1SDavid du Colombier		}
4443e12c5d1SDavid du Colombier		break;
4453e12c5d1SDavid du Colombier
4463e12c5d1SDavid du Colombier	default:
4473e12c5d1SDavid du Colombier		return c;
4483e12c5d1SDavid du Colombier	}
4493e12c5d1SDavid du Colombier	peekc = c1;
4503e12c5d1SDavid du Colombier	return c;
4513e12c5d1SDavid du Colombier}
4523e12c5d1SDavid du Colombier
4533e12c5d1SDavid du Colombierint
4543e12c5d1SDavid du Colombiergetc(void)
4553e12c5d1SDavid du Colombier{
4563e12c5d1SDavid du Colombier	int c;
4573e12c5d1SDavid du Colombier
4583e12c5d1SDavid du Colombier	c = peekc;
4593e12c5d1SDavid du Colombier	if(c != IGN) {
4603e12c5d1SDavid du Colombier		peekc = IGN;
4613e12c5d1SDavid du Colombier		return c;
4623e12c5d1SDavid du Colombier	}
4633e12c5d1SDavid du Colombier	c = GETC();
4643e12c5d1SDavid du Colombier	if(c == '\n')
4653e12c5d1SDavid du Colombier		lineno++;
4663e12c5d1SDavid du Colombier	if(c == EOF) {
4673e12c5d1SDavid du Colombier		yyerror("End of file");
4683e12c5d1SDavid du Colombier		errorexit();
4693e12c5d1SDavid du Colombier	}
4703e12c5d1SDavid du Colombier	return c;
4713e12c5d1SDavid du Colombier}
4723e12c5d1SDavid du Colombier
4733e12c5d1SDavid du Colombierint
4743e12c5d1SDavid du Colombiergetnsc(void)
4753e12c5d1SDavid du Colombier{
4763e12c5d1SDavid du Colombier	int c;
4773e12c5d1SDavid du Colombier
4783e12c5d1SDavid du Colombier	for(;;) {
4793e12c5d1SDavid du Colombier		c = getc();
4803e12c5d1SDavid du Colombier		if(!isspace(c) || c == '\n')
4813e12c5d1SDavid du Colombier			return c;
4823e12c5d1SDavid du Colombier	}
4833e12c5d1SDavid du Colombier}
4843e12c5d1SDavid du Colombier
4853e12c5d1SDavid du Colombiervoid
4863e12c5d1SDavid du Colombierunget(int c)
4873e12c5d1SDavid du Colombier{
4883e12c5d1SDavid du Colombier
4893e12c5d1SDavid du Colombier	peekc = c;
4903e12c5d1SDavid du Colombier	if(c == '\n')
4913e12c5d1SDavid du Colombier		lineno--;
4923e12c5d1SDavid du Colombier}
4933e12c5d1SDavid du Colombier
4943e12c5d1SDavid du Colombierint
4953e12c5d1SDavid du Colombierescchar(int e)
4963e12c5d1SDavid du Colombier{
4973e12c5d1SDavid du Colombier	int c, l;
4983e12c5d1SDavid du Colombier
4993e12c5d1SDavid du Colombierloop:
5003e12c5d1SDavid du Colombier	c = getc();
5013e12c5d1SDavid du Colombier	if(c == '\n') {
5023e12c5d1SDavid du Colombier		yyerror("newline in string");
5033e12c5d1SDavid du Colombier		return EOF;
5043e12c5d1SDavid du Colombier	}
5053e12c5d1SDavid du Colombier	if(c != '\\') {
5063e12c5d1SDavid du Colombier		if(c == e)
5073e12c5d1SDavid du Colombier			return EOF;
5083e12c5d1SDavid du Colombier		return c;
5093e12c5d1SDavid du Colombier	}
5103e12c5d1SDavid du Colombier	c = getc();
5113e12c5d1SDavid du Colombier	if(c >= '0' && c <= '7') {
5123e12c5d1SDavid du Colombier		l = c - '0';
5133e12c5d1SDavid du Colombier		c = getc();
5143e12c5d1SDavid du Colombier		if(c >= '0' && c <= '7') {
5153e12c5d1SDavid du Colombier			l = l*8 + c-'0';
5163e12c5d1SDavid du Colombier			c = getc();
5173e12c5d1SDavid du Colombier			if(c >= '0' && c <= '7') {
5183e12c5d1SDavid du Colombier				l = l*8 + c-'0';
5193e12c5d1SDavid du Colombier				return l;
5203e12c5d1SDavid du Colombier			}
5213e12c5d1SDavid du Colombier		}
5223e12c5d1SDavid du Colombier		peekc = c;
5233e12c5d1SDavid du Colombier		return l;
5243e12c5d1SDavid du Colombier	}
5253e12c5d1SDavid du Colombier	switch(c)
5263e12c5d1SDavid du Colombier	{
5273e12c5d1SDavid du Colombier	case '\n':	goto loop;
5283e12c5d1SDavid du Colombier	case 'n':	return '\n';
5293e12c5d1SDavid du Colombier	case 't':	return '\t';
5303e12c5d1SDavid du Colombier	case 'b':	return '\b';
5313e12c5d1SDavid du Colombier	case 'r':	return '\r';
5323e12c5d1SDavid du Colombier	case 'f':	return '\f';
5333e12c5d1SDavid du Colombier	case 'a':	return 0x07;
5343e12c5d1SDavid du Colombier	case 'v':	return 0x0b;
5353e12c5d1SDavid du Colombier	case 'z':	return 0x00;
5363e12c5d1SDavid du Colombier	}
5373e12c5d1SDavid du Colombier	return c;
5383e12c5d1SDavid du Colombier}
5393e12c5d1SDavid du Colombier
5403e12c5d1SDavid du Colombiervoid
5413e12c5d1SDavid du Colombierpinit(char *f)
5423e12c5d1SDavid du Colombier{
5433e12c5d1SDavid du Colombier	int i;
5443e12c5d1SDavid du Colombier	Sym *s;
5453e12c5d1SDavid du Colombier
5463e12c5d1SDavid du Colombier	lineno = 1;
5473e12c5d1SDavid du Colombier	newio();
5483e12c5d1SDavid du Colombier	newfile(f, -1);
5493e12c5d1SDavid du Colombier	pc = 0;
5503e12c5d1SDavid du Colombier	peekc = IGN;
5513e12c5d1SDavid du Colombier	sym = 1;
5523e12c5d1SDavid du Colombier	for(i=0; i<NSYM; i++) {
5533e12c5d1SDavid du Colombier		h[i].type = 0;
5543e12c5d1SDavid du Colombier		h[i].sym = S;
5553e12c5d1SDavid du Colombier	}
5563e12c5d1SDavid du Colombier	for(i=0; i<NHASH; i++)
5573e12c5d1SDavid du Colombier		for(s = hash[i]; s != S; s = s->link)
5583e12c5d1SDavid du Colombier			s->macro = 0;
5593e12c5d1SDavid du Colombier}
5603e12c5d1SDavid du Colombier
5613e12c5d1SDavid du Colombierint
5623e12c5d1SDavid du Colombierfilbuf(void)
5633e12c5d1SDavid du Colombier{
5643e12c5d1SDavid du Colombier	Io *i;
5653e12c5d1SDavid du Colombier
5663e12c5d1SDavid du Colombierloop:
5673e12c5d1SDavid du Colombier	i = iostack;
5683e12c5d1SDavid du Colombier	if(i == I)
5693e12c5d1SDavid du Colombier		return EOF;
5703e12c5d1SDavid du Colombier	if(i->f < 0)
5713e12c5d1SDavid du Colombier		goto pop;
5723e12c5d1SDavid du Colombier	fi.c = read(i->f, i->b, BUFSIZ) - 1;
5733e12c5d1SDavid du Colombier	if(fi.c < 0) {
5743e12c5d1SDavid du Colombier		close(i->f);
5753e12c5d1SDavid du Colombier		linehist(0, 0);
5763e12c5d1SDavid du Colombier		goto pop;
5773e12c5d1SDavid du Colombier	}
5783e12c5d1SDavid du Colombier	fi.p = i->b + 1;
5793e12c5d1SDavid du Colombier	return i->b[0];
5803e12c5d1SDavid du Colombier
5813e12c5d1SDavid du Colombierpop:
5823e12c5d1SDavid du Colombier	iostack = i->link;
5833e12c5d1SDavid du Colombier	i->link = iofree;
5843e12c5d1SDavid du Colombier	iofree = i;
5853e12c5d1SDavid du Colombier	i = iostack;
5863e12c5d1SDavid du Colombier	if(i == I)
5873e12c5d1SDavid du Colombier		return EOF;
5883e12c5d1SDavid du Colombier	fi.p = i->p;
5893e12c5d1SDavid du Colombier	fi.c = i->c;
5903e12c5d1SDavid du Colombier	if(--fi.c < 0)
5913e12c5d1SDavid du Colombier		goto loop;
5923e12c5d1SDavid du Colombier	return *fi.p++;
5933e12c5d1SDavid du Colombier}
5943e12c5d1SDavid du Colombier
5953e12c5d1SDavid du Colombiervoid
5963e12c5d1SDavid du Colombieryyerror(char *a, ...)
5973e12c5d1SDavid du Colombier{
5983e12c5d1SDavid du Colombier	char buf[200];
5997dd7cddfSDavid du Colombier	va_list arg;
6003e12c5d1SDavid du Colombier
6013e12c5d1SDavid du Colombier	/*
6023e12c5d1SDavid du Colombier	 * hack to intercept message from yaccpar
6033e12c5d1SDavid du Colombier	 */
6043e12c5d1SDavid du Colombier	if(strcmp(a, "syntax error") == 0) {
6053e12c5d1SDavid du Colombier		yyerror("syntax error, last name: %s", symb);
6063e12c5d1SDavid du Colombier		return;
6073e12c5d1SDavid du Colombier	}
6083e12c5d1SDavid du Colombier	prfile(lineno);
6097dd7cddfSDavid du Colombier	va_start(arg, a);
6109a747e4fSDavid du Colombier	vseprint(buf, buf+sizeof(buf), a, arg);
6117dd7cddfSDavid du Colombier	va_end(arg);
6123e12c5d1SDavid du Colombier	print("%s\n", buf);
6133e12c5d1SDavid du Colombier	nerrors++;
6143e12c5d1SDavid du Colombier	if(nerrors > 10) {
6153e12c5d1SDavid du Colombier		print("too many errors\n");
6163e12c5d1SDavid du Colombier		errorexit();
6173e12c5d1SDavid du Colombier	}
6183e12c5d1SDavid du Colombier}
6193e12c5d1SDavid du Colombier
6203e12c5d1SDavid du Colombiervoid
6213e12c5d1SDavid du Colombierprfile(long l)
6223e12c5d1SDavid du Colombier{
6233e12c5d1SDavid du Colombier	int i, n;
6243e12c5d1SDavid du Colombier	Hist a[HISTSZ], *h;
6253e12c5d1SDavid du Colombier	long d;
6263e12c5d1SDavid du Colombier
6273e12c5d1SDavid du Colombier	n = 0;
6283e12c5d1SDavid du Colombier	for(h = hist; h != H; h = h->link) {
6293e12c5d1SDavid du Colombier		if(l < h->line)
6303e12c5d1SDavid du Colombier			break;
6313e12c5d1SDavid du Colombier		if(h->name) {
6323e12c5d1SDavid du Colombier			if(h->offset == 0) {
6333e12c5d1SDavid du Colombier				if(n >= 0 && n < HISTSZ)
6343e12c5d1SDavid du Colombier					a[n] = *h;
6353e12c5d1SDavid du Colombier				n++;
6363e12c5d1SDavid du Colombier				continue;
6373e12c5d1SDavid du Colombier			}
6383e12c5d1SDavid du Colombier			if(n > 0 && n < HISTSZ)
6393e12c5d1SDavid du Colombier				if(a[n-1].offset == 0) {
6403e12c5d1SDavid du Colombier					a[n] = *h;
6413e12c5d1SDavid du Colombier					n++;
6423e12c5d1SDavid du Colombier				} else
6433e12c5d1SDavid du Colombier					a[n-1] = *h;
6443e12c5d1SDavid du Colombier			continue;
6453e12c5d1SDavid du Colombier		}
6463e12c5d1SDavid du Colombier		n--;
6473e12c5d1SDavid du Colombier		if(n >= 0 && n < HISTSZ) {
6483e12c5d1SDavid du Colombier			d = h->line - a[n].line;
6493e12c5d1SDavid du Colombier			for(i=0; i<n; i++)
6503e12c5d1SDavid du Colombier				a[i].line += d;
6513e12c5d1SDavid du Colombier		}
6523e12c5d1SDavid du Colombier	}
6533e12c5d1SDavid du Colombier	if(n > HISTSZ)
6543e12c5d1SDavid du Colombier		n = HISTSZ;
6553e12c5d1SDavid du Colombier	for(i=0; i<n; i++)
6567dd7cddfSDavid du Colombier		print("%s:%ld ", a[i].name, (long)(l-a[i].line+a[i].offset+1));
6573e12c5d1SDavid du Colombier}
6583e12c5d1SDavid du Colombier
6593e12c5d1SDavid du Colombiervoid
6603e12c5d1SDavid du Colombierieeedtod(Ieee *ieee, double native)
6613e12c5d1SDavid du Colombier{
6623e12c5d1SDavid du Colombier	double fr, ho, f;
6633e12c5d1SDavid du Colombier	int exp;
6643e12c5d1SDavid du Colombier
6653e12c5d1SDavid du Colombier	if(native < 0) {
6663e12c5d1SDavid du Colombier		ieeedtod(ieee, -native);
6673e12c5d1SDavid du Colombier		ieee->h |= 0x80000000L;
6683e12c5d1SDavid du Colombier		return;
6693e12c5d1SDavid du Colombier	}
6703e12c5d1SDavid du Colombier	if(native == 0) {
6713e12c5d1SDavid du Colombier		ieee->l = 0;
6723e12c5d1SDavid du Colombier		ieee->h = 0;
6733e12c5d1SDavid du Colombier		return;
6743e12c5d1SDavid du Colombier	}
6753e12c5d1SDavid du Colombier	fr = frexp(native, &exp);
6763e12c5d1SDavid du Colombier	f = 2097152L;		/* shouldnt use fp constants here */
6773e12c5d1SDavid du Colombier	fr = modf(fr*f, &ho);
6783e12c5d1SDavid du Colombier	ieee->h = ho;
6793e12c5d1SDavid du Colombier	ieee->h &= 0xfffffL;
6803e12c5d1SDavid du Colombier	ieee->h |= (exp+1022L) << 20;
6813e12c5d1SDavid du Colombier	f = 65536L;
6823e12c5d1SDavid du Colombier	fr = modf(fr*f, &ho);
6833e12c5d1SDavid du Colombier	ieee->l = ho;
6843e12c5d1SDavid du Colombier	ieee->l <<= 16;
6853e12c5d1SDavid du Colombier	ieee->l |= (long)(fr*f);
6863e12c5d1SDavid du Colombier}
687