-#line 101 "../mdcode.mdc"
+#line 106 "../mdcode.mdc"
#define _GNU_SOURCE
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include "mdcode.h"
-#line 470 "../mdcode.mdc"
+#line 493 "../mdcode.mdc"
#include <ctype.h>
#include <string.h>
-
-#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;
t->next = next;
}
}
-
-#line 247 "../mdcode.mdc"
+#line 254 "../mdcode.mdc"
void code_free(struct code_node *code)
{
while (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)
{
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)
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)
{
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)
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'))
}
return pos;
}
-
-#line 475 "../mdcode.mdc"
+#line 498 "../mdcode.mdc"
static struct text take_header(char *pos, char *end)
{
struct text section;
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;
return c;
}
-
static char *take_code(char *pos, char *end, char *marker,
struct psection **table, struct text section,
int *line_nop)
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);
}
*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;
}
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;
}
return result;
}
-
-#line 782 "../mdcode.mdc"
+#line 814 "../mdcode.mdc"
void code_node_print(FILE *out, struct code_node *node,
char *fname)
{
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++;
}
}
}
-
-#line 110 "../mdcode.mdc"
+#line 115 "../mdcode.mdc"