cmd/cc: delete lexbody, macbody

These files were left behind for the C implementation of the assemblers.
They're no longer needed.

This is the last of the cmd/cc directory.

Change-Id: I9231b23c27fead5695000097aeb694824747677d
Reviewed-on: https://go-review.googlesource.com/6367
Reviewed-by: Minux Ma <minux@golang.org>
diff --git a/src/cmd/cc/lexbody b/src/cmd/cc/lexbody
deleted file mode 100644
index 4749273..0000000
--- a/src/cmd/cc/lexbody
+++ /dev/null
@@ -1,736 +0,0 @@
-// Inferno utils/cc/lexbody
-// http://code.google.com/p/inferno-os/source/browse/utils/cc/lexbody
-//
-//	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-//	Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
-//	Portions Copyright © 1997-1999 Vita Nuova Limited
-//	Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
-//	Portions Copyright © 2004,2006 Bruce Ellis
-//	Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
-//	Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
-//	Portions Copyright © 2009 The Go Authors.  All rights reserved.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-/*
- * common code for all the assemblers
- */
-
-void
-pragpack(void)
-{
-	while(getnsc() != '\n')
-		;
-}
-
-void
-pragvararg(void)
-{
-	while(getnsc() != '\n')
-		;
-}
-
-void
-pragcgo(char *name)
-{
-	USED(name);
-	while(getnsc() != '\n')
-		;
-}
-
-void
-pragfpround(void)
-{
-	while(getnsc() != '\n')
-		;
-}
-
-void
-pragtextflag(void)
-{
-	while(getnsc() != '\n')
-		;
-}
-
-void
-pragdataflag(void)
-{
-	while(getnsc() != '\n')
-		;
-}
-
-void
-pragprofile(void)
-{
-	while(getnsc() != '\n')
-		;
-}
-
-void
-pragincomplete(void)
-{
-	while(getnsc() != '\n')
-		;
-}
-
-void*
-alloc(int32 n)
-{
-	void *p;
-
-	p = malloc(n);
-	if(p == nil) {
-		print("alloc out of mem\n");
-		exits("alloc: out of mem");
-	}
-	memset(p, 0, n);
-	return p;
-}
-
-void*
-allocn(void *p, int32 n, int32 d)
-{
-	if(p == nil)
-		return alloc(n+d);
-	p = realloc(p, n+d);
-	if(p == nil) {
-		print("allocn out of mem\n");
-		exits("allocn: out of mem");
-	}
-	if(d > 0)
-		memset((char*)p+n, 0, d);
-	return p;
-}
-
-void
-ensuresymb(int32 n)
-{
-	if(symb == nil) {
-		symb = alloc(NSYMB+1);
-		nsymb = NSYMB;
-	}
-
-	if(n > nsymb) {
-		symb = allocn(symb, nsymb, n+1-nsymb);
-		nsymb = n;
-	}
-}
-
-void
-setinclude(char *p)
-{
-	int i;
-
-	if(p == 0)
-		return;
-	for(i=1; i < ninclude; i++)
-		if(strcmp(p, include[i]) == 0)
-			return;
-	
-	if(ninclude%8 == 0)
-		include = allocn(include, ninclude*sizeof(char *), 
-			8*sizeof(char *));
-	include[ninclude++] = p;
-}
-
-void
-errorexit(void)
-{
-	Bflush(&bstdout);
-	if(outfile)
-		remove(outfile);
-	exits("error");
-}
-
-void
-pushio(void)
-{
-	Io *i;
-
-	i = iostack;
-	if(i == I) {
-		yyerror("botch in pushio");
-		errorexit();
-	}
-	i->p = fi.p;
-	i->c = fi.c;
-}
-
-void
-newio(void)
-{
-	Io *i;
-	static int pushdepth = 0;
-
-	i = iofree;
-	if(i == I) {
-		pushdepth++;
-		if(pushdepth > 1000) {
-			yyerror("macro/io expansion too deep");
-			errorexit();
-		}
-		i = alloc(sizeof(*i));
-	} else
-		iofree = i->link;
-	i->c = 0;
-	i->f = -1;
-	ionext = i;
-}
-
-void
-newfile(char *s, int f)
-{
-	Io *i;
-
-	i = ionext;
-	i->link = iostack;
-	iostack = i;
-	i->f = f;
-	if(f < 0)
-		i->f = open(s, 0);
-	if(i->f < 0) {
-		yyerror("%ca: %r: %s", thechar, s);
-		errorexit();
-	}
-	fi.c = 0;
-	linklinehist(ctxt, lineno, s, 0);
-}
-
-Sym*
-slookup(char *s)
-{
-	ensuresymb(strlen(s));
-	strcpy(symb, s);
-	return lookup();
-}
-
-LSym *thetext;
-
-void
-settext(LSym *s)
-{
-	thetext = s;
-}
-
-Sym*
-labellookup(Sym *s)
-{
-	char *p;
-	Sym *lab;
-	
-	if(thetext == nil) {
-		s->labelname = s->name;
-		return s;
-	}
-	p = smprint("%s.%s", thetext->name, s->name);
-	lab = slookup(p);
-	free(p);
-	lab->labelname = s->name;
-	return lab;
-}
-
-Sym*
-lookup(void)
-{
-	Sym *s;
-	uint32 h;
-	char *p;
-	int c, l;
-	char *r, *w;
-
-	if((uchar)symb[0] == 0xc2 && (uchar)symb[1] == 0xb7) {
-		// turn leading · into ""·
-		h = strlen(symb);
-		ensuresymb(h+2);
-		memmove(symb+2, symb, h+1);
-		symb[0] = '"';
-		symb[1] = '"';
-	}
-
-	for(r=w=symb; *r; r++) {
-		// turn · (U+00B7) into .
-		// turn ∕ (U+2215) into /
-		if((uchar)*r == 0xc2 && (uchar)*(r+1) == 0xb7) {
-			*w++ = '.';
-			r++;
-		}else if((uchar)*r == 0xe2 && (uchar)*(r+1) == 0x88 && (uchar)*(r+2) == 0x95) {
-			*w++ = '/';
-			r++;
-			r++;
-		}else
-			*w++ = *r;
-	}
-	*w = '\0';
-
-	h = 0;
-	for(p=symb; c = *p; p++)
-		h = h+h+h + c;
-	l = (p - symb) + 1;
-	h &= 0xffffff;
-	h %= NHASH;
-	c = symb[0];
-	for(s = hash[h]; s != S; s = s->link) {
-		if(s->name[0] != c)
-			continue;
-		if(strcmp(s->name, symb) == 0)
-			return s;
-	}
-	s = alloc(sizeof(*s));
-	s->name = alloc(l);
-	memmove(s->name, symb, l);
-
-	s->link = hash[h];
-	hash[h] = s;
-	syminit(s);
-	return s;
-}
-
-int
-ISALPHA(int c)
-{
-	if(isalpha(c))
-		return 1;
-	if(c >= Runeself)
-		return 1;
-	return 0;
-}
-
-int32
-yylex(void)
-{
-	int c, c1;
-	char *cp;
-	Sym *s;
-
-	c = peekc;
-	if(c != IGN) {
-		peekc = IGN;
-		goto l1;
-	}
-l0:
-	c = GETC();
-
-l1:
-	if(c == EOF) {
-		peekc = EOF;
-		return -1;
-	}
-	if(isspace(c)) {
-		if(c == '\n') {
-			lineno++;
-			return ';';
-		}
-		goto l0;
-	}
-	if(ISALPHA(c))
-		goto talph;
-	if(isdigit(c))
-		goto tnum;
-	switch(c)
-	{
-	case '\n':
-		lineno++;
-		return ';';
-
-	case '#':
-		domacro();
-		goto l0;
-
-	case '.':
-		c = GETC();
-		if(ISALPHA(c)) {
-			cp = symb;
-			*cp++ = '.';
-			goto aloop;
-		}
-		if(isdigit(c)) {
-			cp = symb;
-			*cp++ = '.';
-			goto casedot;
-		}
-		peekc = c;
-		return '.';
-
-	talph:
-	case '_':
-	case '@':
-		cp = symb;
-
-	aloop:
-		*cp++ = c;
-		c = GETC();
-		if(ISALPHA(c) || isdigit(c) || c == '_' || c == '$')
-			goto aloop;
-		*cp = 0;
-		peekc = c;
-		s = lookup();
-		if(s->macro) {
-			newio();
-			cp = ionext->b;
-			macexpand(s, cp);
-			pushio();
-			ionext->link = iostack;
-			iostack = ionext;
-			fi.p = cp;
-			fi.c = strlen(cp);
-			if(peekc != IGN) {
-				cp[fi.c++] = peekc;
-				cp[fi.c] = 0;
-				peekc = IGN;
-			}
-			goto l0;
-		}
-		if(s->type == 0)
-			s->type = LNAME;
-		if(s->type == LNAME ||
-		   s->type == LVAR ||
-		   s->type == LLAB) {
-			yylval.sym = s;
-			return s->type;
-		}
-		yylval.lval = s->value;
-		return s->type;
-
-	tnum:
-		cp = symb;
-		if(c != '0')
-			goto dc;
-		*cp++ = c;
-		c = GETC();
-		c1 = 3;
-		if(c == 'x' || c == 'X') {
-			c1 = 4;
-			c = GETC();
-		} else
-		if(c < '0' || c > '7')
-			goto dc;
-		yylval.lval = 0;
-		for(;;) {
-			if(c >= '0' && c <= '9') {
-				if(c > '7' && c1 == 3)
-					break;
-				yylval.lval = (uvlong)yylval.lval << c1;
-				yylval.lval += c - '0';
-				c = GETC();
-				continue;
-			}
-			if(c1 == 3)
-				break;
-			if(c >= 'A' && c <= 'F')
-				c += 'a' - 'A';
-			if(c >= 'a' && c <= 'f') {
-				yylval.lval = (uvlong)yylval.lval << c1;
-				yylval.lval += c - 'a' + 10;
-				c = GETC();
-				continue;
-			}
-			break;
-		}
-		goto ncu;
-
-	dc:
-		for(;;) {
-			if(!isdigit(c))
-				break;
-			*cp++ = c;
-			c = GETC();
-		}
-		if(c == '.')
-			goto casedot;
-		if(c == 'e' || c == 'E')
-			goto casee;
-		*cp = 0;
-		if(sizeof(yylval.lval) == sizeof(vlong))
-			yylval.lval = strtoll(symb, nil, 10);
-		else
-			yylval.lval = strtol(symb, nil, 10);
-
-	ncu:
-		while(c == 'U' || c == 'u' || c == 'l' || c == 'L')
-			c = GETC();
-		peekc = c;
-		return LCONST;
-
-	casedot:
-		for(;;) {
-			*cp++ = c;
-			c = GETC();
-			if(!isdigit(c))
-				break;
-		}
-		if(c == 'e' || c == 'E')
-			goto casee;
-		goto caseout;
-
-	casee:
-		*cp++ = 'e';
-		c = GETC();
-		if(c == '+' || c == '-') {
-			*cp++ = c;
-			c = GETC();
-		}
-		while(isdigit(c)) {
-			*cp++ = c;
-			c = GETC();
-		}
-
-	caseout:
-		*cp = 0;
-		peekc = c;
-		if(FPCHIP) {
-			yylval.dval = atof(symb);
-			return LFCONST;
-		}
-		yyerror("assembler cannot interpret fp constants");
-		yylval.lval = 1L;
-		return LCONST;
-
-	case '"':
-		memcpy(yylval.sval, nullgen.u.sval, sizeof(yylval.sval));
-		cp = yylval.sval;
-		c1 = 0;
-		for(;;) {
-			c = escchar('"');
-			if(c == EOF)
-				break;
-			if(c1 < sizeof(yylval.sval))
-				*cp++ = c;
-			c1++;
-		}
-		if(c1 > sizeof(yylval.sval))
-			yyerror("string constant too long");
-		return LSCONST;
-
-	case '\'':
-		c = escchar('\'');
-		if(c == EOF)
-			c = '\'';
-		if(escchar('\'') != EOF)
-			yyerror("missing '");
-		yylval.lval = c;
-		return LCONST;
-
-	case '/':
-		c1 = GETC();
-		if(c1 == '/') {
-			for(;;) {
-				c = GETC();
-				if(c == '\n')
-					goto l1;
-				if(c == EOF) {
-					yyerror("eof in comment");
-					errorexit();
-				}
-			}
-		}
-		if(c1 == '*') {
-			for(;;) {
-				c = GETC();
-				while(c == '*') {
-					c = GETC();
-					if(c == '/')
-						goto l0;
-				}
-				if(c == EOF) {
-					yyerror("eof in comment");
-					errorexit();
-				}
-				if(c == '\n')
-					lineno++;
-			}
-		}
-		break;
-
-	default:
-		return c;
-	}
-	peekc = c1;
-	return c;
-}
-
-int
-getc(void)
-{
-	int c;
-
-	c = peekc;
-	if(c != IGN) {
-		peekc = IGN;
-		if(c == '\n')
-			lineno++;
-		return c;
-	}
-	c = GETC();
-	if(c == '\n')
-		lineno++;
-	if(c == EOF) {
-		yyerror("End of file");
-		errorexit();
-	}
-	return c;
-}
-
-int
-getnsc(void)
-{
-	int c;
-
-	for(;;) {
-		c = getc();
-		if(!isspace(c) || c == '\n')
-			return c;
-	}
-}
-
-void
-unget(int c)
-{
-
-	peekc = c;
-	if(c == '\n')
-		lineno--;
-}
-
-int
-escchar(int e)
-{
-	int c, l;
-
-loop:
-	c = getc();
-	if(c == '\n') {
-		yyerror("newline in string");
-		return EOF;
-	}
-	if(c != '\\') {
-		if(c == e)
-			return EOF;
-		return c;
-	}
-	c = getc();
-	if(c >= '0' && c <= '7') {
-		l = c - '0';
-		c = getc();
-		if(c >= '0' && c <= '7') {
-			l = l*8 + c-'0';
-			c = getc();
-			if(c >= '0' && c <= '7') {
-				l = l*8 + c-'0';
-				return l;
-			}
-		}
-		unget(c);
-		return l;
-	}
-	switch(c)
-	{
-	case '\n':	goto loop;
-	case 'n':	return '\n';
-	case 't':	return '\t';
-	case 'b':	return '\b';
-	case 'r':	return '\r';
-	case 'f':	return '\f';
-	case 'a':	return 0x07;
-	case 'v':	return 0x0b;
-	case 'z':	return 0x00;
-	}
-	return c;
-}
-
-void
-pinit(char *f)
-{
-	int i;
-	Sym *s;
-
-	lineno = 1;
-	newio();
-	newfile(f, -1);
-	pc = 0;
-	peekc = IGN;
-	sym = 1;
-	for(i=0; i<NHASH; i++)
-		for(s = hash[i]; s != S; s = s->link)
-			s->macro = 0;
-}
-
-int
-filbuf(void)
-{
-	Io *i;
-
-loop:
-	i = iostack;
-	if(i == I)
-		return EOF;
-	if(i->f < 0)
-		goto pop;
-	fi.c = read(i->f, i->b, BUFSIZ) - 1;
-	if(fi.c < 0) {
-		close(i->f);
-		linklinehist(ctxt, lineno, 0, 0);
-		goto pop;
-	}
-	fi.p = i->b + 1;
-	return i->b[0] & 0xff;
-
-pop:
-	iostack = i->link;
-	i->link = iofree;
-	iofree = i;
-	i = iostack;
-	if(i == I)
-		return EOF;
-	fi.p = i->p;
-	fi.c = i->c;
-	if(--fi.c < 0)
-		goto loop;
-	return *fi.p++ & 0xff;
-}
-
-void
-yyerror(char *a, ...)
-{
-	char buf[200];
-	va_list arg;
-
-	/*
-	 * hack to intercept message from yaccpar
-	 */
-	if(strcmp(a, "syntax error") == 0) {
-		yyerror("syntax error, last name: %s", symb);
-		return;
-	}
-	prfile(lineno);
-	va_start(arg, a);
-	vseprint(buf, buf+sizeof(buf), a, arg);
-	va_end(arg);
-	print("%s\n", buf);
-	nerrors++;
-	if(nerrors > 10) {
-		print("too many errors\n");
-		errorexit();
-	}
-}
-
-void
-prfile(int32 l)
-{
-	linkprfile(ctxt, l);
-}
diff --git a/src/cmd/cc/macbody b/src/cmd/cc/macbody
deleted file mode 100644
index f6927b2..0000000
--- a/src/cmd/cc/macbody
+++ /dev/null
@@ -1,800 +0,0 @@
-// Inferno utils/cc/macbody
-// http://code.google.com/p/inferno-os/source/browse/utils/cc/macbody
-//
-//	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-//	Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
-//	Portions Copyright © 1997-1999 Vita Nuova Limited
-//	Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
-//	Portions Copyright © 2004,2006 Bruce Ellis
-//	Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
-//	Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
-//	Portions Copyright © 2009 The Go Authors.  All rights reserved.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-#define VARMAC 0x80
-
-int32
-getnsn(void)
-{
-	int32 n;
-	int c;
-
-	c = getnsc();
-	if(c < '0' || c > '9')
-		return -1;
-	n = 0;
-	while(c >= '0' && c <= '9') {
-		n = n*10 + c-'0';
-		c = getc();
-	}
-	unget(c);
-	return n;
-}
-
-Sym*
-getsym(void)
-{
-	int c;
-	char *cp;
-
-	c = getnsc();
-	if(!isalpha(c) && c != '_' && c < 0x80) {
-		unget(c);
-		return S;
-	}
-	for(cp = symb;;) {
-		if(cp <= symb+NSYMB-4)
-			*cp++ = c;
-		c = getc();
-		if(isalnum(c) || c == '_' || c >= 0x80)
-			continue;
-		unget(c);
-		break;
-	}
-	*cp = 0;
-	if(cp > symb+NSYMB-4)
-		yyerror("symbol too large: %s", symb);
-	return lookup();
-}
-
-Sym*
-getsymdots(int *dots)
-{
-	int c;
-	Sym *s;
-
-	s = getsym();
-	if(s != S)
-		return s;
-
-	c = getnsc();
-	if(c != '.'){
-		unget(c);
-		return S;
-	}
-	if(getc() != '.' || getc() != '.')
-		yyerror("bad dots in macro");
-	*dots = 1;
-	return slookup("__VA_ARGS__");
-}
-
-int
-getcom(void)
-{
-	int c;
-
-	for(;;) {
-		c = getnsc();
-		if(c != '/')
-			break;
-		c = getc();
-		if(c == '/') {
-			while(c != '\n')
-				c = getc();
-			break;
-		}
-		if(c != '*')
-			break;
-		c = getc();
-		for(;;) {
-			if(c == '*') {
-				c = getc();
-				if(c != '/')
-					continue;
-				c = getc();
-				break;
-			}
-			if(c == '\n') {
-				yyerror("comment across newline");
-				break;
-			}
-			c = getc();
-		}
-		if(c == '\n')
-			break;
-	}
-	return c;
-}
-
-void
-dodefine(char *cp)
-{
-	Sym *s;
-	char *p;
-	int32 l;
-
-	ensuresymb(strlen(cp));
-	strcpy(symb, cp);
-	p = strchr(symb, '=');
-	if(p) {
-		*p++ = 0;
-		s = lookup();
-		l = strlen(p) + 2;	/* +1 null, +1 nargs */
-		s->macro = alloc(l);
-		strcpy(s->macro+1, p);
-	} else {
-		s = lookup();
-		s->macro = "\0001";	/* \000 is nargs */
-	}
-	if(debug['m'])
-		print("#define (-D) %s %s\n", s->name, s->macro+1);
-}
-
-struct
-{
-	char	*macname;
-	void	(*macf)(void);
-} mactab[] =
-{
-	"ifdef",	0,	/* macif(0) */
-	"ifndef",	0,	/* macif(1) */
-	"else",		0,	/* macif(2) */
-
-	"line",		maclin,
-	"define",	macdef,
-	"include",	macinc,
-	"undef",	macund,
-
-	"pragma",	macprag,
-	"endif",	macend,
-	0
-};
-
-void
-domacro(void)
-{
-	int i;
-	Sym *s;
-
-	s = getsym();
-	if(s == S)
-		s = slookup("endif");
-	for(i=0; mactab[i].macname; i++)
-		if(strcmp(s->name, mactab[i].macname) == 0) {
-			if(mactab[i].macf)
-				(*mactab[i].macf)();
-			else
-				macif(i);
-			return;
-		}
-	yyerror("unknown #: %s", s->name);
-	macend();
-}
-
-void
-macund(void)
-{
-	Sym *s;
-
-	s = getsym();
-	macend();
-	if(s == S) {
-		yyerror("syntax in #undef");
-		return;
-	}
-	s->macro = 0;
-}
-
-#define	NARG	25
-void
-macdef(void)
-{
-	Sym *s, *a;
-	char *args[NARG], *np, *base;
-	int n, i, c, len, dots;
-	int ischr;
-
-	s = getsym();
-	if(s == S)
-		goto bad;
-	if(s->macro)
-		yyerror("macro redefined: %s", s->name);
-	c = getc();
-	n = -1;
-	dots = 0;
-	if(c == '(') {
-		n++;
-		c = getnsc();
-		if(c != ')') {
-			unget(c);
-			for(;;) {
-				a = getsymdots(&dots);
-				if(a == S)
-					goto bad;
-				if(n >= NARG) {
-					yyerror("too many arguments in #define: %s", s->name);
-					goto bad;
-				}
-				args[n++] = a->name;
-				c = getnsc();
-				if(c == ')')
-					break;
-				if(c != ',' || dots)
-					goto bad;
-			}
-		}
-		c = getc();
-	}
-	if(isspace(c))
-		if(c != '\n')
-			c = getnsc();
-	base = hunk;
-	len = 1;
-	ischr = 0;
-	for(;;) {
-		if(isalpha(c) || c == '_') {
-			np = symb;
-			*np++ = c;
-			c = getc();
-			while(isalnum(c) || c == '_') {
-				*np++ = c;
-				c = getc();
-			}
-			*np = 0;
-			for(i=0; i<n; i++)
-				if(strcmp(symb, args[i]) == 0)
-					break;
-			if(i >= n) {
-				i = strlen(symb);
-				base = allocn(base, len, i);
-				memcpy(base+len, symb, i);
-				len += i;
-				continue;
-			}
-			base = allocn(base, len, 2);
-			base[len++] = '#';
-			base[len++] = 'a' + i;
-			continue;
-		}
-		if(ischr){
-			if(c == '\\'){
-				base = allocn(base, len, 1);
-				base[len++] = c;
-				c = getc();
-			}else if(c == ischr)
-				ischr = 0;
-		}else{
-			if(c == '"' || c == '\''){
-				base = allocn(base, len, 1);
-				base[len++] = c;
-				ischr = c;
-				c = getc();
-				continue;
-			}
-			if(c == '/') {
-				c = getc();
-				if(c == '/'){
-					c = getc();
-					for(;;) {
-						if(c == '\n')
-							break;
-						c = getc();
-					}
-					continue;
-				}
-				if(c == '*'){
-					c = getc();
-					for(;;) {
-						if(c == '*') {
-							c = getc();
-							if(c != '/')
-								continue;
-							c = getc();
-							break;
-						}
-						if(c == '\n') {
-							yyerror("comment and newline in define: %s", s->name);
-							break;
-						}
-						c = getc();
-					}
-					continue;
-				}
-				base = allocn(base, len, 1);
-				base[len++] = '/';
-				continue;
-			}
-		}
-		if(c == '\\') {
-			c = getc();
-			if(c == '\n') {
-				c = getc();
-				continue;
-			}
-			else if(c == '\r') {
-				c = getc();
-				if(c == '\n') {
-					c = getc();
-					continue;
-				}
-			}
-			base = allocn(base, len, 1);
-			base[len++] = '\\';
-			continue;
-		}
-		if(c == '\n')
-			break;
-		if(c == '#')
-		if(n > 0) {
-			base = allocn(base, len, 1);
-			base[len++] = c;
-		}
-		base = allocn(base, len, 1);
-		base[len++] = c;
-		c = ((--fi.c < 0)? filbuf(): (*fi.p++ & 0xff));
-		if(c == '\n')
-			lineno++;
-		if(c == -1) {
-			yyerror("eof in a macro: %s", s->name);
-			break;
-		}
-	}
-	do {
-		base = allocn(base, len, 1);
-		base[len++] = 0;
-	} while(len & 3);
-
-	*base = n+1;
-	if(dots)
-		*base |= VARMAC;
-	s->macro = base;
-	if(debug['m'])
-		print("#define %s %s\n", s->name, s->macro+1);
-	return;
-
-bad:
-	if(s == S)
-		yyerror("syntax in #define");
-	else
-		yyerror("syntax in #define: %s", s->name);
-	macend();
-}
-
-void
-macexpand(Sym *s, char *b)
-{
-	char buf[2000];
-	int n, l, c, nargs;
-	char *arg[NARG], *cp, *ob, *ecp, dots;
-
-	ob = b;
-	if(*s->macro == 0) {
-		strcpy(b, s->macro+1);
-		if(debug['m'])
-			print("#expand %s %s\n", s->name, ob);
-		return;
-	}
-
-	nargs = (char)(*s->macro & ~VARMAC) - 1;
-	dots = *s->macro & VARMAC;
-
-	c = getnsc();
-	if(c != '(')
-		goto bad;
-	n = 0;
-	c = getc();
-	if(c != ')') {
-		unget(c);
-		l = 0;
-		cp = buf;
-		ecp = cp + sizeof(buf)-4;
-		arg[n++] = cp;
-		for(;;) {
-			if(cp >= ecp)
-				goto toobig;
-			c = getc();
-			if(c == '"')
-				for(;;) {
-					if(cp >= ecp)
-						goto toobig;
-					*cp++ = c;
-					c = getc();
-					if(c == '\\') {
-						*cp++ = c;
-						c = getc();
-						continue;
-					}
-					if(c == '\n')
-						goto bad;
-					if(c == '"')
-						break;
-				}
-			if(c == '\'')
-				for(;;) {
-					if(cp >= ecp)
-						goto toobig;
-					*cp++ = c;
-					c = getc();
-					if(c == '\\') {
-						*cp++ = c;
-						c = getc();
-						continue;
-					}
-					if(c == '\n')
-						goto bad;
-					if(c == '\'')
-						break;
-				}
-			if(c == '/') {
-				c = getc();
-				switch(c) {
-				case '*':
-					for(;;) {
-						c = getc();
-						if(c == '*') {
-							c = getc();
-							if(c == '/')
-								break;
-						}
-					}
-					*cp++ = ' ';
-					continue;
-				case '/':
-					while((c = getc()) != '\n')
-						;
-					break;
-				default:
-					unget(c);
-					c = '/';
-				}
-			}
-			if(l == 0) {
-				if(c == ',') {
-					if(n == nargs && dots) {
-						*cp++ = ',';
-						continue;
-					}
-					*cp++ = 0;
-					arg[n++] = cp;
-					if(n > nargs)
-						break;
-					continue;
-				}
-				if(c == ')')
-					break;
-			}
-			if(c == '\n')
-				c = ' ';
-			*cp++ = c;
-			if(c == '(')
-				l++;
-			if(c == ')')
-				l--;
-		}
-		*cp = 0;
-	}
-	if(n != nargs) {
-		yyerror("argument mismatch expanding: %s", s->name);
-		*b = 0;
-		return;
-	}
-	cp = s->macro+1;
-	for(;;) {
-		c = *cp++;
-		if(c == '\n')
-			c = ' ';
-		if(c != '#') {
-			*b++ = c;
-			if(c == 0)
-				break;
-			continue;
-		}
-		c = *cp++;
-		if(c == 0)
-			goto bad;
-		if(c == '#') {
-			*b++ = c;
-			continue;
-		}
-		c -= 'a';
-		if(c < 0 || c >= n)
-			continue;
-		strcpy(b, arg[c]);
-		b += strlen(arg[c]);
-	}
-	*b = 0;
-	if(debug['m'])
-		print("#expand %s %s\n", s->name, ob);
-	return;
-
-bad:
-	yyerror("syntax in macro expansion: %s", s->name);
-	*b = 0;
-	return;
-
-toobig:
-	yyerror("too much text in macro expansion: %s", s->name);
-	*b = 0;
-}
-
-void
-macinc(void)
-{
-	int c0, c, i, f;
-	char str[STRINGSZ], *hp;
-
-	c0 = getnsc();
-	if(c0 != '"') {
-		c = c0;
-		if(c0 != '<')
-			goto bad;
-		c0 = '>';
-	}
-	for(hp = str;;) {
-		c = getc();
-		if(c == c0)
-			break;
-		if(c == '\n')
-			goto bad;
-		*hp++ = c;
-	}
-	*hp = 0;
-
-	c = getcom();
-	if(c != '\n')
-		goto bad;
-
-	f = -1;
-	for(i=0; i<ninclude; i++) {
-		if(i == 0 && c0 == '>')
-			continue;
-		ensuresymb(strlen(include[i])+strlen(str)+2);
-		strcpy(symb, include[i]);
-		strcat(symb, "/");
-		if(strcmp(symb, "./") == 0)
-			symb[0] = 0;
-		strcat(symb, str);
-		f = open(symb, OREAD);
-		if(f >= 0)
-			break;
-	}
-	if(f < 0)
-		strcpy(symb, str);
-	c = strlen(symb) + 1;
-	hp = alloc(c);
-	memcpy(hp, symb, c);
-	newio();
-	pushio();
-	newfile(hp, f);
-	return;
-
-bad:
-	unget(c);
-	yyerror("syntax in #include");
-	macend();
-}
-
-void
-maclin(void)
-{
-	char *cp;
-	int c;
-	int32 n;
-
-	n = getnsn();
-	c = getc();
-	if(n < 0)
-		goto bad;
-
-	for(;;) {
-		if(c == ' ' || c == '\t') {
-			c = getc();
-			continue;
-		}
-		if(c == '"')
-			break;
-		if(c == '\n') {
-			strcpy(symb, "<noname>");
-			goto nn;
-		}
-		goto bad;
-	}
-	cp = symb;
-	for(;;) {
-		c = getc();
-		if(c == '"')
-			break;
-		*cp++ = c;
-	}
-	*cp = 0;
-	c = getcom();
-	if(c != '\n')
-		goto bad;
-
-nn:
-	c = strlen(symb) + 1;
-	cp = alloc(c);
-	memcpy(cp, symb, c);
-	linklinehist(ctxt, lineno, cp, n);
-	return;
-
-bad:
-	unget(c);
-	yyerror("syntax in #line");
-	macend();
-}
-
-void
-macif(int f)
-{
-	int c, l, bol;
-	Sym *s;
-
-	if(f == 2)
-		goto skip;
-	s = getsym();
-	if(s == S)
-		goto bad;
-	if(getcom() != '\n')
-		goto bad;
-	if((s->macro != 0) ^ f)
-		return;
-
-skip:
-	bol = 1;
-	l = 0;
-	for(;;) {
-		c = getc();
-		if(c != '#') {
-			if(!isspace(c))
-				bol = 0;
-			if(c == '\n')
-				bol = 1;
-			continue;
-		}
-		if(!bol)
-			continue;
-		s = getsym();
-		if(s == S)
-			continue;
-		if(strcmp(s->name, "endif") == 0) {
-			if(l) {
-				l--;
-				continue;
-			}
-			macend();
-			return;
-		}
-		if(strcmp(s->name, "ifdef") == 0 || strcmp(s->name, "ifndef") == 0) {
-			l++;
-			continue;
-		}
-		if(l == 0 && f != 2 && strcmp(s->name, "else") == 0) {
-			macend();
-			return;
-		}
-	}
-
-bad:
-	yyerror("syntax in #if(n)def");
-	macend();
-}
-
-void
-macprag(void)
-{
-	Sym *s;
-	int c0, c;
-	char *hp;
-
-	s = getsym();
-
-	if(s && strcmp(s->name, "lib") == 0)
-		goto praglib;
-	if(s && strcmp(s->name, "pack") == 0) {
-		pragpack();
-		return;
-	}
-	if(s && strcmp(s->name, "fpround") == 0) {
-		pragfpround();
-		return;
-	}
-	if(s && strcmp(s->name, "textflag") == 0) {
-		pragtextflag();
-		return;
-	}
-	if(s && strcmp(s->name, "dataflag") == 0) {
-		pragdataflag();
-		return;
-	}
-	if(s && strcmp(s->name, "varargck") == 0) {
-		pragvararg();
-		return;
-	}
-	if(s && strcmp(s->name, "incomplete") == 0) {
-		pragincomplete();
-		return;
-	}
-	if(s && (strncmp(s->name, "cgo_", 4) == 0 || strncmp(s->name, "dyn", 3) == 0)) {
-		pragcgo(s->name);
-		return;
-	}
-	while(getnsc() != '\n')
-		;
-	return;
-
-praglib:
-	c0 = getnsc();
-	if(c0 != '"') {
-		c = c0;
-		if(c0 != '<')
-			goto bad;
-		c0 = '>';
-	}
-	for(hp = symb;;) {
-		c = getc();
-		if(c == c0)
-			break;
-		if(c == '\n')
-			goto bad;
-		*hp++ = c;
-	}
-	*hp = 0;
-	c = getcom();
-	if(c != '\n')
-		goto bad;
-
-	/*
-	 * put pragma-line in as a funny history
-	 */
-	c = strlen(symb) + 1;
-	hp = alloc(c);
-	memcpy(hp, symb, c);
-
-	linklinehist(ctxt, lineno, hp, -1);
-	return;
-
-bad:
-	unget(c);
-	yyerror("syntax in #pragma lib");
-	macend();
-}
-
-void
-macend(void)
-{
-	int c;
-
-	for(;;) {
-		c = getnsc();
-		if(c < 0 || c == '\n')
-			return;
-	}
-}