first mockup of conversion - ics2txt - convert icalendar .ics file to plain text | |
git clone git://bitreich.org/ics2txt git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws… | |
Log | |
Files | |
Refs | |
Tags | |
README | |
--- | |
commit 65778fa74c2e72ca67a8dc4f6c1f0021f8ce2de4 | |
parent 54ba66bb7b1b7eed7e3aaf60ef00c9ccc9cc65d6 | |
Author: Josuah Demangeon <[email protected]> | |
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(-) | |
--- | |
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 || | |
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); |