Blame


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