@@ -190,31 +190,33 @@ attr* node_attributes(document* d, node* n, int* res)
191attr* node_attributeBy(document* d, node* n, char* s, int slen)
191attr* node_attributeBy(document* d, node* n, char* s, int slen)
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++)
198+ attr* r = &d->attrs.attrs[i];
199+ if (r->name.length == slen && memcmp(s, &d->body[r->name.start], slen) == 0)
194 return NULL;
202 return NULL;
197// Search for given strings within a node
205// 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)
200 if (slen == -1) slen = strlen(s);
208 if (slen == -1) slen = strlen(s);
201− int i = n->nodes.start;
209+ int i = prev == NULL ? parent->nodes.start : prev + 1 - d->nodes.nodes;
202− int limit = i + n->nodes.length;
210+ int limit = end(parent->nodes);
203 for (; i < limit; i++)
211 for (; i < limit; i++)
205− if (d->nodes.nodes[i].name.length == slen &&
213+ node* r = &d->nodes.nodes[i];
206− memcmp(s, &d->body[d->nodes.nodes[i].name.start], slen) == 0)
214+ if (r->name.length == slen && memcmp(s, &d->body[r->name.start], slen) == 0)
207− return &d->nodes.nodes[i];
215+ return r;
209 return NULL;
217 return NULL;
212−node* node_nextChildBy(document* d, node* parent, node* prev, char* s, int slen)
219/////////////////////////////////////////////////////////////////////
221/////////////////////////////////////////////////////////////////////
220// PARSE TABLE
222// PARSE TABLE