Blame


1 6e527fbc 2005-02-13 devnull #include "std.h"
2 6e527fbc 2005-02-13 devnull #include "dat.h"
3 6e527fbc 2005-02-13 devnull
4 6e527fbc 2005-02-13 devnull Attr*
5 6e527fbc 2005-02-13 devnull addattr(Attr *a, char *fmt, ...)
6 6e527fbc 2005-02-13 devnull {
7 6e527fbc 2005-02-13 devnull char buf[8192];
8 6e527fbc 2005-02-13 devnull va_list arg;
9 6e527fbc 2005-02-13 devnull Attr *b;
10 6e527fbc 2005-02-13 devnull
11 6e527fbc 2005-02-13 devnull va_start(arg, fmt);
12 6e527fbc 2005-02-13 devnull vseprint(buf, buf+sizeof buf, fmt, arg);
13 6e527fbc 2005-02-13 devnull va_end(arg);
14 6e527fbc 2005-02-13 devnull b = _parseattr(buf);
15 6e527fbc 2005-02-13 devnull a = addattrs(a, b);
16 6e527fbc 2005-02-13 devnull setmalloctag(a, getcallerpc(&a));
17 6e527fbc 2005-02-13 devnull _freeattr(b);
18 6e527fbc 2005-02-13 devnull return a;
19 6e527fbc 2005-02-13 devnull }
20 6e527fbc 2005-02-13 devnull
21 6e527fbc 2005-02-13 devnull /*
22 6e527fbc 2005-02-13 devnull * add attributes in list b to list a. If any attributes are in
23 6e527fbc 2005-02-13 devnull * both lists, replace those in a by those in b.
24 6e527fbc 2005-02-13 devnull */
25 6e527fbc 2005-02-13 devnull Attr*
26 6e527fbc 2005-02-13 devnull addattrs(Attr *a, Attr *b)
27 6e527fbc 2005-02-13 devnull {
28 6e527fbc 2005-02-13 devnull int found;
29 6e527fbc 2005-02-13 devnull Attr **l, *aa;
30 6e527fbc 2005-02-13 devnull
31 6e527fbc 2005-02-13 devnull for(; b; b=b->next){
32 6e527fbc 2005-02-13 devnull switch(b->type){
33 6e527fbc 2005-02-13 devnull case AttrNameval:
34 6e527fbc 2005-02-13 devnull for(l=&a; *l; ){
35 6e527fbc 2005-02-13 devnull if(strcmp((*l)->name, b->name) != 0){
36 6e527fbc 2005-02-13 devnull l=&(*l)->next;
37 6e527fbc 2005-02-13 devnull continue;
38 6e527fbc 2005-02-13 devnull }
39 6e527fbc 2005-02-13 devnull aa = *l;
40 6e527fbc 2005-02-13 devnull *l = aa->next;
41 6e527fbc 2005-02-13 devnull aa->next = nil;
42 6e527fbc 2005-02-13 devnull freeattr(aa);
43 6e527fbc 2005-02-13 devnull }
44 6e527fbc 2005-02-13 devnull *l = mkattr(AttrNameval, b->name, b->val, nil);
45 6e527fbc 2005-02-13 devnull break;
46 6e527fbc 2005-02-13 devnull case AttrQuery:
47 6e527fbc 2005-02-13 devnull found = 0;
48 6e527fbc 2005-02-13 devnull for(l=&a; *l; l=&(*l)->next)
49 6e527fbc 2005-02-13 devnull if((*l)->type==AttrNameval && strcmp((*l)->name, b->name) == 0)
50 6e527fbc 2005-02-13 devnull found++;
51 6e527fbc 2005-02-13 devnull if(!found)
52 6e527fbc 2005-02-13 devnull *l = mkattr(AttrQuery, b->name, b->val, nil);
53 6e527fbc 2005-02-13 devnull break;
54 6e527fbc 2005-02-13 devnull }
55 6e527fbc 2005-02-13 devnull }
56 6e527fbc 2005-02-13 devnull return a;
57 6e527fbc 2005-02-13 devnull }
58 6e527fbc 2005-02-13 devnull
59 6e527fbc 2005-02-13 devnull void
60 6e527fbc 2005-02-13 devnull setmalloctaghere(void *v)
61 6e527fbc 2005-02-13 devnull {
62 6e527fbc 2005-02-13 devnull setmalloctag(v, getcallerpc(&v));
63 6e527fbc 2005-02-13 devnull }
64 6e527fbc 2005-02-13 devnull
65 6e527fbc 2005-02-13 devnull Attr*
66 6e527fbc 2005-02-13 devnull sortattr(Attr *a)
67 6e527fbc 2005-02-13 devnull {
68 6e527fbc 2005-02-13 devnull int i;
69 6e527fbc 2005-02-13 devnull Attr *anext, *a0, *a1, **l;
70 6e527fbc 2005-02-13 devnull
71 6e527fbc 2005-02-13 devnull if(a == nil || a->next == nil)
72 6e527fbc 2005-02-13 devnull return a;
73 6e527fbc 2005-02-13 devnull
74 6e527fbc 2005-02-13 devnull /* cut list in halves */
75 6e527fbc 2005-02-13 devnull a0 = nil;
76 6e527fbc 2005-02-13 devnull a1 = nil;
77 6e527fbc 2005-02-13 devnull i = 0;
78 6e527fbc 2005-02-13 devnull for(; a; a=anext){
79 6e527fbc 2005-02-13 devnull anext = a->next;
80 6e527fbc 2005-02-13 devnull if(i++%2){
81 6e527fbc 2005-02-13 devnull a->next = a0;
82 6e527fbc 2005-02-13 devnull a0 = a;
83 6e527fbc 2005-02-13 devnull }else{
84 6e527fbc 2005-02-13 devnull a->next = a1;
85 6e527fbc 2005-02-13 devnull a1 = a;
86 6e527fbc 2005-02-13 devnull }
87 6e527fbc 2005-02-13 devnull }
88 6e527fbc 2005-02-13 devnull
89 6e527fbc 2005-02-13 devnull /* sort */
90 6e527fbc 2005-02-13 devnull a0 = sortattr(a0);
91 6e527fbc 2005-02-13 devnull a1 = sortattr(a1);
92 6e527fbc 2005-02-13 devnull
93 6e527fbc 2005-02-13 devnull /* merge */
94 6e527fbc 2005-02-13 devnull l = &a;
95 6e527fbc 2005-02-13 devnull while(a0 || a1){
96 6e527fbc 2005-02-13 devnull if(a1==nil){
97 6e527fbc 2005-02-13 devnull anext = a0;
98 6e527fbc 2005-02-13 devnull a0 = a0->next;
99 6e527fbc 2005-02-13 devnull }else if(a0==nil){
100 6e527fbc 2005-02-13 devnull anext = a1;
101 6e527fbc 2005-02-13 devnull a1 = a1->next;
102 6e527fbc 2005-02-13 devnull }else if(strcmp(a0->name, a1->name) < 0){
103 6e527fbc 2005-02-13 devnull anext = a0;
104 6e527fbc 2005-02-13 devnull a0 = a0->next;
105 6e527fbc 2005-02-13 devnull }else{
106 6e527fbc 2005-02-13 devnull anext = a1;
107 6e527fbc 2005-02-13 devnull a1 = a1->next;
108 6e527fbc 2005-02-13 devnull }
109 6e527fbc 2005-02-13 devnull *l = anext;
110 6e527fbc 2005-02-13 devnull l = &(*l)->next;
111 6e527fbc 2005-02-13 devnull }
112 6e527fbc 2005-02-13 devnull *l = nil;
113 6e527fbc 2005-02-13 devnull return a;
114 6e527fbc 2005-02-13 devnull }
115 6e527fbc 2005-02-13 devnull
116 6e527fbc 2005-02-13 devnull int
117 6e527fbc 2005-02-13 devnull attrnamefmt(Fmt *fmt)
118 6e527fbc 2005-02-13 devnull {
119 6e527fbc 2005-02-13 devnull char *b, buf[8192], *ebuf;
120 6e527fbc 2005-02-13 devnull Attr *a;
121 6e527fbc 2005-02-13 devnull
122 6e527fbc 2005-02-13 devnull ebuf = buf+sizeof buf;
123 6e527fbc 2005-02-13 devnull b = buf;
124 6e527fbc 2005-02-13 devnull strcpy(buf, " ");
125 6e527fbc 2005-02-13 devnull for(a=va_arg(fmt->args, Attr*); a; a=a->next){
126 6e527fbc 2005-02-13 devnull if(a->name == nil)
127 6e527fbc 2005-02-13 devnull continue;
128 6e527fbc 2005-02-13 devnull b = seprint(b, ebuf, " %q?", a->name);
129 6e527fbc 2005-02-13 devnull }
130 6e527fbc 2005-02-13 devnull return fmtstrcpy(fmt, buf+1);
131 6e527fbc 2005-02-13 devnull }
132 6e527fbc 2005-02-13 devnull
133 6e527fbc 2005-02-13 devnull /*
134 6e527fbc 2005-02-13 devnull static int
135 6e527fbc 2005-02-13 devnull hasqueries(Attr *a)
136 6e527fbc 2005-02-13 devnull {
137 6e527fbc 2005-02-13 devnull for(; a; a=a->next)
138 6e527fbc 2005-02-13 devnull if(a->type == AttrQuery)
139 6e527fbc 2005-02-13 devnull return 1;
140 6e527fbc 2005-02-13 devnull return 0;
141 6e527fbc 2005-02-13 devnull }
142 6e527fbc 2005-02-13 devnull */
143 6e527fbc 2005-02-13 devnull
144 6e527fbc 2005-02-13 devnull char *ignored[] = {
145 6e527fbc 2005-02-13 devnull "role",
146 6e527fbc 2005-02-13 devnull "disabled",
147 6e527fbc 2005-02-13 devnull };
148 6e527fbc 2005-02-13 devnull
149 6e527fbc 2005-02-13 devnull static int
150 6e527fbc 2005-02-13 devnull ignoreattr(char *s)
151 6e527fbc 2005-02-13 devnull {
152 6e527fbc 2005-02-13 devnull int i;
153 6e527fbc 2005-02-13 devnull
154 6e527fbc 2005-02-13 devnull for(i=0; i<nelem(ignored); i++)
155 6e527fbc 2005-02-13 devnull if(strcmp(ignored[i], s)==0)
156 6e527fbc 2005-02-13 devnull return 1;
157 6e527fbc 2005-02-13 devnull return 0;
158 6e527fbc 2005-02-13 devnull }
159 6e527fbc 2005-02-13 devnull
160 6e527fbc 2005-02-13 devnull static int
161 6e527fbc 2005-02-13 devnull hasname(Attr *a0, Attr *a1, char *name)
162 6e527fbc 2005-02-13 devnull {
163 6e527fbc 2005-02-13 devnull return _findattr(a0, name) || _findattr(a1, name);
164 6e527fbc 2005-02-13 devnull }
165 6e527fbc 2005-02-13 devnull
166 6e527fbc 2005-02-13 devnull static int
167 6e527fbc 2005-02-13 devnull hasnameval(Attr *a0, Attr *a1, char *name, char *val)
168 6e527fbc 2005-02-13 devnull {
169 6e527fbc 2005-02-13 devnull Attr *a;
170 6e527fbc 2005-02-13 devnull
171 6e527fbc 2005-02-13 devnull for(a=_findattr(a0, name); a; a=_findattr(a->next, name))
172 6e527fbc 2005-02-13 devnull if(strcmp(a->val, val) == 0)
173 6e527fbc 2005-02-13 devnull return 1;
174 6e527fbc 2005-02-13 devnull for(a=_findattr(a1, name); a; a=_findattr(a->next, name))
175 6e527fbc 2005-02-13 devnull if(strcmp(a->val, val) == 0)
176 6e527fbc 2005-02-13 devnull return 1;
177 6e527fbc 2005-02-13 devnull return 0;
178 6e527fbc 2005-02-13 devnull }
179 6e527fbc 2005-02-13 devnull
180 6e527fbc 2005-02-13 devnull int
181 6e527fbc 2005-02-13 devnull matchattr(Attr *pat, Attr *a0, Attr *a1)
182 6e527fbc 2005-02-13 devnull {
183 6e527fbc 2005-02-13 devnull int type;
184 6e527fbc 2005-02-13 devnull
185 6e527fbc 2005-02-13 devnull for(; pat; pat=pat->next){
186 6e527fbc 2005-02-13 devnull type = pat->type;
187 6e527fbc 2005-02-13 devnull if(ignoreattr(pat->name))
188 6e527fbc 2005-02-13 devnull type = AttrDefault;
189 6e527fbc 2005-02-13 devnull switch(type){
190 6e527fbc 2005-02-13 devnull case AttrQuery: /* name=something be present */
191 6e527fbc 2005-02-13 devnull if(!hasname(a0, a1, pat->name))
192 6e527fbc 2005-02-13 devnull return 0;
193 6e527fbc 2005-02-13 devnull break;
194 6e527fbc 2005-02-13 devnull case AttrNameval: /* name=val must be present */
195 6e527fbc 2005-02-13 devnull if(!hasnameval(a0, a1, pat->name, pat->val))
196 6e527fbc 2005-02-13 devnull return 0;
197 6e527fbc 2005-02-13 devnull break;
198 6e527fbc 2005-02-13 devnull case AttrDefault: /* name=val must be present if name=anything is present */
199 6e527fbc 2005-02-13 devnull if(hasname(a0, a1, pat->name) && !hasnameval(a0, a1, pat->name, pat->val))
200 6e527fbc 2005-02-13 devnull return 0;
201 6e527fbc 2005-02-13 devnull break;
202 6e527fbc 2005-02-13 devnull }
203 6e527fbc 2005-02-13 devnull }
204 6e527fbc 2005-02-13 devnull return 1;
205 6e527fbc 2005-02-13 devnull }
206 6e527fbc 2005-02-13 devnull
207 6e527fbc 2005-02-13 devnull Attr*
208 6e527fbc 2005-02-13 devnull parseattrfmtv(char *fmt, va_list arg)
209 6e527fbc 2005-02-13 devnull {
210 6e527fbc 2005-02-13 devnull char *s;
211 6e527fbc 2005-02-13 devnull Attr *a;
212 6e527fbc 2005-02-13 devnull
213 6e527fbc 2005-02-13 devnull s = vsmprint(fmt, arg);
214 6e527fbc 2005-02-13 devnull if(s == nil)
215 6e527fbc 2005-02-13 devnull sysfatal("vsmprint: out of memory");
216 6e527fbc 2005-02-13 devnull a = parseattr(s);
217 6e527fbc 2005-02-13 devnull free(s);
218 6e527fbc 2005-02-13 devnull return a;
219 6e527fbc 2005-02-13 devnull }
220 6e527fbc 2005-02-13 devnull
221 6e527fbc 2005-02-13 devnull Attr*
222 6e527fbc 2005-02-13 devnull parseattrfmt(char *fmt, ...)
223 6e527fbc 2005-02-13 devnull {
224 6e527fbc 2005-02-13 devnull va_list arg;
225 6e527fbc 2005-02-13 devnull Attr *a;
226 6e527fbc 2005-02-13 devnull
227 6e527fbc 2005-02-13 devnull va_start(arg, fmt);
228 6e527fbc 2005-02-13 devnull a = parseattrfmtv(fmt, arg);
229 6e527fbc 2005-02-13 devnull va_end(arg);
230 6e527fbc 2005-02-13 devnull return a;
231 6e527fbc 2005-02-13 devnull }