icount tag childrend to fix lack of SEP emission on data with leading whitespaces - xml2tsv - a simple xml-to-tsv converter, based on xmlparser Err bitreich.org 70 1Log /scm/xml2tsv/log.gph bitreich.org 70 1Files /scm/xml2tsv/files.gph bitreich.org 70 1Refs /scm/xml2tsv/refs.gph bitreich.org 70 1Tags /scm/xml2tsv/tag bitreich.org 70 1README /scm/xml2tsv/file/README.md.gph bitreich.org 70 1LICENSE /scm/xml2tsv/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit df38d2270241927e5436a0bc36ffb99044a8f4fb /scm/xml2tsv/commit/df38d2270241927e5436a0bc36ffb99044a8f4fb.gph bitreich.org 70 1parent b0601f2be7df28d3fab982344a2cc0df8960b012 /scm/xml2tsv/commit/b0601f2be7df28d3fab982344a2cc0df8960b012.gph bitreich.org 70 hAuthor: KatolaZ URL:mailto:katolaz@freaknet.org bitreich.org 70 iDate: Wed, 8 Dec 2021 21:44:11 +0000 Err bitreich.org 70 i Err bitreich.org 70 icount tag childrend to fix lack of SEP emission on data with leading whitespaces Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M xml2tsv.c | 36 +++++++++++++++++++++----------- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 24 insertions(+), 12 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/xml2tsv.c b/xml2tsv.c /scm/xml2tsv/file/xml2tsv.c.gph bitreich.org 70 i@@ -26,8 +26,15 @@ Err bitreich.org 70 i /* tag stack */ Err bitreich.org 70 i Err bitreich.org 70 i typedef struct { Err bitreich.org 70 i+ char s[STR_MAX]; Err bitreich.org 70 i+ int ref; Err bitreich.org 70 i+} taginfo_t; Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+typedef struct { Err bitreich.org 70 i int top; Err bitreich.org 70 i- char st[DEPTH_MAX][STR_MAX]; Err bitreich.org 70 i+ taginfo_t st[DEPTH_MAX]; Err bitreich.org 70 i } tstack_t; Err bitreich.org 70 i Err bitreich.org 70 i int stack_empty(tstack_t *t){ Err bitreich.org 70 i@@ -37,22 +44,27 @@ int stack_empty(tstack_t *t){ Err bitreich.org 70 i int stack_push(tstack_t *t, const char *c){ Err bitreich.org 70 i if (t->top < DEPTH_MAX){ Err bitreich.org 70 i t->top ++; Err bitreich.org 70 i- strncpy(t->st[t->top], c, STR_MAX - 1); Err bitreich.org 70 i- t->st[t->top][STR_MAX - 1] = '\0'; Err bitreich.org 70 i+ strncpy(t->st[t->top].s, c, STR_MAX - 1); Err bitreich.org 70 i+ t->st[t->top].s[STR_MAX - 1] = '\0'; Err bitreich.org 70 i+ t->st[t->top].ref = 0; Err bitreich.org 70 i+ if (t->top){ Err bitreich.org 70 i+ /* Increment the ref counter of the parent tag*/ Err bitreich.org 70 i+ t->st[t->top-1].ref += 1; Err bitreich.org 70 i+ } Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-char* stack_pop(tstack_t *t){ Err bitreich.org 70 i+taginfo_t* stack_pop(tstack_t *t){ Err bitreich.org 70 i if (!stack_empty(t)) Err bitreich.org 70 i- return t->st[t->top--]; Err bitreich.org 70 i+ return t->st + t->top--; Err bitreich.org 70 i return NULL; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-char* stack_peek(tstack_t *t){ Err bitreich.org 70 i+taginfo_t* stack_peek(tstack_t *t){ Err bitreich.org 70 i if (!stack_empty(t)) Err bitreich.org 70 i- return t->st[t->top]; Err bitreich.org 70 i+ return t->st + t->top; Err bitreich.org 70 i return NULL; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -102,7 +114,7 @@ void print_cur_str(tstack_t *t){ Err bitreich.org 70 i int i; Err bitreich.org 70 i for (i=0; i<=t->top; i++){ Err bitreich.org 70 i putchar('/'); Err bitreich.org 70 i- fputs(t->st[i], stdout); Err bitreich.org 70 i+ fputs(t->st[i].s, stdout); Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -110,7 +122,7 @@ void print_cur_str_fp(FILE *f, tstack_t *t){ Err bitreich.org 70 i int i; Err bitreich.org 70 i for (i=0; i<=t->top; i++){ Err bitreich.org 70 i fputc('/', f); Err bitreich.org 70 i- fputs(t->st[i], f); Err bitreich.org 70 i+ fputs(t->st[i].s, f); Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -164,7 +176,7 @@ xmlcdata(XMLParser *x, const char *d, size_t dl) Err bitreich.org 70 i void Err bitreich.org 70 i xmldata(XMLParser *x, const char *d, size_t dl) Err bitreich.org 70 i { Err bitreich.org 70 i- if (strcspn(d, " \t\n") && emitsep){ Err bitreich.org 70 i+ if (stack_peek(&st) || (strcspn(d, " \t\n") && emitsep)){ Err bitreich.org 70 i putchar(SEP); Err bitreich.org 70 i emitsep = FALSE; Err bitreich.org 70 i } Err bitreich.org 70 i@@ -202,7 +214,7 @@ xmltagend(XMLParser *x, const char *t, size_t tl, int isshort) Err bitreich.org 70 i if (stack_empty(&st)){ Err bitreich.org 70 i fprintf(stderr, "Error: tag-end '%s' before any open tag\n", t); Err bitreich.org 70 i } Err bitreich.org 70 i- tag = stack_pop(&st); Err bitreich.org 70 i+ tag = stack_pop(&st)->s; Err bitreich.org 70 i if (strcmp(t, tag)){ Err bitreich.org 70 i fprintf(stderr, "Error: tag-end '%s' closes tag '%s'\n", t, tag); Err bitreich.org 70 i } Err bitreich.org 70 i@@ -212,7 +224,7 @@ void Err bitreich.org 70 i xmltagstart(XMLParser *x, const char *t, size_t tl) Err bitreich.org 70 i { Err bitreich.org 70 i if (stack_push(&st, t)){ Err bitreich.org 70 i- fprintf(stderr, "Error: stack full. Ignoring tag '%s' (parent tag: '%s')\n", t, stack_peek(&st)); Err bitreich.org 70 i+ fprintf(stderr, "Error: stack full. Ignoring tag '%s' (parent tag: '%s')\n", t, stack_peek(&st)->s); Err bitreich.org 70 i return; Err bitreich.org 70 i } Err bitreich.org 70 i putchar('\n'); Err bitreich.org 70 .