tsv2agenda: add line wrapping - ics2txt - convert icalendar .ics file to plain text
 (HTM) git clone git://bitreich.org/ics2txt git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ics2txt
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Tags
 (DIR) README
       ---
 (DIR) commit d1604d44d1926ce38a94073ad8d55b2c8a99d172
 (DIR) parent 3b9f2bbdc0b786d3732555f8e7a001f40eaa59c6
 (HTM) Author: Josuah Demangeon <me@josuah.net>
       Date:   Fri, 25 Jun 2021 20:18:33 +0200
       
       tsv2agenda: add line wrapping
       
       Diffstat:
         M tsv2agenda.c                        |      50 ++++++++++++++++++++++++-------
       
       1 file changed, 39 insertions(+), 11 deletions(-)
       ---
 (DIR) diff --git a/tsv2agenda.c b/tsv2agenda.c
       @@ -106,20 +106,48 @@ print_header(AgendaCtx *ctx, struct tm *beg, struct tm *end, size_t *num)
        }
        
        static void
       -print_row(AgendaCtx *ctx, char *line, struct tm *beg, struct tm *end, size_t *num)
       +unescape(char const *s, char *d)
        {
       +        for (; *s != '\0'; s++) {
       +                if (*s == '\\') {
       +                        s++;
       +                        *d++ = (*s == 'n') ? '\n' : (*s == 't') ? ' ' : *s;
       +                } else {
       +                        if (*s == '\\')
       +                                debug("s='%c'", *s);
       +                        *d++ = *s;
       +                }
       +        }
       +        *d = '\0';
       +}
       +
       +static void
       +print_row(AgendaCtx *ctx, char *s, struct tm *beg, struct tm *end, size_t *num)
       +{
       +        unescape(s, s);
       +
                print_header(ctx, beg, end, num);
       -        for (char *cp = line; *cp != '\0'; cp++) {
       -                if (*cp == '\\') {
       -                        switch (*++cp) {
       -                        case 'n':
       -                                fputc('\n', stdout);
       -                                print_header(ctx, beg, end, num);
       -                                fputs(": ", stdout);
       -                                continue;
       -                        }
       +        for (size_t i, n = 0; *s != '\0'; s++) {
       +                switch (*s) {
       +                case '\n':
       +newline:
       +                        fputc('\n', stdout);
       +                        print_header(ctx, beg, end, num);
       +                        fputs(": ", stdout);
       +                        n = 0;
       +                        break;
       +                case ' ':
       +                case '\t':
       +                        i = strcspn(s + 1, " \t\n");
       +                        if (n + i > 70)
       +                                goto newline;
       +                        fputc(' ', stdout);
       +                        n++;
       +                        break;
       +                default:
       +                        fputc(*s, stdout);
       +                        n++;
                        }
       -                fputc(*cp, stdout);
                }
                fputc('\n', stdout);
        }