on master help sign in
Avoid malloc entirely for small documents, hang everything off document
b569135Neil Mitchell
hexml.c+13−5
@@ -460,26 +460,34 @@ str parse_content(document* d)
460 return res;
460 return res;
461}
461}
462
462
463+typedef struct
464+{
465+ document document;
466+ attr attrs[1000];
467+ node nodes[1000];
468+} buffer;
469+
463document* document_parse(char* s, int slen)
470document* document_parse(char* s, int slen)
464{
471{
465 if (slen == -1) slen = strlen(s);
472 if (slen == -1) slen = strlen(s);
466 assert(s[slen] == 0);
473 assert(s[slen] == 0);
467 init_parse_table();
474 init_parse_table();
468
475
469− document* d = malloc(sizeof(document));
476+ buffer* buf = malloc(sizeof(buffer));
477+ document* d = &buf->document;
470 d->body = s;
478 d->body = s;
471 d->cursor = s;
479 d->cursor = s;
472 d->end = &s[slen];
480 d->end = &s[slen];
473 d->error_message = NULL;
481 d->error_message = NULL;
474− d->attrs.size = 0;
482+ d->attrs.size = 1000;
475 d->attrs.used = 0;
483 d->attrs.used = 0;
476− d->attrs.attrs = NULL;
484+ d->attrs.attrs = buf->attrs;
477 d->attrs.alloc = NULL;
485 d->attrs.alloc = NULL;
478 d->nodes.size = 1000;
486 d->nodes.size = 1000;
479 d->nodes.used_back = 0;
487 d->nodes.used_back = 0;
480 d->nodes.used_front = 1;
488 d->nodes.used_front = 1;
481− d->nodes.nodes = malloc(sizeof(node) * 1000);
489+ d->nodes.nodes = buf->nodes;
482− d->nodes.alloc = d->nodes.nodes;
490+ d->nodes.alloc = NULL;
483
491
484 d->nodes.nodes[0].name = start_length(0, 0);
492 d->nodes.nodes[0].name = start_length(0, 0);
485 d->nodes.nodes[0].outer = start_length(0, slen);
493 d->nodes.nodes[0].outer = start_length(0, slen);