@@ -190,31 +190,33 @@ attr* node_attributes(document* d, node* n, int* res)
190190
191191attr* node_attributeBy(document* d, node* n, char* s, int slen)
192192{
193− assert(0);
193+ if (slen == -1) slen = strlen(s);
194+ int i = n->attrs.start;
195+ int limit = end(n->attrs);
196+ for (i = n->attrs.start; i < limit; i++)
197+ {
198+ attr* r = &d->attrs.attrs[i];
199+ if (r->name.length == slen && memcmp(s, &d->body[r->name.start], slen) == 0)
200+ return r;
201+ }
194202 return NULL;
195203}
196204
197205// Search for given strings within a node
198−node* node_firstChildBy(document* d, node* n, char* s, int slen)
206+node* node_childBy(document* d, node* parent, node* prev, char* s, int slen)
199207{
200208 if (slen == -1) slen = strlen(s);
201− int i = n->nodes.start;
202− int limit = i + n->nodes.length;
209+ int i = prev == NULL ? parent->nodes.start : prev + 1 - d->nodes.nodes;
210+ int limit = end(parent->nodes);
203211 for (; i < limit; i++)
204212 {
205− if (d->nodes.nodes[i].name.length == slen &&
206− memcmp(s, &d->body[d->nodes.nodes[i].name.start], slen) == 0)
207− return &d->nodes.nodes[i];
213+ node* r = &d->nodes.nodes[i];
214+ if (r->name.length == slen && memcmp(s, &d->body[r->name.start], slen) == 0)
215+ return r;
208216 }
209217 return NULL;
210218}
211219
212−node* node_nextChildBy(document* d, node* parent, node* prev, char* s, int slen)
213−{
214− assert(0);
215− return NULL;
216−}
217−
218220
219221/////////////////////////////////////////////////////////////////////
220222// PARSE TABLE