first mockup of conversion - 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 65778fa74c2e72ca67a8dc4f6c1f0021f8ce2de4
 (DIR) parent 54ba66bb7b1b7eed7e3aaf60ef00c9ccc9cc65d6
 (HTM) Author: Josuah Demangeon <me@josuah.net>
       Date:   Thu, 17 Jun 2021 08:33:25 +0200
       
       first mockup of conversion
       
       Diffstat:
         M ical.c                              |      16 +++++++++++-----
         M ics2tsv.c                           |      16 ++++++++--------
       
       2 files changed, 19 insertions(+), 13 deletions(-)
       ---
 (DIR) diff --git a/ical.c b/ical.c
       @@ -154,16 +154,21 @@ hook_block_begin(IcalParser *p, char *name)
        }
        
        static int
       -hook_block_end(IcalParser *p, char *name)
       +hook_block_end_before(IcalParser *p, char *name)
        {
                if (p->current == p->stack)
                        return ical_err(p, "more END: than BEGIN:");
                if (strcasecmp(p->current->name, name) != 0)
                        return ical_err(p, "mismatching BEGIN: and END:");
       -        p->current--;
       -        if (p->current < p->stack)
       +        if (p->current <= p->stack)
                        return ical_err(p, "more END: than BEGIN:");
       +        return 0;
       +}
        
       +static int
       +hook_block_end_after(IcalParser *p, char *name)
       +{
       +        p->current--;
                if (ical_block_name[p->blocktype] != NULL &&
                    strcasecmp(ical_block_name[p->blocktype], name) == 0)
                        p->blocktype = ICAL_BLOCK_OTHER;
       @@ -264,8 +269,9 @@ ical_parse_contentline(IcalParser *p, char *s)
                            (err = CALL(p, fn_block_begin, s)) != 0)
                                return err;
                } else if (strcasecmp(name, "END") == 0) {
       -                if ((err = hook_block_end(p, s)) != 0 ||
       -                    (err = CALL(p, fn_block_end, s)) != 0)
       +                if ((err = hook_block_end_before(p, s)) != 0 ||
       +                    (err = CALL(p, fn_block_end, s)) != 0 ||
       +                    (err = hook_block_end_after(p, s)) != 0)
                                return err;
                } else {
                        if ((err = hook_field_value(p, name, s)) != 0 ||
 (DIR) diff --git a/ics2tsv.c b/ics2tsv.c
       @@ -22,28 +22,29 @@ Block block;
        static int
        fn_field_name(IcalParser *p, char *name)
        {
       -        printf("name %s\n", name);
                return 0;
        }
        
        static int
        fn_block_begin(IcalParser *p, char *name)
        {
       -        debug("begin %s\n", name);
       +        memset(&block, 0, sizeof block);
                return 0;
        }
        
        static int
        fn_block_end(IcalParser *p, char *name)
        {
       -        debug("end %s\n", name);
       +        if (p->blocktype == ICAL_BLOCK_OTHER)
       +                return 0;
       +        printf("%s\t%lld\t%lld", p->current->name, block.beg, block.end);
       +        printf("\n");
                return 0;
        }
        
        static int
        fn_param_value(IcalParser *p, char *name, char *value)
        {
       -        printf("param %s=%s\n", name, value);
                return 0;
        }
        
       @@ -84,16 +85,15 @@ main(int argc, char **argv)
                p.fn_field_value = fn_field_value;
        
                if (*argv == NULL) {
       +                debug("converting *stdin*");
                        if (ical_parse(&p, stdin) < 0)
       -                        err("parsing stdin:%d: %s", p.linenum, p.errmsg);
       +                        err("parsing *stdin*:%d: %s", p.linenum, p.errmsg);
                }
       -
                for (; *argv != NULL; argv++, argc--) {
                        FILE *fp;
       -
                        debug("converting \"%s\"", *argv);
                        if ((fp = fopen(*argv, "r")) == NULL)
       -                        err("opening %s", *argv);
       +                        err("opening %s: %s", *argv, strerror(errno));
                        if (ical_parse(&p, fp) < 0)
                                err("parsing %s:%d: %s", *argv, p.linenum, p.errmsg);
                        fclose(fp);