void arginit(void) { int i; /* debug['F'] = 1;*/ /* debug['w'] = 1;*/ lastadj = Fadj; lastverb = Fverb; indchar = typ(TIND, types[TCHAR]); memset(flagbits, Fnone, sizeof(flagbits)); for(i='0'; i<='9'; i++) argflag(i, Fignor); argflag('.', Fignor); argflag('#', Fignor); argflag('u', Fignor); argflag('h', Fignor); argflag('+', Fignor); argflag('-', Fignor); argflag('*', Fstar); argflag('l', Fl); argflag('o', Fverb); flagbits['x'] = flagbits['o']; flagbits['X'] = flagbits['o']; }
Bits getflag(char *s) { Bits flag; int c, f; char *fmt; fmt = fmtbuf; flag = zbits; nstar = 0; while(c = *s++) { *fmt++ = c; f = flagbits[c]; switch(f) { case Fnone: argflag(c, Fverb); f = flagbits[c]; break; case Fstar: nstar++; case Fignor: continue; case Fl: if(bset(flag, Fl)) flag = bor(flag, blsh(Fvl)); } flag = bor(flag, blsh(f)); if(f >= Fverb) break; } *fmt = 0; return flag; }
Bits getflag(char *s) { Bits flag; int f; Fmt fmt; Rune c; flag = zbits; nstar = 0; fmtstrinit(&fmt); for(;;) { s += chartorune(&c, s); if(c == 0 || c >= nelem(flagbits)) break; fmtrune(&fmt, c); f = flagbits[c]; switch(f) { case Fnone: argflag(c, Fverb); f = flagbits[c]; break; case Fstar: nstar++; case Fignor: continue; case Fl: if(bset(flag, Fl)) flag = bor(flag, blsh(Fvl)); } flag = bor(flag, blsh(f)); if(f >= Fverb) break; } free(lastfmt); lastfmt = fmtstrflush(&fmt); return flag; }
Bits getflag(char *s) { Bits flag; int f; char *fmt; Rune c; fmt = fmtbuf; flag = zbits; nstar = 0; for(;;) { s += chartorune(&c, s); fmt += runetochar(fmt, &c); if(c == 0 || c >= nelem(flagbits)) break; f = flagbits[c]; switch(f) { case Fnone: argflag(c, Fverb); f = flagbits[c]; break; case Fstar: nstar++; case Fignor: continue; case Fl: if(bset(flag, Fl)) flag = bor(flag, blsh(Fvl)); } flag = bor(flag, blsh(f)); if(f >= Fverb) break; } *fmt = 0; return flag; }
void pragvararg(void) { Sym *s; int n, c; char *t; Rune r; Type *ty; if(!debug['F']) goto out; s = getsym(); if(s && strcmp(s->name, "argpos") == 0) goto ckpos; if(s && strcmp(s->name, "type") == 0) goto cktype; if(s && strcmp(s->name, "flag") == 0) goto ckflag; yyerror("syntax in #pragma varargck"); goto out; ckpos: /*#pragma varargck argpos warn 2*/ s = getsym(); if(s == S) goto bad; n = getnsn(); if(n < 0) goto bad; newname(s->name, n); goto out; ckflag: /*#pragma varargck flag 'c'*/ c = getnsc(); if(c != '\'') goto bad; c = getr(); if(c == '\\') c = getr(); else if(c == '\'') goto bad; if(c == '\n') goto bad; if(getc() != '\'') goto bad; argflag(c, Fignor); goto out; cktype: /*#pragma varargck type O int*/ c = getnsc(); if(c != '"') goto bad; t = fmtbuf; for(;;) { r = getr(); if(r == ' ' || r == '\n') goto bad; if(r == '"') break; t += runetochar(t, &r); } *t = 0; t = strdup(fmtbuf); s = getsym(); if(s == S) goto bad; ty = s->type; while((c = getnsc()) == '*') ty = typ(TIND, ty); unget(c); newprot(s, ty, t); goto out; bad: yyerror("syntax in #pragma varargck"); out: while(getnsc() != '\n') ; }
void pragvararg(void) { Sym *s; int n, c; char *t; Type *ty; if(!debug['F']) goto out; s = getsym(); if(s && strcmp(s->name, "argpos") == 0) goto ckpos; if(s && strcmp(s->name, "type") == 0) goto cktype; if(s && strcmp(s->name, "flag") == 0) goto ckflag; yyerror("syntax in #pragma varargck"); goto out; ckpos: /*#pragma varargck argpos warn 2*/ s = getsym(); if(s == S) goto bad; n = getnsn(); if(n < 0) goto bad; newname(s->name, n); goto out; ckflag: /*#pragma varargck flag 'c'*/ c = getnsc(); if(c != '\'') goto bad; c = getr(); if(c == '\\') c = getr(); else if(c == '\'') goto bad; if(c == '\n') goto bad; if(getc() != '\'') goto bad; argflag(c, Fignor); goto out; cktype: /*#pragma varargck type O int*/ t = getquoted(); if(t == nil) goto bad; s = getsym(); if(s == S) goto bad; ty = s->type; while((c = getnsc()) == '*') ty = typ(TIND, ty); unget(c); newprot(s, ty, t); goto out; bad: yyerror("syntax in #pragma varargck"); out: while(getnsc() != '\n') ; }
void hud_cmd(char **words, MCPacketQueue *sq, MCPacketQueue *cq) { hud_prune(); char reply[32768]; reply[0] = 0; int rpos = 0; int bind_needed = 1; char *cmd = words[1]; words+=2; arg_defaults ad; int ARG_NOTFOUND=0; if (!cmd || !strcmp(cmd,"toggle")) { if (hud_id<0) { bind_needed = 1; } else { hud_unbind(reply, cq); bind_needed = 0; } } else if (!strcmp(cmd,"test")) { hud_mode = HUDMODE_TEST; } else if (!strcmp(cmd,"info")) { hud_mode = HUDMODE_INFO; } else if (!strcmp(cmd,"tunnel") || !strcmp(cmd,"tun")) { hud_mode = HUDMODE_TUNNEL; } else if (!strcmp(cmd,"build")) { hud_mode = HUDMODE_BUILD; hud_build_plan = argflag(words, WORDLIST("plan","p")); ARGDEF(page, NULL, hud_build_page, 1); } else if (!strcmp(cmd,"map")) { hud_mode = HUDMODE_MAP; } else if (!strcmp(cmd,"help")) { hud_mode = HUDMODE_HELP; hud_help_page[0] = 0; if (words[0]) sprintf(hud_help_page, "%s", words[0]); } else { bind_needed = 0; goto Error; } if (bind_needed && hud_id<0) { int id = hud_new(reply, cq); if (id < 0) goto Error; hud_bind(reply, id); } hud_inv = HUDINV_ANY; Error: if (reply[0]) chat_message(reply, cq, "green", rpos); }