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