remove control chars - xml2tsv - a simple xml-to-tsv converter, based on xmlparser
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Tags
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 302088dbb8f0eb6bca0c3d97bb2066bad3d5d4c5
 (DIR) parent 90c501f47d0a32cedca9a4ea27fbe27be9fb3be4
 (HTM) Author: KatolaZ <katolaz@freaknet.org>
       Date:   Sun,  5 Jan 2020 06:54:03 +0000
       
       remove control chars
       
       Diffstat:
         M xml2tsv.c                           |      38 ++++++++++++++++++++-----------
       
       1 file changed, 25 insertions(+), 13 deletions(-)
       ---
 (DIR) diff --git a/xml2tsv.c b/xml2tsv.c
       @@ -14,6 +14,7 @@
        
        #include <stdio.h>
        #include <string.h>
       +#include <ctype.h>
        
        #include "xml.h"
        #include "config.h"
       @@ -58,26 +59,37 @@ void stack_init(tstack_t *t){
        
        /* utility functions */
        
       +/* quote_print: quote \\, \n, \t, and strip other ctrl chars */
        void quote_print(FILE *f, const char *s){
                const char *tmp = s;
                size_t len;
       +        int i;
                while (*tmp != '\0'){
                        len = strcspn(tmp, "\\\n\t");
       -                fwrite(tmp, 1, len, f);
       -                tmp += len;
       -                if (*tmp == '\n'){
       -                        if (len > 0){
       -                                fprintf(f, "\\n");
       +                for(i=0; i<len; i++, tmp++){
       +                        if (!iscntrl((unsigned char)*tmp)){
       +                                fwrite(tmp, 1, 1, f);
                                }
       -                        tmp ++;
       -                }
       -                else if (*tmp == '\t'){
       -                        fprintf(f, "\\t");
       -                        tmp ++;
                        }
       -                else if (*tmp == '\\'){
       -                        fprintf(f, "\\\\");
       -                        tmp ++;
       +                switch (*tmp){
       +                        case '\n':
       +                                if (len > 0){
       +                                        fprintf(f, "\\n");
       +                                }
       +                                tmp ++;
       +                                break;
       +                        case '\t':
       +                                fprintf(f, "\\t");
       +                                tmp ++;
       +                                break;
       +                        case '\r':
       +                                fprintf(f, "\\r");
       +                                tmp ++;
       +                                break;
       +                        case '\\':
       +                                fprintf(f, "\\\\");
       +                                tmp ++;
       +                                break;
                        }
                }
        }