11 for(a=va_arg(fmt->args, Attr*); a != nil; a=a->next){
18 fmtprint(fmt, first+" %q?", a->name);
22 fmtprint(fmt, first+" %q=%q", a->name, a->val);
38 *la = _mkattr(a->type, a->name, a->val, nil);
39 setmalloctag(*la, getcallerpc(&a));
47 _delattr(Attr *a, char *name)
53 if(strcmp((*la)->name, name) == 0){
65 _findattr(Attr *a, char *n)
68 if(strcmp(a->name, n) == 0 && a->type != AttrQuery)
90 _mkattr(int type, char *name, char *val, Attr *next)
94 a = malloc(sizeof(*a));
96 sysfatal("_mkattr malloc: %r");
98 a->name = strdup(name);
100 if(a->name==nil || a->val==nil)
101 sysfatal("_mkattr malloc: %r");
103 setmalloctag(a, getcallerpc(&type));
114 if((*la)->type==AttrQuery && _findattr(a, (*la)->name)){
128 char *p, *t, *tok[256];
134 sysfatal("_parseattr strdup: %r");
136 ntok = tokenize(s, tok, nelem(tok));
138 for(i=ntok-1; i>=0; i--){
140 if((p = strchr(t, '=')) != nil){
142 a = _mkattr(AttrNameval, t, p, a);
143 }else if((p = strchr(t, '\0')-1) >= t && *p == '?'){
145 a = _mkattr(AttrQuery, t, "", a);
147 /* really a syntax error, but better to provide some indication */
148 a = _mkattr(AttrNameval, t, "", a);
150 setmalloctag(a, getcallerpc(&s));
157 _strfindattr(Attr *a, char *n)