X-Git-Url: https://ocean-lang.org/code/?p=ocean;a=blobdiff_plain;f=csrc%2Fboot-strap%2Flibmdcode.c;h=cf5d85cc7937f3459f742d2192f5777209923daa;hp=a91bd60f2817efc55c2c1645ec636d4dc667d9ee;hb=45da2641b117c266e07e8aa306b92913ea5ab214;hpb=f8480284851202f57fd148cd2cc30502340a8494 diff --git a/csrc/boot-strap/libmdcode.c b/csrc/boot-strap/libmdcode.c index a91bd60..cf5d85c 100644 --- a/csrc/boot-strap/libmdcode.c +++ b/csrc/boot-strap/libmdcode.c @@ -1,23 +1,21 @@ -#line 101 "../mdcode.mdc" +#line 106 "../mdcode.mdc" #define _GNU_SOURCE #include #include #include #include "mdcode.h" -#line 470 "../mdcode.mdc" +#line 493 "../mdcode.mdc" #include #include - -#line 187 "../mdcode.mdc" +#line 194 "../mdcode.mdc" struct psection { struct section; struct code_node *last; int refcnt; int indent; }; - -#line 224 "../mdcode.mdc" +#line 231 "../mdcode.mdc" static void code_linearize(struct code_node *code) { struct code_node *t; @@ -37,8 +35,7 @@ static void code_linearize(struct code_node *code) t->next = next; } } - -#line 247 "../mdcode.mdc" +#line 254 "../mdcode.mdc" void code_free(struct code_node *code) { while (code) { @@ -50,8 +47,7 @@ void code_free(struct code_node *code) free(this); } } - -#line 276 "../mdcode.mdc" +#line 283 "../mdcode.mdc" static void code_add_text(struct psection *where, struct text txt, int line_no, int needs_strip) { @@ -62,7 +58,13 @@ static void code_add_text(struct psection *where, struct text txt, n->code = txt; n->indent = 0; n->line_no = line_no; - n->needs_strip = needs_strip; + if (needs_strip) { + if (txt.txt[0] == '\t') + n->needs_strip = 8; + else + n->needs_strip = 4; + } else + n->needs_strip = 0; n->next = NULL; n->child = NULL; if (where->last) @@ -71,8 +73,7 @@ static void code_add_text(struct psection *where, struct text txt, where->code = n; where->last = n; } - -#line 299 "../mdcode.mdc" +#line 312 "../mdcode.mdc" void code_add_link(struct psection *where, struct psection *to, int indent) { @@ -96,13 +97,17 @@ void code_add_link(struct psection *where, struct psection *to, where->code = n; where->last = n; } - -#line 338 "../mdcode.mdc" -static int text_cmp(struct text a, struct text b) +#line 356 "../mdcode.mdc" +int text_cmp(struct text a, struct text b) { - if (a.len != b.len) + int len = a.len; + if (len > b.len) + len = b.len; + int cmp = strncmp(a.txt, b.txt, len); + if (cmp) + return cmp; + else return a.len - b.len; - return strncmp(a.txt, b.txt, a.len); } static struct psection *section_find(struct psection **list, struct text name) @@ -127,8 +132,7 @@ static struct psection *section_find(struct psection **list, struct text name) new->indent = 0; return new; } - -#line 419 "../mdcode.mdc" +#line 442 "../mdcode.mdc" static char *skip_lws(char *pos, char *end) { while (pos < end && (*pos == ' ' || *pos == '\t')) @@ -167,8 +171,7 @@ static char *skip_para(char *pos, char *end, int *line_no) } return pos; } - -#line 475 "../mdcode.mdc" +#line 498 "../mdcode.mdc" static struct text take_header(char *pos, char *end) { struct text section; @@ -208,8 +211,7 @@ static int matches(char *start, char *pos, char *end) return (pos + strlen(start) < end && strncmp(pos, start, strlen(start)) == 0); } - -#line 547 "../mdcode.mdc" +#line 575 "../mdcode.mdc" static int count_space(char *sol, char *p) { int c = 0; @@ -223,7 +225,6 @@ static int count_space(char *sol, char *p) return c; } - static char *take_code(char *pos, char *end, char *marker, struct psection **table, struct text section, int *line_nop) @@ -284,6 +285,12 @@ static char *take_code(char *pos, char *end, char *marker, struct text txt; txt.txt = start; txt.len = pos - start; + /* strip trailing blank lines */ + while (!marker && txt.len > 2 && + start[txt.len-1] == '\n' && + start[txt.len-2] == '\n') + txt.len -= 1; + code_add_text(sect, txt, start_line, marker == NULL); } @@ -294,8 +301,7 @@ static char *take_code(char *pos, char *end, char *marker, *line_nop = line_no; return pos; } - -#line 641 "../mdcode.mdc" +#line 674 "../mdcode.mdc" static struct psection *code_find(char *pos, char *end) { struct psection *table = NULL; @@ -335,8 +341,7 @@ static struct psection *code_find(char *pos, char *end) } return table; } - -#line 701 "../mdcode.mdc" +#line 734 "../mdcode.mdc" struct section *code_extract(char *pos, char *end, code_err_fn error) { struct psection *table; @@ -382,8 +387,7 @@ struct section *code_extract(char *pos, char *end, code_err_fn error) } return result; } - -#line 782 "../mdcode.mdc" +#line 814 "../mdcode.mdc" void code_node_print(FILE *out, struct code_node *node, char *fname) { @@ -397,7 +401,10 @@ void code_node_print(FILE *out, struct code_node *node, fprintf(out, "#line %d \"%s\"\n", node->line_no, fname); while (len && *c) { - fprintf(out, "%*s", node->indent, ""); + if (node->indent >= 8) + fprintf(out, "\t%*s", node->indent - 8, ""); + else + fprintf(out, "%*s", node->indent, ""); if (node->needs_strip) { if (*c == '\t' && len > 1) { c++; @@ -415,6 +422,5 @@ void code_node_print(FILE *out, struct code_node *node, } } } - -#line 110 "../mdcode.mdc" +#line 115 "../mdcode.mdc"