iconvert some fields to time_t - ics2txt - convert icalendar .ics file to plain text Err bitreich.org 70 hgit clone git://bitreich.org/ics2txt git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ics2txt URL:git://bitreich.org/ics2txt git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ics2txt bitreich.org 70 1Log /scm/ics2txt/log.gph bitreich.org 70 1Files /scm/ics2txt/files.gph bitreich.org 70 1Refs /scm/ics2txt/refs.gph bitreich.org 70 1Tags /scm/ics2txt/tag bitreich.org 70 1README /scm/ics2txt/file/README.md.gph bitreich.org 70 i--- Err bitreich.org 70 1commit 54ba66bb7b1b7eed7e3aaf60ef00c9ccc9cc65d6 /scm/ics2txt/commit/54ba66bb7b1b7eed7e3aaf60ef00c9ccc9cc65d6.gph bitreich.org 70 1parent 58d91e5e80aea1ab98f675ccc4530f26a9659162 /scm/ics2txt/commit/58d91e5e80aea1ab98f675ccc4530f26a9659162.gph bitreich.org 70 hAuthor: Josuah Demangeon URL:mailto:me@josuah.net bitreich.org 70 iDate: Thu, 17 Jun 2021 01:35:05 +0200 Err bitreich.org 70 i Err bitreich.org 70 iconvert some fields to time_t Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M ical.c | 24 ++++++++++++------------ Err bitreich.org 70 i M ical.h | 6 +++--- Err bitreich.org 70 i M ics2tree.c | 8 ++++---- Err bitreich.org 70 i M ics2tsv.c | 69 ++++++++++++++++--------------- Err bitreich.org 70 i Err bitreich.org 70 i4 files changed, 55 insertions(+), 52 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/ical.c b/ical.c /scm/ics2txt/file/ical.c.gph bitreich.org 70 i@@ -93,7 +93,7 @@ ical_get_time(IcalParser *p, char *s, time_t *t) Err bitreich.org 70 i * permit to only have parsing code left to parsing functions */ Err bitreich.org 70 i Err bitreich.org 70 i static int Err bitreich.org 70 i-hook_entry_name(IcalParser *p, char *name) Err bitreich.org 70 i+hook_field_name(IcalParser *p, char *name) Err bitreich.org 70 i { Err bitreich.org 70 i (void)p; (void)name; Err bitreich.org 70 i return 0; Err bitreich.org 70 i@@ -119,7 +119,7 @@ hook_param_value(IcalParser *p, char *name, char *value) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static int Err bitreich.org 70 i-hook_entry_value(IcalParser *p, char *name, char *value) Err bitreich.org 70 i+hook_field_value(IcalParser *p, char *name, char *value) Err bitreich.org 70 i { Err bitreich.org 70 i if (strcasecmp(name, "TZID") == 0) Err bitreich.org 70 i if (strlcpy(p->current->tzid, value, sizeof p->current->tzid) >= Err bitreich.org 70 i@@ -144,9 +144,9 @@ hook_block_begin(IcalParser *p, char *name) Err bitreich.org 70 i Err bitreich.org 70 i for (int i = 0; ical_block_name[i] != NULL; i++) { Err bitreich.org 70 i if (strcasecmp(ical_block_name[i], name) == 0) { Err bitreich.org 70 i- if (p->block != ICAL_BLOCK_OTHER) Err bitreich.org 70 i+ if (p->blocktype != ICAL_BLOCK_OTHER) Err bitreich.org 70 i return ical_err(p, "BEGIN:V* in BEGIN:V*"); Err bitreich.org 70 i- p->block = i; Err bitreich.org 70 i+ p->blocktype = i; Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -164,9 +164,9 @@ hook_block_end(IcalParser *p, char *name) Err bitreich.org 70 i if (p->current < p->stack) Err bitreich.org 70 i return ical_err(p, "more END: than BEGIN:"); Err bitreich.org 70 i Err bitreich.org 70 i- if (ical_block_name[p->block] != NULL && Err bitreich.org 70 i- strcasecmp(ical_block_name[p->block], name) == 0) Err bitreich.org 70 i- p->block = ICAL_BLOCK_OTHER; Err bitreich.org 70 i+ if (ical_block_name[p->blocktype] != NULL && Err bitreich.org 70 i+ strcasecmp(ical_block_name[p->blocktype], name) == 0) Err bitreich.org 70 i+ p->blocktype = ICAL_BLOCK_OTHER; Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -241,8 +241,8 @@ ical_parse_contentline(IcalParser *p, char *s) Err bitreich.org 70 i return ical_err(p, "invalid property name"); Err bitreich.org 70 i c = *s, *s = '\0'; Err bitreich.org 70 i if (strcasecmp(name, "BEGIN") != 0 && strcasecmp(name, "END") != 0) Err bitreich.org 70 i- if ((err = hook_entry_name(p, name)) != 0 || Err bitreich.org 70 i- (err = CALL(p, fn_entry_name, name)) != 0) Err bitreich.org 70 i+ if ((err = hook_field_name(p, name)) != 0 || Err bitreich.org 70 i+ (err = CALL(p, fn_field_name, name)) != 0) Err bitreich.org 70 i return err; Err bitreich.org 70 i *s = c; Err bitreich.org 70 i sep = s; Err bitreich.org 70 i@@ -268,8 +268,8 @@ ical_parse_contentline(IcalParser *p, char *s) Err bitreich.org 70 i (err = CALL(p, fn_block_end, s)) != 0) Err bitreich.org 70 i return err; Err bitreich.org 70 i } else { Err bitreich.org 70 i- if ((err = hook_entry_value(p, name, s)) != 0 || Err bitreich.org 70 i- (err = CALL(p, fn_entry_value, name, s)) != 0) Err bitreich.org 70 i+ if ((err = hook_field_value(p, name, s)) != 0 || Err bitreich.org 70 i+ (err = CALL(p, fn_field_value, name, s)) != 0) Err bitreich.org 70 i return err; Err bitreich.org 70 i } Err bitreich.org 70 i return 0; Err bitreich.org 70 i@@ -312,7 +312,7 @@ ical_parse(IcalParser *p, FILE *fp) Err bitreich.org 70 i Err bitreich.org 70 i p->current = p->stack; Err bitreich.org 70 i p->linenum = 0; Err bitreich.org 70 i- p->block = ICAL_BLOCK_OTHER; Err bitreich.org 70 i+ p->blocktype = ICAL_BLOCK_OTHER; Err bitreich.org 70 i Err bitreich.org 70 i do { Err bitreich.org 70 i if ((l = ical_getline(&contentline, &line, &sz, fp)) < 0) { Err bitreich.org 70 1diff --git a/ical.h b/ical.h /scm/ics2txt/file/ical.h.gph bitreich.org 70 i@@ -25,10 +25,10 @@ struct IcalStack { Err bitreich.org 70 i Err bitreich.org 70 i struct IcalParser { Err bitreich.org 70 i /* function called while parsing in this order */ Err bitreich.org 70 i- int (*fn_entry_name)(IcalParser *, char *); Err bitreich.org 70 i+ int (*fn_field_name)(IcalParser *, char *); Err bitreich.org 70 i int (*fn_param_name)(IcalParser *, char *); Err bitreich.org 70 i int (*fn_param_value)(IcalParser *, char *, char *); Err bitreich.org 70 i- int (*fn_entry_value)(IcalParser *, char *, char *); Err bitreich.org 70 i+ int (*fn_field_value)(IcalParser *, char *, char *); Err bitreich.org 70 i int (*fn_block_begin)(IcalParser *, char *); Err bitreich.org 70 i int (*fn_block_end)(IcalParser *, char *); Err bitreich.org 70 i /* if returning non-zero then halt the parser */ Err bitreich.org 70 i@@ -37,7 +37,7 @@ struct IcalParser { Err bitreich.org 70 i char *errmsg; Err bitreich.org 70 i size_t linenum; Err bitreich.org 70 i char *tzid; Err bitreich.org 70 i- IcalBlock block; Err bitreich.org 70 i+ IcalBlock blocktype; Err bitreich.org 70 i IcalStack stack[ICAL_STACK_SIZE], *current; Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 1diff --git a/ics2tree.c b/ics2tree.c /scm/ics2txt/file/ics2tree.c.gph bitreich.org 70 i@@ -14,7 +14,7 @@ print_ruler(int level) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static int Err bitreich.org 70 i-fn_entry_name(IcalParser *p, char *name) Err bitreich.org 70 i+fn_field_name(IcalParser *p, char *name) Err bitreich.org 70 i { Err bitreich.org 70 i print_ruler(ical_get_level(p)); Err bitreich.org 70 i printf("name %s\n", name); Err bitreich.org 70 i@@ -41,7 +41,7 @@ fn_param_value(IcalParser *p, char *name, char *value) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static int Err bitreich.org 70 i-fn_entry_value(IcalParser *p, char *name, char *value) Err bitreich.org 70 i+fn_field_value(IcalParser *p, char *name, char *value) Err bitreich.org 70 i { Err bitreich.org 70 i size_t len; Err bitreich.org 70 i (void)name; Err bitreich.org 70 i@@ -69,10 +69,10 @@ main(int argc, char **argv) Err bitreich.org 70 i IcalParser p = {0}; Err bitreich.org 70 i arg0 = *argv++; Err bitreich.org 70 i Err bitreich.org 70 i- p.fn_entry_name = fn_entry_name; Err bitreich.org 70 i+ p.fn_field_name = fn_field_name; Err bitreich.org 70 i p.fn_block_begin = fn_block_begin; Err bitreich.org 70 i p.fn_param_value = fn_param_value; Err bitreich.org 70 i- p.fn_entry_value = fn_entry_value; Err bitreich.org 70 i+ p.fn_field_value = fn_field_value; Err bitreich.org 70 i Err bitreich.org 70 i if (*argv == NULL) { Err bitreich.org 70 i if (ical_parse(&p, stdin) < 0) Err bitreich.org 70 1diff --git a/ics2tsv.c b/ics2tsv.c /scm/ics2txt/file/ics2tsv.c.gph bitreich.org 70 i@@ -1,3 +1,4 @@ Err bitreich.org 70 i+#include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i@@ -8,25 +9,18 @@ Err bitreich.org 70 i Err bitreich.org 70 i #define FIELDS_MAX 64 Err bitreich.org 70 i Err bitreich.org 70 i-typedef struct Event Event; Err bitreich.org 70 i+typedef struct Field Field; Err bitreich.org 70 i+typedef struct Block Block; Err bitreich.org 70 i Err bitreich.org 70 i-struct Event { Err bitreich.org 70 i+struct Block { Err bitreich.org 70 i time_t beg, end; Err bitreich.org 70 i char *fields[FIELDS_MAX]; Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i-static char *fields_time[] = { Err bitreich.org 70 i- "DTSTART", "DTEND", "DTSTAMP", "DUE", "EXDATE", "RDATE" Err bitreich.org 70 i-}; Err bitreich.org 70 i- Err bitreich.org 70 i-static char *fields_default[] = { Err bitreich.org 70 i- "ATTENDEE", "CATEGORY", "DESCRIPTION", "LOCATION", "SUMMARY", "URL" Err bitreich.org 70 i-}; Err bitreich.org 70 i- Err bitreich.org 70 i-static char **fields = fields_default; Err bitreich.org 70 i+Block block; Err bitreich.org 70 i Err bitreich.org 70 i static int Err bitreich.org 70 i-fn_entry_name(IcalParser *p, char *name) Err bitreich.org 70 i+fn_field_name(IcalParser *p, char *name) Err bitreich.org 70 i { Err bitreich.org 70 i printf("name %s\n", name); Err bitreich.org 70 i return 0; Err bitreich.org 70 i@@ -35,7 +29,14 @@ fn_entry_name(IcalParser *p, char *name) Err bitreich.org 70 i static int Err bitreich.org 70 i fn_block_begin(IcalParser *p, char *name) Err bitreich.org 70 i { Err bitreich.org 70 i- printf("begin %s\n", name); Err bitreich.org 70 i+ debug("begin %s\n", name); Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static int Err bitreich.org 70 i+fn_block_end(IcalParser *p, char *name) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ debug("end %s\n", name); Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -47,25 +48,26 @@ fn_param_value(IcalParser *p, char *name, char *value) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static int Err bitreich.org 70 i-fn_entry_value(IcalParser *p, char *name, char *value) Err bitreich.org 70 i+fn_field_value(IcalParser *p, char *name, char *value) Err bitreich.org 70 i { Err bitreich.org 70 i- size_t len; Err bitreich.org 70 i- (void)name; Err bitreich.org 70 i- Err bitreich.org 70 i- if (ical_get_value(p, value, &len) < 0) Err bitreich.org 70 i- return -1; Err bitreich.org 70 i- Err bitreich.org 70 i- if (strcasecmp(name, "DTSTART") == 0 || Err bitreich.org 70 i- strcasecmp(name, "DTSTAMP") == 0 || Err bitreich.org 70 i- strcasecmp(name, "DTEND") == 0) { Err bitreich.org 70 i- time_t t = 0; Err bitreich.org 70 i- if (ical_get_time(p, value, &t) != 0) Err bitreich.org 70 i- warn("%s: %s", p->errmsg, value); Err bitreich.org 70 i- printf("epoch %lld\n", t); Err bitreich.org 70 i- } else { Err bitreich.org 70 i- printf("value %s\n", value); Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i+ static char *fieldmap[][2] = { Err bitreich.org 70 i+ [ICAL_BLOCK_VEVENT] = { "DTSTART", "DTEND" }, Err bitreich.org 70 i+ [ICAL_BLOCK_VTODO] = { NULL, "DUE" }, Err bitreich.org 70 i+ [ICAL_BLOCK_VJOURNAL] = { "DTSTAMP", NULL }, Err bitreich.org 70 i+ [ICAL_BLOCK_VFREEBUSY] = { "DTSTART", "DTEND" }, Err bitreich.org 70 i+ [ICAL_BLOCK_VALARM] = { "DTSTART", NULL }, Err bitreich.org 70 i+ [ICAL_BLOCK_OTHER] = { NULL, NULL }, Err bitreich.org 70 i+ }; Err bitreich.org 70 i+ char *beg, *end; Err bitreich.org 70 i+ Err bitreich.org 70 i+ beg = fieldmap[p->blocktype][0]; Err bitreich.org 70 i+ if (beg != NULL && strcasecmp(name, beg) == 0) Err bitreich.org 70 i+ if (ical_get_time(p, value, &block.beg) != 0) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ end = fieldmap[p->blocktype][1]; Err bitreich.org 70 i+ if (end != NULL && strcasecmp(name, end) == 0) Err bitreich.org 70 i+ if (ical_get_time(p, value, &block.end) != 0) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -75,10 +77,11 @@ main(int argc, char **argv) Err bitreich.org 70 i IcalParser p = {0}; Err bitreich.org 70 i arg0 = *argv++; Err bitreich.org 70 i Err bitreich.org 70 i- p.fn_entry_name = fn_entry_name; Err bitreich.org 70 i+ p.fn_field_name = fn_field_name; Err bitreich.org 70 i p.fn_block_begin = fn_block_begin; Err bitreich.org 70 i+ p.fn_block_end = fn_block_end; Err bitreich.org 70 i p.fn_param_value = fn_param_value; Err bitreich.org 70 i- p.fn_entry_value = fn_entry_value; Err bitreich.org 70 i+ p.fn_field_value = fn_field_value; Err bitreich.org 70 i Err bitreich.org 70 i if (*argv == NULL) { Err bitreich.org 70 i if (ical_parse(&p, stdin) < 0) Err bitreich.org 70 .