some fixes and improvements - xml2tsv - a simple xml-to-tsv converter, based on xmlparser
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Tags
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 5cb461a629973380fc58050bee2d8d893db7923d
 (DIR) parent 0fe049559d88b204e73332e205caa8c5936985d6
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Fri,  3 Jan 2020 16:37:46 +0100
       
       some fixes and improvements
       
       - print_no_cr: fix for modification of const buffer.
       - improve buffering of data handlers using the start and end handlers.
       - add XML entity conversion.
       - some white-space fixes.
       
       Diffstat:
         M xml2tsv.c                           |      47 ++++++++++++++++++++-----------
       
       1 file changed, 30 insertions(+), 17 deletions(-)
       ---
 (DIR) diff --git a/xml2tsv.c b/xml2tsv.c
       @@ -36,13 +36,13 @@ int stack_push(tstack_t *t, const char *c){
                        return 0;
                }
                return -1;
       -}        
       +}
        
        char* stack_pop(tstack_t *t){
                if (t->top >= 0)
                        return t->st[t->top--];
                return NULL;
       -} 
       +}
        
        char* stack_peek(tstack_t *t){
                if (t->top >= 0)
       @@ -61,17 +61,15 @@ void stack_init(tstack_t *t){
        
        /* utility functions */
        
       -void print_no_cr(FILE *f, const char *c){
       -        char *tmp = c;
       -        while (c != NULL){
       -                tmp = strchr(c, '\n');
       -                if (tmp != NULL)
       -                        *tmp = '\0';
       -                fprintf(f, "%s", c);
       -                if (tmp != NULL)
       -                        c = tmp + 1;
       -                else
       -                        c = NULL;
       +void print_no_cr(FILE *f, const char *s){
       +        const char *tmp = s;
       +        size_t len;
       +        while (*tmp != '\0'){
       +                len = strcspn(tmp, "\n");
       +                fwrite(tmp, 1, len, f);
       +                tmp += len;
       +                if (tmp[len] == '\n')
       +                        tmp++;
                }
        }
        
       @@ -93,14 +91,20 @@ void
        xmlattr(XMLParser *x, const char *t, size_t tl, const char *a, size_t al,
                const char *v, size_t vl)
        {
       -        printf("\t%s=%s", a, v);
       +        printf("%s", v);
        }
        
        void
        xmlattrentity(XMLParser *x, const char *t, size_t tl, const char *a, size_t al,
                      const char *v, size_t vl)
        {
       -        printf("attrentity: %s\n", a);
       +        char buf[16];
       +        int n;
       +
       +        if ((n = xml_entitytostr(v, buf, sizeof(buf))) > 0)
       +                xmlattr(x, t, tl, a, al, buf, (size_t)n);
       +        else
       +                xmlattr(x, t, tl, a, al, v, vl);
        }
        
        void
       @@ -111,17 +115,19 @@ xmlattrend(XMLParser *x, const char *t, size_t tl, const char *a, size_t al)
        void
        xmlattrstart(XMLParser *x, const char *t, size_t tl, const char *a, size_t al)
        {
       +        printf("\t%s=", a);
        }
        
        void
        xmlcdatastart(XMLParser *x)
        {
       +        printf("\t");
        }
        
        void
        xmlcdata(XMLParser *x, const char *d, size_t dl)
        {
       -        printf("\t%s", d);
       +        print_no_cr(stdout, d);
        }
        
        void
       @@ -147,7 +153,6 @@ xmlcommentend(XMLParser *x)
        void
        xmldata(XMLParser *x, const char *d, size_t dl)
        {
       -        printf("\t");
                print_no_cr(stdout, d);
        }
        
       @@ -159,11 +164,19 @@ xmldataend(XMLParser *x)
        void
        xmldataentity(XMLParser *x, const char *d, size_t dl)
        {
       +        char buf[16];
       +        int n;
       +
       +        if ((n = xml_entitytostr(d, buf, sizeof(buf))) > 0)
       +                xmldata(x, buf, (size_t)n);
       +        else
       +                xmldata(x, d, dl);
        }
        
        void
        xmldatastart(XMLParser *x)
        {
       +        printf("\t");
        }
        
        void