xref: /plan9/sys/src/cmd/cc/dpchk.c (revision 6a5ecc411113fd8e80e9cc4f546aaf0a88cb6008)
17dd7cddfSDavid du Colombier #include	"cc.h"
27dd7cddfSDavid du Colombier #include	"y.tab.h"
37dd7cddfSDavid du Colombier 
47dd7cddfSDavid du Colombier enum
57dd7cddfSDavid du Colombier {
67dd7cddfSDavid du Colombier 	Fnone	= 0,
77dd7cddfSDavid du Colombier 	Fl,
87dd7cddfSDavid du Colombier 	Fvl,
97dd7cddfSDavid du Colombier 	Fignor,
107dd7cddfSDavid du Colombier 	Fstar,
117dd7cddfSDavid du Colombier 	Fadj,
127dd7cddfSDavid du Colombier 
137dd7cddfSDavid du Colombier 	Fverb	= 10,
147dd7cddfSDavid du Colombier };
157dd7cddfSDavid du Colombier 
167dd7cddfSDavid du Colombier typedef	struct	Tprot	Tprot;
177dd7cddfSDavid du Colombier struct	Tprot
187dd7cddfSDavid du Colombier {
197dd7cddfSDavid du Colombier 	Type*	type;
207dd7cddfSDavid du Colombier 	Bits	flag;
217dd7cddfSDavid du Colombier 	Tprot*	link;
227dd7cddfSDavid du Colombier };
237dd7cddfSDavid du Colombier 
247dd7cddfSDavid du Colombier typedef	struct	Tname	Tname;
257dd7cddfSDavid du Colombier struct	Tname
267dd7cddfSDavid du Colombier {
277dd7cddfSDavid du Colombier 	char*	name;
287dd7cddfSDavid du Colombier 	int	param;
297dd7cddfSDavid du Colombier 	Tname*	link;
307dd7cddfSDavid du Colombier };
317dd7cddfSDavid du Colombier 
327dd7cddfSDavid du Colombier static	Type*	indchar;
339a747e4fSDavid du Colombier static	uchar	flagbits[512];
347dd7cddfSDavid du Colombier static	char	fmtbuf[100];
357dd7cddfSDavid du Colombier static	int	lastadj;
367dd7cddfSDavid du Colombier static	int	lastverb;
377dd7cddfSDavid du Colombier static	int	nstar;
387dd7cddfSDavid du Colombier static	Tprot*	tprot;
397dd7cddfSDavid du Colombier static	Tname*	tname;
407dd7cddfSDavid du Colombier 
417dd7cddfSDavid du Colombier void
argflag(int c,int v)427dd7cddfSDavid du Colombier argflag(int c, int v)
437dd7cddfSDavid du Colombier {
447dd7cddfSDavid du Colombier 
457dd7cddfSDavid du Colombier 	switch(v) {
467dd7cddfSDavid du Colombier 	case Fignor:
477dd7cddfSDavid du Colombier 	case Fstar:
487dd7cddfSDavid du Colombier 	case Fl:
497dd7cddfSDavid du Colombier 	case Fvl:
507dd7cddfSDavid du Colombier 		flagbits[c] = v;
517dd7cddfSDavid du Colombier 		break;
527dd7cddfSDavid du Colombier 	case Fverb:
537dd7cddfSDavid du Colombier 		flagbits[c] = lastverb;
54375daca8SDavid du Colombier /*print("flag-v %c %d\n", c, lastadj);*/
557dd7cddfSDavid du Colombier 		lastverb++;
567dd7cddfSDavid du Colombier 		break;
577dd7cddfSDavid du Colombier 	case Fadj:
587dd7cddfSDavid du Colombier 		flagbits[c] = lastadj;
59375daca8SDavid du Colombier /*print("flag-l %c %d\n", c, lastadj);*/
607dd7cddfSDavid du Colombier 		lastadj++;
617dd7cddfSDavid du Colombier 		break;
627dd7cddfSDavid du Colombier 	}
637dd7cddfSDavid du Colombier }
647dd7cddfSDavid du Colombier 
657dd7cddfSDavid du Colombier Bits
getflag(char * s)667dd7cddfSDavid du Colombier getflag(char *s)
677dd7cddfSDavid du Colombier {
687dd7cddfSDavid du Colombier 	Bits flag;
699a747e4fSDavid du Colombier 	int f;
707dd7cddfSDavid du Colombier 	char *fmt;
719a747e4fSDavid du Colombier 	Rune c;
727dd7cddfSDavid du Colombier 
737dd7cddfSDavid du Colombier 	fmt = fmtbuf;
747dd7cddfSDavid du Colombier 	flag = zbits;
757dd7cddfSDavid du Colombier 	nstar = 0;
769a747e4fSDavid du Colombier 	for(;;) {
779a747e4fSDavid du Colombier 		s += chartorune(&c, s);
78*6a5ecc41SDavid du Colombier 		fmt += runetochar(fmt, &c);
799a747e4fSDavid du Colombier 		if(c == 0 || c >= nelem(flagbits))
809a747e4fSDavid du Colombier 			break;
817dd7cddfSDavid du Colombier 		f = flagbits[c];
827dd7cddfSDavid du Colombier 		switch(f) {
837dd7cddfSDavid du Colombier 		case Fnone:
847dd7cddfSDavid du Colombier 			argflag(c, Fverb);
857dd7cddfSDavid du Colombier 			f = flagbits[c];
867dd7cddfSDavid du Colombier 			break;
877dd7cddfSDavid du Colombier 		case Fstar:
887dd7cddfSDavid du Colombier 			nstar++;
897dd7cddfSDavid du Colombier 		case Fignor:
907dd7cddfSDavid du Colombier 			continue;
917dd7cddfSDavid du Colombier 		case Fl:
927dd7cddfSDavid du Colombier 			if(bset(flag, Fl))
937dd7cddfSDavid du Colombier 				flag = bor(flag, blsh(Fvl));
947dd7cddfSDavid du Colombier 		}
957dd7cddfSDavid du Colombier 		flag = bor(flag, blsh(f));
967dd7cddfSDavid du Colombier 		if(f >= Fverb)
977dd7cddfSDavid du Colombier 			break;
987dd7cddfSDavid du Colombier 	}
997dd7cddfSDavid du Colombier 	*fmt = 0;
1007dd7cddfSDavid du Colombier 	return flag;
1017dd7cddfSDavid du Colombier }
1027dd7cddfSDavid du Colombier 
1037dd7cddfSDavid du Colombier void
newprot(Sym * m,Type * t,char * s)1047dd7cddfSDavid du Colombier newprot(Sym *m, Type *t, char *s)
1057dd7cddfSDavid du Colombier {
1067dd7cddfSDavid du Colombier 	Bits flag;
1077dd7cddfSDavid du Colombier 	Tprot *l;
1087dd7cddfSDavid du Colombier 
1097dd7cddfSDavid du Colombier 	if(t == T) {
1107dd7cddfSDavid du Colombier 		warn(Z, "%s: newprot: type not defined", m->name);
1117dd7cddfSDavid du Colombier 		return;
1127dd7cddfSDavid du Colombier 	}
1137dd7cddfSDavid du Colombier 	flag = getflag(s);
1147dd7cddfSDavid du Colombier 	for(l=tprot; l; l=l->link)
1157dd7cddfSDavid du Colombier 		if(beq(flag, l->flag) && sametype(t, l->type))
1167dd7cddfSDavid du Colombier 			return;
1177dd7cddfSDavid du Colombier 	l = alloc(sizeof(*l));
1187dd7cddfSDavid du Colombier 	l->type = t;
1197dd7cddfSDavid du Colombier 	l->flag = flag;
1207dd7cddfSDavid du Colombier 	l->link = tprot;
1217dd7cddfSDavid du Colombier 	tprot = l;
1227dd7cddfSDavid du Colombier }
1237dd7cddfSDavid du Colombier 
1247dd7cddfSDavid du Colombier void
newname(char * s,int p)1257dd7cddfSDavid du Colombier newname(char *s, int p)
1267dd7cddfSDavid du Colombier {
1277dd7cddfSDavid du Colombier 	Tname *l;
1287dd7cddfSDavid du Colombier 
1297dd7cddfSDavid du Colombier 	for(l=tname; l; l=l->link)
1307dd7cddfSDavid du Colombier 		if(strcmp(l->name, s) == 0) {
1317dd7cddfSDavid du Colombier 			if(l->param != p)
1327dd7cddfSDavid du Colombier 				yyerror("vargck %s already defined\n", s);
1337dd7cddfSDavid du Colombier 			return;
1347dd7cddfSDavid du Colombier 		}
1357dd7cddfSDavid du Colombier 	l = alloc(sizeof(*l));
1367dd7cddfSDavid du Colombier 	l->name = s;
1377dd7cddfSDavid du Colombier 	l->param = p;
1387dd7cddfSDavid du Colombier 	l->link = tname;
1397dd7cddfSDavid du Colombier 	tname = l;
1407dd7cddfSDavid du Colombier }
1417dd7cddfSDavid du Colombier 
1427dd7cddfSDavid du Colombier void
arginit(void)1437dd7cddfSDavid du Colombier arginit(void)
1447dd7cddfSDavid du Colombier {
1457dd7cddfSDavid du Colombier 	int i;
1467dd7cddfSDavid du Colombier 
147375daca8SDavid du Colombier /* debug['F'] = 1;*/
148375daca8SDavid du Colombier /* debug['w'] = 1;*/
1497dd7cddfSDavid du Colombier 
1507dd7cddfSDavid du Colombier 	lastadj = Fadj;
1517dd7cddfSDavid du Colombier 	lastverb = Fverb;
1527dd7cddfSDavid du Colombier 	indchar = typ(TIND, types[TCHAR]);
1537dd7cddfSDavid du Colombier 
1547dd7cddfSDavid du Colombier 	memset(flagbits, Fnone, sizeof(flagbits));
1557dd7cddfSDavid du Colombier 
1567dd7cddfSDavid du Colombier 	for(i='0'; i<='9'; i++)
1577dd7cddfSDavid du Colombier 		argflag(i, Fignor);
1587dd7cddfSDavid du Colombier 	argflag('.', Fignor);
1597dd7cddfSDavid du Colombier 	argflag('#', Fignor);
1607dd7cddfSDavid du Colombier 	argflag('u', Fignor);
161208510e1SDavid du Colombier 	argflag('h', Fignor);
1627dd7cddfSDavid du Colombier 	argflag('+', Fignor);
1637dd7cddfSDavid du Colombier 	argflag('-', Fignor);
1647dd7cddfSDavid du Colombier 
1657dd7cddfSDavid du Colombier 	argflag('*', Fstar);
1667dd7cddfSDavid du Colombier 	argflag('l', Fl);
1677dd7cddfSDavid du Colombier 
1687dd7cddfSDavid du Colombier 	argflag('o', Fverb);
1697dd7cddfSDavid du Colombier 	flagbits['x'] = flagbits['o'];
1707dd7cddfSDavid du Colombier 	flagbits['X'] = flagbits['o'];
1717dd7cddfSDavid du Colombier }
1727dd7cddfSDavid du Colombier 
1737dd7cddfSDavid du Colombier void
pragvararg(void)1747dd7cddfSDavid du Colombier pragvararg(void)
1757dd7cddfSDavid du Colombier {
1767dd7cddfSDavid du Colombier 	Sym *s;
1777dd7cddfSDavid du Colombier 	int n, c;
1787dd7cddfSDavid du Colombier 	char *t;
1799a747e4fSDavid du Colombier 	Rune r;
180fb7f0c93SDavid du Colombier 	Type *ty;
1817dd7cddfSDavid du Colombier 
1827dd7cddfSDavid du Colombier 	if(!debug['F'])
1837dd7cddfSDavid du Colombier 		goto out;
1847dd7cddfSDavid du Colombier 	s = getsym();
1857dd7cddfSDavid du Colombier 	if(s && strcmp(s->name, "argpos") == 0)
1867dd7cddfSDavid du Colombier 		goto ckpos;
1877dd7cddfSDavid du Colombier 	if(s && strcmp(s->name, "type") == 0)
1887dd7cddfSDavid du Colombier 		goto cktype;
1899a747e4fSDavid du Colombier 	if(s && strcmp(s->name, "flag") == 0)
1909a747e4fSDavid du Colombier 		goto ckflag;
1917dd7cddfSDavid du Colombier 	yyerror("syntax in #pragma varargck");
1927dd7cddfSDavid du Colombier 	goto out;
1937dd7cddfSDavid du Colombier 
1947dd7cddfSDavid du Colombier ckpos:
195375daca8SDavid du Colombier /*#pragma	varargck	argpos	warn	2*/
1967dd7cddfSDavid du Colombier 	s = getsym();
1977dd7cddfSDavid du Colombier 	if(s == S)
1987dd7cddfSDavid du Colombier 		goto bad;
1997dd7cddfSDavid du Colombier 	n = getnsn();
2007dd7cddfSDavid du Colombier 	if(n < 0)
2017dd7cddfSDavid du Colombier 		goto bad;
2027dd7cddfSDavid du Colombier 	newname(s->name, n);
2037dd7cddfSDavid du Colombier 	goto out;
2047dd7cddfSDavid du Colombier 
2059a747e4fSDavid du Colombier ckflag:
206375daca8SDavid du Colombier /*#pragma	varargck	flag	'c'*/
2079a747e4fSDavid du Colombier 	c = getnsc();
2089a747e4fSDavid du Colombier 	if(c != '\'')
2099a747e4fSDavid du Colombier 		goto bad;
2109a747e4fSDavid du Colombier 	c = getr();
2119a747e4fSDavid du Colombier 	if(c == '\\')
2129a747e4fSDavid du Colombier 		c = getr();
2139a747e4fSDavid du Colombier 	else if(c == '\'')
2149a747e4fSDavid du Colombier 		goto bad;
2159a747e4fSDavid du Colombier 	if(c == '\n')
2169a747e4fSDavid du Colombier 		goto bad;
2179a747e4fSDavid du Colombier 	if(getc() != '\'')
2189a747e4fSDavid du Colombier 		goto bad;
2199a747e4fSDavid du Colombier 	argflag(c, Fignor);
2209a747e4fSDavid du Colombier 	goto out;
2219a747e4fSDavid du Colombier 
2227dd7cddfSDavid du Colombier cktype:
223375daca8SDavid du Colombier /*#pragma	varargck	type	O	int*/
2247dd7cddfSDavid du Colombier 	c = getnsc();
2257dd7cddfSDavid du Colombier 	if(c != '"')
2267dd7cddfSDavid du Colombier 		goto bad;
2277dd7cddfSDavid du Colombier 	t = fmtbuf;
2287dd7cddfSDavid du Colombier 	for(;;) {
2299a747e4fSDavid du Colombier 		r = getr();
2309a747e4fSDavid du Colombier 		if(r == ' ' || r == '\n')
2317dd7cddfSDavid du Colombier 			goto bad;
2329a747e4fSDavid du Colombier 		if(r == '"')
2337dd7cddfSDavid du Colombier 			break;
2349a747e4fSDavid du Colombier 		t += runetochar(t, &r);
2357dd7cddfSDavid du Colombier 	}
2367dd7cddfSDavid du Colombier 	*t = 0;
2377dd7cddfSDavid du Colombier 	t = strdup(fmtbuf);
2387dd7cddfSDavid du Colombier 	s = getsym();
2397dd7cddfSDavid du Colombier 	if(s == S)
2407dd7cddfSDavid du Colombier 		goto bad;
241fb7f0c93SDavid du Colombier 	ty = s->type;
242fb7f0c93SDavid du Colombier 	while((c = getnsc()) == '*')
243fb7f0c93SDavid du Colombier 		ty = typ(TIND, ty);
2447dd7cddfSDavid du Colombier 	unget(c);
245fb7f0c93SDavid du Colombier 	newprot(s, ty, t);
2467dd7cddfSDavid du Colombier 	goto out;
2477dd7cddfSDavid du Colombier 
2487dd7cddfSDavid du Colombier bad:
2497dd7cddfSDavid du Colombier 	yyerror("syntax in #pragma varargck");
2507dd7cddfSDavid du Colombier 
2517dd7cddfSDavid du Colombier out:
2527dd7cddfSDavid du Colombier 	while(getnsc() != '\n')
2537dd7cddfSDavid du Colombier 		;
2547dd7cddfSDavid du Colombier }
2557dd7cddfSDavid du Colombier 
2567dd7cddfSDavid du Colombier Node*
nextarg(Node * n,Node ** a)2577dd7cddfSDavid du Colombier nextarg(Node *n, Node **a)
2587dd7cddfSDavid du Colombier {
2597dd7cddfSDavid du Colombier 	if(n == Z) {
2607dd7cddfSDavid du Colombier 		*a = Z;
2617dd7cddfSDavid du Colombier 		return Z;
2627dd7cddfSDavid du Colombier 	}
2637dd7cddfSDavid du Colombier 	if(n->op == OLIST) {
2647dd7cddfSDavid du Colombier 		*a = n->left;
2657dd7cddfSDavid du Colombier 		return n->right;
2667dd7cddfSDavid du Colombier 	}
2677dd7cddfSDavid du Colombier 	*a = n;
2687dd7cddfSDavid du Colombier 	return Z;
2697dd7cddfSDavid du Colombier }
2707dd7cddfSDavid du Colombier 
2717dd7cddfSDavid du Colombier void
checkargs(Node * nn,char * s,int pos)272375daca8SDavid du Colombier checkargs(Node *nn, char *s, int pos)
2737dd7cddfSDavid du Colombier {
2747dd7cddfSDavid du Colombier 	Node *a, *n;
2757dd7cddfSDavid du Colombier 	Bits flag;
2767dd7cddfSDavid du Colombier 	Tprot *l;
2777dd7cddfSDavid du Colombier 
2787dd7cddfSDavid du Colombier 	if(!debug['F'])
2797dd7cddfSDavid du Colombier 		return;
2807dd7cddfSDavid du Colombier 	n = nn;
2817dd7cddfSDavid du Colombier 	for(;;) {
2827dd7cddfSDavid du Colombier 		s = strchr(s, '%');
2837dd7cddfSDavid du Colombier 		if(s == 0) {
2847dd7cddfSDavid du Colombier 			nextarg(n, &a);
2857dd7cddfSDavid du Colombier 			if(a != Z)
2867dd7cddfSDavid du Colombier 				warn(nn, "more arguments than format %T",
2877dd7cddfSDavid du Colombier 					a->type);
2887dd7cddfSDavid du Colombier 			return;
2897dd7cddfSDavid du Colombier 		}
2907dd7cddfSDavid du Colombier 		s++;
2917dd7cddfSDavid du Colombier 		flag = getflag(s);
2927dd7cddfSDavid du Colombier 		while(nstar > 0) {
2937dd7cddfSDavid du Colombier 			n = nextarg(n, &a);
294375daca8SDavid du Colombier 			pos++;
2957dd7cddfSDavid du Colombier 			nstar--;
2967dd7cddfSDavid du Colombier 			if(a == Z) {
2977dd7cddfSDavid du Colombier 				warn(nn, "more format than arguments %s",
2987dd7cddfSDavid du Colombier 					fmtbuf);
2997dd7cddfSDavid du Colombier 				return;
3007dd7cddfSDavid du Colombier 			}
3017dd7cddfSDavid du Colombier 			if(a->type == T)
3027dd7cddfSDavid du Colombier 				continue;
3037dd7cddfSDavid du Colombier 			if(!sametype(types[TINT], a->type) &&
3047dd7cddfSDavid du Colombier 			   !sametype(types[TUINT], a->type))
305375daca8SDavid du Colombier 				warn(nn, "format mismatch '*' in %s %T, arg %d",
306375daca8SDavid du Colombier 					fmtbuf, a->type, pos);
3077dd7cddfSDavid du Colombier 		}
3087dd7cddfSDavid du Colombier 		for(l=tprot; l; l=l->link)
3097dd7cddfSDavid du Colombier 			if(sametype(types[TVOID], l->type)) {
3107dd7cddfSDavid du Colombier 				if(beq(flag, l->flag)) {
3117dd7cddfSDavid du Colombier 					s++;
3127dd7cddfSDavid du Colombier 					goto loop;
3137dd7cddfSDavid du Colombier 				}
3147dd7cddfSDavid du Colombier 			}
3157dd7cddfSDavid du Colombier 
3167dd7cddfSDavid du Colombier 		n = nextarg(n, &a);
317375daca8SDavid du Colombier 		pos++;
3187dd7cddfSDavid du Colombier 		if(a == Z) {
3197dd7cddfSDavid du Colombier 			warn(nn, "more format than arguments %s",
3207dd7cddfSDavid du Colombier 				fmtbuf);
3217dd7cddfSDavid du Colombier 			return;
3227dd7cddfSDavid du Colombier 		}
3237dd7cddfSDavid du Colombier 		if(a->type == 0)
3247dd7cddfSDavid du Colombier 			continue;
3257dd7cddfSDavid du Colombier 		for(l=tprot; l; l=l->link)
3267dd7cddfSDavid du Colombier 			if(sametype(a->type, l->type)) {
327375daca8SDavid du Colombier /*print("checking %T/%ulx %T/%ulx\n", a->type, flag.b[0], l->type, l->flag.b[0]);*/
3287dd7cddfSDavid du Colombier 				if(beq(flag, l->flag))
3297dd7cddfSDavid du Colombier 					goto loop;
3307dd7cddfSDavid du Colombier 			}
331375daca8SDavid du Colombier 		warn(nn, "format mismatch %s %T, arg %d", fmtbuf, a->type, pos);
3327dd7cddfSDavid du Colombier 	loop:;
3337dd7cddfSDavid du Colombier 	}
3347dd7cddfSDavid du Colombier }
3357dd7cddfSDavid du Colombier 
3367dd7cddfSDavid du Colombier void
dpcheck(Node * n)3377dd7cddfSDavid du Colombier dpcheck(Node *n)
3387dd7cddfSDavid du Colombier {
3397dd7cddfSDavid du Colombier 	char *s;
3407dd7cddfSDavid du Colombier 	Node *a, *b;
3417dd7cddfSDavid du Colombier 	Tname *l;
3427dd7cddfSDavid du Colombier 	int i;
3437dd7cddfSDavid du Colombier 
3447dd7cddfSDavid du Colombier 	if(n == Z)
3457dd7cddfSDavid du Colombier 		return;
3467dd7cddfSDavid du Colombier 	b = n->left;
3477dd7cddfSDavid du Colombier 	if(b == Z || b->op != ONAME)
3487dd7cddfSDavid du Colombier 		return;
3497dd7cddfSDavid du Colombier 	s = b->sym->name;
3507dd7cddfSDavid du Colombier 	for(l=tname; l; l=l->link)
3517dd7cddfSDavid du Colombier 		if(strcmp(s, l->name) == 0)
3527dd7cddfSDavid du Colombier 			break;
3537dd7cddfSDavid du Colombier 	if(l == 0)
3547dd7cddfSDavid du Colombier 		return;
3557dd7cddfSDavid du Colombier 
3567dd7cddfSDavid du Colombier 	i = l->param;
3577dd7cddfSDavid du Colombier 	b = n->right;
3587dd7cddfSDavid du Colombier 	while(i > 0) {
3597dd7cddfSDavid du Colombier 		b = nextarg(b, &a);
3607dd7cddfSDavid du Colombier 		i--;
3617dd7cddfSDavid du Colombier 	}
3627dd7cddfSDavid du Colombier 	if(a == Z) {
3637dd7cddfSDavid du Colombier 		warn(n, "cant find format arg");
3647dd7cddfSDavid du Colombier 		return;
3657dd7cddfSDavid du Colombier 	}
3667dd7cddfSDavid du Colombier 	if(!sametype(indchar, a->type)) {
3677dd7cddfSDavid du Colombier 		warn(n, "format arg type %T", a->type);
3687dd7cddfSDavid du Colombier 		return;
3697dd7cddfSDavid du Colombier 	}
3707dd7cddfSDavid du Colombier 	if(a->op != OADDR || a->left->op != ONAME || a->left->sym != symstring) {
371375daca8SDavid du Colombier /*		warn(n, "format arg not constant string");*/
3727dd7cddfSDavid du Colombier 		return;
3737dd7cddfSDavid du Colombier 	}
3747dd7cddfSDavid du Colombier 	s = a->left->cstring;
375375daca8SDavid du Colombier 	checkargs(b, s, l->param);
3767dd7cddfSDavid du Colombier }
3777dd7cddfSDavid du Colombier 
3787dd7cddfSDavid du Colombier void
pragpack(void)3799847521cSDavid du Colombier pragpack(void)
3807dd7cddfSDavid du Colombier {
3817dd7cddfSDavid du Colombier 	Sym *s;
3827dd7cddfSDavid du Colombier 
3839847521cSDavid du Colombier 	packflg = 0;
3847dd7cddfSDavid du Colombier 	s = getsym();
3857dd7cddfSDavid du Colombier 	if(s) {
3869847521cSDavid du Colombier 		packflg = atoi(s->name+1);
3877dd7cddfSDavid du Colombier 		if(strcmp(s->name, "on") == 0 ||
3889847521cSDavid du Colombier 		   strcmp(s->name, "yes") == 0)
3899847521cSDavid du Colombier 			packflg = 1;
3907dd7cddfSDavid du Colombier 	}
3917dd7cddfSDavid du Colombier 	while(getnsc() != '\n')
3927dd7cddfSDavid du Colombier 		;
3937dd7cddfSDavid du Colombier 	if(debug['f'])
3949847521cSDavid du Colombier 		if(packflg)
3959847521cSDavid du Colombier 			print("%4ld: pack %d\n", lineno, packflg);
3967dd7cddfSDavid du Colombier 		else
3979847521cSDavid du Colombier 			print("%4ld: pack off\n", lineno);
3987dd7cddfSDavid du Colombier }
3997dd7cddfSDavid du Colombier 
4007dd7cddfSDavid du Colombier void
pragfpround(void)4017dd7cddfSDavid du Colombier pragfpround(void)
4027dd7cddfSDavid du Colombier {
4037dd7cddfSDavid du Colombier 	Sym *s;
4047dd7cddfSDavid du Colombier 
4057dd7cddfSDavid du Colombier 	fproundflg = 0;
4067dd7cddfSDavid du Colombier 	s = getsym();
4077dd7cddfSDavid du Colombier 	if(s) {
4089a747e4fSDavid du Colombier 		fproundflg = atoi(s->name+1);
4097dd7cddfSDavid du Colombier 		if(strcmp(s->name, "on") == 0 ||
4109a747e4fSDavid du Colombier 		   strcmp(s->name, "yes") == 0)
4117dd7cddfSDavid du Colombier 			fproundflg = 1;
4127dd7cddfSDavid du Colombier 	}
4137dd7cddfSDavid du Colombier 	while(getnsc() != '\n')
4147dd7cddfSDavid du Colombier 		;
4157dd7cddfSDavid du Colombier 	if(debug['f'])
4167dd7cddfSDavid du Colombier 		if(fproundflg)
4177dd7cddfSDavid du Colombier 			print("%4ld: fproundflg %d\n", lineno, fproundflg);
4187dd7cddfSDavid du Colombier 		else
4197dd7cddfSDavid du Colombier 			print("%4ld: fproundflg off\n", lineno);
4207dd7cddfSDavid du Colombier }
421e288d156SDavid du Colombier 
422e288d156SDavid du Colombier void
pragprofile(void)423e288d156SDavid du Colombier pragprofile(void)
424e288d156SDavid du Colombier {
425e288d156SDavid du Colombier 	Sym *s;
426e288d156SDavid du Colombier 
427e288d156SDavid du Colombier 	profileflg = 0;
428e288d156SDavid du Colombier 	s = getsym();
429e288d156SDavid du Colombier 	if(s) {
430e288d156SDavid du Colombier 		profileflg = atoi(s->name+1);
431e288d156SDavid du Colombier 		if(strcmp(s->name, "on") == 0 ||
432e288d156SDavid du Colombier 		   strcmp(s->name, "yes") == 0)
433375daca8SDavid du Colombier 			profileflg = 1;
434e288d156SDavid du Colombier 	}
435e288d156SDavid du Colombier 	while(getnsc() != '\n')
436e288d156SDavid du Colombier 		;
437e288d156SDavid du Colombier 	if(debug['f'])
438e288d156SDavid du Colombier 		if(profileflg)
439e288d156SDavid du Colombier 			print("%4ld: profileflg %d\n", lineno, profileflg);
440e288d156SDavid du Colombier 		else
441e288d156SDavid du Colombier 			print("%4ld: profileflg off\n", lineno);
442e288d156SDavid du Colombier }
443375daca8SDavid du Colombier 
444375daca8SDavid du Colombier void
pragincomplete(void)445375daca8SDavid du Colombier pragincomplete(void)
446375daca8SDavid du Colombier {
447375daca8SDavid du Colombier 	Sym *s;
44876783259SDavid du Colombier 	Type *t;
44976783259SDavid du Colombier 	int istag, w, et;
450375daca8SDavid du Colombier 
45176783259SDavid du Colombier 	istag = 0;
452375daca8SDavid du Colombier 	s = getsym();
45376783259SDavid du Colombier 	if(s == nil)
45476783259SDavid du Colombier 		goto out;
45576783259SDavid du Colombier 	et = 0;
45676783259SDavid du Colombier 	w = s->lexical;
45776783259SDavid du Colombier 	if(w == LSTRUCT)
45876783259SDavid du Colombier 		et = TSTRUCT;
45976783259SDavid du Colombier 	else if(w == LUNION)
46076783259SDavid du Colombier 		et = TUNION;
46176783259SDavid du Colombier 	if(et != 0){
46276783259SDavid du Colombier 		s = getsym();
46376783259SDavid du Colombier 		if(s == nil){
46476783259SDavid du Colombier 			yyerror("missing struct/union tag in pragma incomplete");
46576783259SDavid du Colombier 			goto out;
466375daca8SDavid du Colombier 		}
46776783259SDavid du Colombier 		if(s->lexical != LNAME && s->lexical != LTYPE){
46876783259SDavid du Colombier 			yyerror("invalid struct/union tag: %s", s->name);
46976783259SDavid du Colombier 			goto out;
47076783259SDavid du Colombier 		}
47176783259SDavid du Colombier 		dotag(s, et, 0);
47276783259SDavid du Colombier 		istag = 1;
47376783259SDavid du Colombier 	}else if(strcmp(s->name, "_off_") == 0){
47476783259SDavid du Colombier 		debug['T'] = 0;
47576783259SDavid du Colombier 		goto out;
47676783259SDavid du Colombier 	}else if(strcmp(s->name, "_on_") == 0){
47776783259SDavid du Colombier 		debug['T'] = 1;
47876783259SDavid du Colombier 		goto out;
47976783259SDavid du Colombier 	}
48076783259SDavid du Colombier 	t = s->type;
48176783259SDavid du Colombier 	if(istag)
48276783259SDavid du Colombier 		t = s->suetag;
48376783259SDavid du Colombier 	if(t == T)
48476783259SDavid du Colombier 		yyerror("unknown type %s in pragma incomplete", s->name);
48576783259SDavid du Colombier 	else if(!typesu[t->etype])
48676783259SDavid du Colombier 		yyerror("not struct/union type in pragma incomplete: %s", s->name);
48776783259SDavid du Colombier 	else
48876783259SDavid du Colombier 		t->garb |= GINCOMPLETE;
48976783259SDavid du Colombier out:
490375daca8SDavid du Colombier 	while(getnsc() != '\n')
491375daca8SDavid du Colombier 		;
492375daca8SDavid du Colombier 	if(debug['f'])
493375daca8SDavid du Colombier 		print("%s incomplete\n", s->name);
494375daca8SDavid du Colombier }
495