@@ -124,7 +124,6 @@ void render_content(render* r, node* n)
124 bound_str("render_conent attrs", n->attrs, 0, r->d->attrs.used);
124 bound_str("render_conent attrs", n->attrs, 0, r->d->attrs.used);
126 int done = n->inner.start;
126 int done = n->inner.start;
127− printf("%i\n", n->nodes.length);
128 for (int i = 0; i < n->nodes.length; i++)
127 for (int i = 0; i < n->nodes.length; i++)
130 node* x = &r->d->nodes.nodes[n->nodes.start + i];
129 node* x = &r->d->nodes.nodes[n->nodes.start + i];
@@ -164,8 +163,6 @@ int document_render(document* d, char* buffer, int length)
164 r.buffer = buffer;
163 r.buffer = buffer;
165 r.length = length;
164 r.length = length;
166 r.cursor = 0;
165 r.cursor = 0;
167− node* me = document_node(d);
168− assert(me->nodes.start == 1 && me->nodes.length == 1);
169 render_content(&r, document_node(d));
166 render_content(&r, document_node(d));
170 return r.cursor;
167 return r.cursor;
@@ -241,8 +238,10 @@ void static inline skip(document* d, int i){d->cursor += i;}
241char static inline peek(document* d){return peekAt(d, 0);}
238char static inline peek(document* d){return peekAt(d, 0);}
242char static inline get(document* d){char c = peek(d); skip(d, 1); return c;}
239char static inline get(document* d){char c = peek(d); skip(d, 1); return c;}
241+bool static inline is_space(char c){ return c == ' ' || c == '\t' || c == '\r' || c == '\n';}
244// Remove whitespace characters from the cursor while they are still whitespace
243// Remove whitespace characters from the cursor while they are still whitespace
245−void trim(document* d)
244+void static inline trim(document* d)
247 while (isspace(peek(d)))
246 while (isspace(peek(d)))
248 skip(d, 1);
247 skip(d, 1);
@@ -287,15 +286,13 @@ void attr_alloc(attr_buffer* b, int ask)
287 b->attrs = buf2;
286 b->attrs = buf2;
290−void lexeme(char* msg, document* d, str s)
293− printf("Lexeme: %s, %i:%i, %.*s\n", msg, s.start, s.length, s.length, &d->body[s.start]);
296−int isName(char c)
289+int static inline isName(char c)
298− return isalnum(c) || c == '?';
291+ return
292+ (c >= 'a' && c <= 'z') ||
293+ (c >= 'A' && c <= 'Z') ||
294+ (c >= '0' && c <= '9') ||
295+ c == '_' || c == '-';
301// you now expect a name, perhaps preceeded by whitespace
298// you now expect a name, perhaps preceeded by whitespace
@@ -308,7 +305,6 @@ str parse_name(document* d)
308 while (isName(peek(d)))
305 while (isName(peek(d)))
310 res.length = d->cursor - res.start;
307 res.length = d->cursor - res.start;
311− lexeme("parse_name", d, res);
312 return res;
308 return res;
@@ -395,15 +391,18 @@ void parse_tag(document* d)
395 if (peek(d) == '<' && peekAt(d, 1) == '/')
391 if (peek(d) == '<' && peekAt(d, 1) == '/')
397 skip(d, 2);
393 skip(d, 2);
398− str close = parse_name(d);
399− lexeme("openning tag", d, d->nodes.nodes[me].name);
400− lexeme("closing tag", d, close);
402− d->nodes.nodes[me].outer.length = start_end(d->nodes.nodes[me].outer.start, d->cursor).length;
403− if (close.length == d->nodes.nodes[me].name.length &&
395+ if (d->length - d->cursor >= d->nodes.nodes[me].name.length &&
404− memcmp(&d->body[close.start], &d->body[d->nodes.nodes[me].name.start], close.length) == 0 &&
396+ memcmp(&d->body[d->cursor], &d->body[d->nodes.nodes[me].name.start], d->nodes.nodes[me].name.length) == 0)
398+ skip(d, d->nodes.nodes[me].name.length);
405− get(d) == '>');
400+ if (get(d) == '>')
402+ d->nodes.nodes[me].outer.length = start_end(d->nodes.nodes[me].outer.start, d->cursor).length;
407 d->error_message = _strdup("Mismatch in closing tags");
406 d->error_message = _strdup("Mismatch in closing tags");
@@ -428,17 +427,14 @@ str parse_content(document* d)
431− printf("parsing a tag\n");
432 parse_tag(d);
430 parse_tag(d);
435 int diff = d->nodes.used_back - before;
433 int diff = d->nodes.used_back - before;
436 node_alloc(&d->nodes, diff);
434 node_alloc(&d->nodes, diff);
437 str res = start_length(d->nodes.used_front, diff);
435 str res = start_length(d->nodes.used_front, diff);
439− printf("res %i %i\n", res.start, res.length);
440 for (int i = 0; i < diff; i++)
436 for (int i = 0; i < diff; i++)
441− d->nodes.nodes[d->nodes.used_front + i] = d->nodes.nodes[d->nodes.size - d->nodes.used_back - i];
437+ d->nodes.nodes[d->nodes.used_front + i] = d->nodes.nodes[d->nodes.size - d->nodes.used_back + diff - 1 - i];
442 d->nodes.used_front += diff;
438 d->nodes.used_front += diff;
443 d->nodes.used_back -= diff;
439 d->nodes.used_back -= diff;
444 return res;
440 return res;
@@ -469,7 +465,6 @@ document* document_parse(char* s, int slen)
470 if (d->cursor < d->length && d->error_message == NULL)
466 if (d->cursor < d->length && d->error_message == NULL)
472− printf("%i vs %i\n", d->cursor, d->length);
473 d->error_message = _strdup("Trailing junk at the end of the document");
468 d->error_message = _strdup("Trailing junk at the end of the document");
475 return d;
470 return d;