first mockup of conversion - ics2txt - convert icalendar .ics file to plain text HTML 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 HTML 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);