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);