iadd a tool to print the tree of it - 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 d4d55c6876bf51dd555a0dbfae0316343d44997e /scm/ics2txt/commit/d4d55c6876bf51dd555a0dbfae0316343d44997e.gph bitreich.org 70
1parent 8248ba97aa609be30e0ecf481d93e59a9876afcd /scm/ics2txt/commit/8248ba97aa609be30e0ecf481d93e59a9876afcd.gph bitreich.org 70
hAuthor: Josuah Demangeon <me@josuah.net> URL:mailto:me@josuah.net bitreich.org 70
iDate: Sun, 28 Jun 2020 18:44:32 +0200 Err bitreich.org 70
i Err bitreich.org 70
iadd a tool to print the tree of it Err bitreich.org 70
i Err bitreich.org 70
iDiffstat: Err bitreich.org 70
i M .gitignore | 1 + Err bitreich.org 70
i M Makefile | 2 +- Err bitreich.org 70
i A ics2tree.c | 100 +++++++++++++++++++++++++++++++ Err bitreich.org 70
i M ics2tsv.c | 25 +++++++++---------------- Err bitreich.org 70
i M src/ical.c | 249 +++++++++++++++++++++++-------- Err bitreich.org 70
i M src/ical.h | 65 ++++++++++++++++++------------- Err bitreich.org 70
i M src/map.c | 16 +++++++++------- Err bitreich.org 70
i M src/map.h | 4 ++-- Err bitreich.org 70
i Err bitreich.org 70
i8 files changed, 348 insertions(+), 114 deletions(-) Err bitreich.org 70
i--- Err bitreich.org 70
1diff --git a/.gitignore b/.gitignore /scm/ics2txt/file/.gitignore.gph bitreich.org 70
i@@ -1,2 +1,3 @@ Err bitreich.org 70
i *.o Err bitreich.org 70
i ics2tsv Err bitreich.org 70
i+ics2tree Err bitreich.org 70
1diff --git a/Makefile b/Makefile /scm/ics2txt/file/Makefile.gph bitreich.org 70
i@@ -11,7 +11,7 @@ MANPREFIX = ${PREFIX}/man Err bitreich.org 70
i SRC = src/ical.c src/map.c src/util.c src/log.c Err bitreich.org 70
i HDR = src/ical.h src/map.h src/util.h src/log.h Err bitreich.org 70
i OBJ = ${SRC:.c=.o} Err bitreich.org 70
i-BIN = ics2tsv Err bitreich.org 70
i+BIN = ics2tsv ics2tree Err bitreich.org 70
i Err bitreich.org 70
i all: ${BIN} 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@@ -0,0 +1,100 @@ Err bitreich.org 70
i+#include <stdio.h> Err bitreich.org 70
i+#include <stdlib.h> Err bitreich.org 70
i+#include <string.h> Err bitreich.org 70
i+ Err bitreich.org 70
i+#include "ical.h" Err bitreich.org 70
i+#include "log.h" Err bitreich.org 70
i+#include "util.h" Err bitreich.org 70
i+ Err bitreich.org 70
i+void Err bitreich.org 70
i+print_ical_tree_param(struct map_entry *entry, int level) Err bitreich.org 70
i+{ Err bitreich.org 70
i+ if (entry == NULL) Err bitreich.org 70
i+ return; Err bitreich.org 70
i+ for (int i = 0; i < level; i++) Err bitreich.org 70
i+ printf(": "); Err bitreich.org 70
i+ fprintf(stdout, "param %s=%s\n", entry->key, (char *)entry->value); Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i+void Err bitreich.org 70
i+print_ical_tree_value(struct ical_value *value, int level) Err bitreich.org 70
i+{ Err bitreich.org 70
i+ if (value == NULL) Err bitreich.org 70
i+ return; Err bitreich.org 70
i+ for (int i = 0; i < level; i++) Err bitreich.org 70
i+ printf(": "); Err bitreich.org 70
i+ fprintf(stdout, "value %s:%s\n", value->name, value->value); Err bitreich.org 70
i+ for (size_t i = 0; i < value->param.len; i++) Err bitreich.org 70
i+ print_ical_tree_param(value->param.entry + i, level + 1); Err bitreich.org 70
i+ print_ical_tree_value(value->next, level); Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i+void Err bitreich.org 70
i+print_ical_tree_vnode(struct ical_vnode *node, int level) Err bitreich.org 70
i+{ Err bitreich.org 70
i+ if (node == NULL) Err bitreich.org 70
i+ return; Err bitreich.org 70
i+ for (int i = 0; i < level; i++) Err bitreich.org 70
i+ printf(": "); Err bitreich.org 70
i+ fprintf(stdout, "node %p %s child=%p next=%p\n", node, node->name, node->child, node->next); Err bitreich.org 70
i+ for (size_t i = 0; i < node->values.len; i++) Err bitreich.org 70
i+ print_ical_tree_value(node->values.entry[i].value, level + 1); Err bitreich.org 70
i+ print_ical_tree_vnode(node->child, level + 1); Err bitreich.org 70
i+ print_ical_tree_vnode(node->next, level); Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i+int Err bitreich.org 70
i+print_ical_tree(FILE *fp) Err bitreich.org 70
i+{ Err bitreich.org 70
i+ struct ical_vcalendar vcal; Err bitreich.org 70
i+ int e; Err bitreich.org 70
i+ Err bitreich.org 70
i+ if ((e = ical_read_vcalendar(&vcal, fp)) < 0) Err bitreich.org 70
i+ die("reading ical file: %s", ical_strerror(e)); Err bitreich.org 70
i+ Err bitreich.org 70
i+ print_ical_tree_vnode(vcal.root, 0); Err bitreich.org 70
i+ fprintf(stdout, ".\n"); Err bitreich.org 70
i+ fflush(stdout); Err bitreich.org 70
i+ Err bitreich.org 70
i+ ical_free_vcalendar(&vcal); Err bitreich.org 70
i+ return 0; Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i+void Err bitreich.org 70
i+print_header(void) Err bitreich.org 70
i+{ Err bitreich.org 70
i+ char *fields[] = { "", NULL }; Err bitreich.org 70
i+ Err bitreich.org 70
i+ printf("%s\t%s", "beg", "end"); Err bitreich.org 70
i+ Err bitreich.org 70
i+ for (char **f = fields; *f != NULL; f++) { Err bitreich.org 70
i+ fprintf(stdout, "\t%s", *f); Err bitreich.org 70
i+ } Err bitreich.org 70
i+ fprintf(stdout, "\n"); Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i+int Err bitreich.org 70
i+main(int argc, char **argv) Err bitreich.org 70
i+{ Err bitreich.org 70
i+ print_header(); Err bitreich.org 70
i+ Err bitreich.org 70
i+ log_arg0 = *argv++; Err bitreich.org 70
i+ Err bitreich.org 70
i+ if (*argv == NULL) { Err bitreich.org 70
i+ if (print_ical_tree(stdin) < 0) Err bitreich.org 70
i+ die("converting stdin"); Err bitreich.org 70
i+ } Err bitreich.org 70
i+ Err bitreich.org 70
i+ for (; *argv != NULL; argv++, argc--) { Err bitreich.org 70
i+ FILE *fp; Err bitreich.org 70
i+ Err bitreich.org 70
i+ info("converting \"%s\"", *argv); Err bitreich.org 70
i+ if ((fp = fopen(*argv, "r")) == NULL) Err bitreich.org 70
i+ die("opening %s", *argv); Err bitreich.org 70
i+ if (print_ical_tree(fp) < 0) Err bitreich.org 70
i+ die("converting %s", *argv); Err bitreich.org 70
i+ fclose(fp); Err bitreich.org 70
i+ } Err bitreich.org 70
i+ Err bitreich.org 70
i+ return 0; Err bitreich.org 70
i+} Err bitreich.org 70
1diff --git a/ics2tsv.c b/ics2tsv.c /scm/ics2txt/file/ics2tsv.c.gph bitreich.org 70
i@@ -7,23 +7,16 @@ Err bitreich.org 70
i #include "util.h" Err bitreich.org 70
i Err bitreich.org 70
i int Err bitreich.org 70
i-print_ical_to_tsv(FILE *fp) Err bitreich.org 70
i+print_ical_tsv(FILE *fp) Err bitreich.org 70
i { Err bitreich.org 70
i- struct ical_contentline cl; Err bitreich.org 70
i- char *line = NULL, *ln = NULL; Err bitreich.org 70
i- size_t sz = 0; Err bitreich.org 70
i- ssize_t r; Err bitreich.org 70
i+ struct ical_vcalendar vcal; Err bitreich.org 70
i+ int e; Err bitreich.org 70
i Err bitreich.org 70
i- memset(&cl, 0, sizeof cl); Err bitreich.org 70
i+ if ((e = ical_read_vcalendar(&vcal, fp)) < 0) Err bitreich.org 70
i+ die("reading ical file: %s", ical_strerror(e)); Err bitreich.org 70
i Err bitreich.org 70
i- while ((r = ical_read_line(&line, &ln, &sz, fp)) > 0) { Err bitreich.org 70
i- debug("readling line \"%s\"", line); Err bitreich.org 70
i- if (ical_parse_contentline(&cl, line) < 0) Err bitreich.org 70
i- die("parsing line \"%s\"", line); Err bitreich.org 70
i- } Err bitreich.org 70
i- free(line); Err bitreich.org 70
i- free(ln); Err bitreich.org 70
i- return r; Err bitreich.org 70
i+ ical_free_vcalendar(&vcal); Err bitreich.org 70
i+ return 0; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i void Err bitreich.org 70
i@@ -47,7 +40,7 @@ main(int argc, char **argv) Err bitreich.org 70
i log_arg0 = *argv++; Err bitreich.org 70
i Err bitreich.org 70
i if (*argv == NULL) { Err bitreich.org 70
i- if (print_ical_to_tsv(stdin) < 0) Err bitreich.org 70
i+ if (print_ical_tsv(stdin) < 0) Err bitreich.org 70
i die("converting stdin"); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i@@ -57,7 +50,7 @@ main(int argc, char **argv) Err bitreich.org 70
i info("converting \"%s\"", *argv); Err bitreich.org 70
i if ((fp = fopen(*argv, "r")) == NULL) Err bitreich.org 70
i die("opening %s", *argv); Err bitreich.org 70
i- if (print_ical_to_tsv(fp) < 0) Err bitreich.org 70
i+ if (print_ical_tsv(fp) < 0) Err bitreich.org 70
i die("converting %s", *argv); Err bitreich.org 70
i fclose(fp); Err bitreich.org 70
i } Err bitreich.org 70
1diff --git a/src/ical.c b/src/ical.c /scm/ics2txt/file/src/ical.c.gph bitreich.org 70
i@@ -9,8 +9,10 @@ Err bitreich.org 70
i Err bitreich.org 70
i #include "util.h" Err bitreich.org 70
i Err bitreich.org 70
i+enum ical_err ical_errno; Err bitreich.org 70
i+ Err bitreich.org 70
i int Err bitreich.org 70
i-ical_read_line(char **line, char **ln, size_t *sz, FILE *fp) Err bitreich.org 70
i+ical_getline(char **line, char **ln, size_t *sz, FILE *fp) Err bitreich.org 70
i { Err bitreich.org 70
i int c; Err bitreich.org 70
i void *v; Err bitreich.org 70
i@@ -35,113 +37,240 @@ ical_read_line(char **line, char **ln, size_t *sz, FILE *fp) Err bitreich.org 70
i return 1; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i+char * Err bitreich.org 70
i+ical_strerror(int i) Err bitreich.org 70
i+{ Err bitreich.org 70
i+ enum ical_err err = (i > 0) ? i : -i; Err bitreich.org 70
i+ Err bitreich.org 70
i+ switch (err) { Err bitreich.org 70
i+ case ICAL_ERR_OK: Err bitreich.org 70
i+ return "no error"; Err bitreich.org 70
i+ case ICAL_ERR_SYSTEM: Err bitreich.org 70
i+ return "system error"; Err bitreich.org 70
i+ case ICAL_ERR_END_MISMATCH: Err bitreich.org 70
i+ return "END: does not match its corresponding BEGIN:"; Err bitreich.org 70
i+ case ICAL_ERR_MISSING_BEGIN: Err bitreich.org 70
i+ return "unexpected content line before any BEGIN:"; Err bitreich.org 70
i+ case ICAL_ERR_MIN_NESTED: Err bitreich.org 70
i+ return "too many END: for the number of BEGIN:"; Err bitreich.org 70
i+ case ICAL_ERR_MAX_NESTED: Err bitreich.org 70
i+ return "maximum nesting level reached"; Err bitreich.org 70
i+ case ICAL_ERR_LENGTH: Err bitreich.org 70
i+ assert(!"used internally, should not happen"); Err bitreich.org 70
i+ } Err bitreich.org 70
i+ assert(!"unknown error code"); Err bitreich.org 70
i+ return "not a valid ical error code"; Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i+struct ical_value * Err bitreich.org 70
i+ical_new_value(char const *line) Err bitreich.org 70
i+{ Err bitreich.org 70
i+ struct ical_value *new; Err bitreich.org 70
i+ size_t len; Err bitreich.org 70
i+ Err bitreich.org 70
i+ len = strlen(line); Err bitreich.org 70
i+ if ((new = calloc(1, sizeof *new + len + 1)) == NULL) Err bitreich.org 70
i+ return NULL; Err bitreich.org 70
i+ memcpy(new->buf, line, len + 1); Err bitreich.org 70
i+ return new; Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i+void Err bitreich.org 70
i+ical_free_value(struct ical_value *value) Err bitreich.org 70
i+{ Err bitreich.org 70
i+ debug("free value %p (%s:%s)", value, value->name, value->value); Err bitreich.org 70
i+ map_free(&value->param, free); Err bitreich.org 70
i+ free(value); Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i int Err bitreich.org 70
i-ical_parse_contentline(struct ical_contentline *cl, char *line) Err bitreich.org 70
i+ical_parse_value(struct ical_value *value) Err bitreich.org 70
i { Err bitreich.org 70
i char *column, *equal, *param, *cp; Err bitreich.org 70
i- size_t sz; Err bitreich.org 70
i int e = errno; Err bitreich.org 70
i Err bitreich.org 70
i- if ((column = strchr(line, ':')) == NULL) Err bitreich.org 70
i+ value->name = value->buf; Err bitreich.org 70
i+ Err bitreich.org 70
i+ if ((column = strchr(value->buf, ':')) == NULL) Err bitreich.org 70
i return -1; Err bitreich.org 70
i *column = '\0'; Err bitreich.org 70
i- if ((cl->value = strdup(column + 1)) == NULL) Err bitreich.org 70
i- return -1; Err bitreich.org 70
i+ value->value = column + 1; Err bitreich.org 70
i Err bitreich.org 70
i- if ((cp = strchr(line, ';')) != NULL) Err bitreich.org 70
i- cp++; Err bitreich.org 70
i+ if ((cp = strchr(value->buf, ';')) != NULL) Err bitreich.org 70
i+ *cp++ = '\0'; Err bitreich.org 70
i while ((param = strsep(&cp, ";")) != NULL) { Err bitreich.org 70
i if ((equal = strchr(param, '=')) == NULL) Err bitreich.org 70
i return -1; Err bitreich.org 70
i *equal = '\0'; Err bitreich.org 70
i- if (map_set(&cl->param, param, equal + 1) < 0) Err bitreich.org 70
i+ if (map_set(&value->param, param, equal + 1) < 0) Err bitreich.org 70
i return -1; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i- sz = sizeof cl->name; Err bitreich.org 70
i- if (strlcpy(cl->name, line, sz) >= sz) Err bitreich.org 70
i- return errno=EMSGSIZE, -1; Err bitreich.org 70
i- Err bitreich.org 70
i assert(errno == e); Err bitreich.org 70
i return 0; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i-int Err bitreich.org 70
i-ical_parse_tzid(struct ical_value *value, struct ical_contentline *cl) Err bitreich.org 70
i+struct ical_vnode * Err bitreich.org 70
i+ical_new_vnode(char const *name) Err bitreich.org 70
i { Err bitreich.org 70
i- return 0; Err bitreich.org 70
i+ struct ical_vnode *new; Err bitreich.org 70
i+ size_t sz; Err bitreich.org 70
i+ Err bitreich.org 70
i+ if ((new = calloc(1, sizeof *new)) == NULL) Err bitreich.org 70
i+ return NULL; Err bitreich.org 70
i+ sz = sizeof new->name; Err bitreich.org 70
i+ if (strlcpy(new->name, name, sz) >= sz) { Err bitreich.org 70
i+ errno = EMSGSIZE; Err bitreich.org 70
i+ goto err; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ return new; Err bitreich.org 70
i+err: Err bitreich.org 70
i+ ical_free_vnode(new); Err bitreich.org 70
i+ return NULL; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i-int Err bitreich.org 70
i-ical_parse_date(struct ical_value *value, struct ical_contentline *cl) Err bitreich.org 70
i+static void Err bitreich.org 70
i+ical_free_vnode_value(void *v) Err bitreich.org 70
i { Err bitreich.org 70
i- return 0; Err bitreich.org 70
i+ ical_free_value(v); Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i+void Err bitreich.org 70
i+ical_free_vnode(struct ical_vnode *node) Err bitreich.org 70
i+{ Err bitreich.org 70
i+ if (node == NULL) Err bitreich.org 70
i+ return; Err bitreich.org 70
i+ debug("free vnode %p %s", node, node->name); Err bitreich.org 70
i+ map_free(&node->values, ical_free_vnode_value); Err bitreich.org 70
i+ ical_free_vnode(node->child); Err bitreich.org 70
i+ ical_free_vnode(node->next); Err bitreich.org 70
i+ free(node); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i int Err bitreich.org 70
i-ical_parse_attribute(struct ical_value *value, struct ical_contentline *cl) Err bitreich.org 70
i+ical_push_nested(struct ical_vcalendar *vcal, struct ical_vnode *new) Err bitreich.org 70
i { Err bitreich.org 70
i+ struct ical_vnode **node; Err bitreich.org 70
i+ Err bitreich.org 70
i+ node = vcal->nested; Err bitreich.org 70
i+ for (int i = 0; *node != NULL; node++, i++) { Err bitreich.org 70
i+ if (i >= ICAL_NESTED_MAX) Err bitreich.org 70
i+ return -ICAL_ERR_MAX_NESTED; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ node[0] = new; Err bitreich.org 70
i+ node[1] = NULL; Err bitreich.org 70
i return 0; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i+struct ical_vnode * Err bitreich.org 70
i+ical_pop_nested(struct ical_vcalendar *vcal) Err bitreich.org 70
i+{ Err bitreich.org 70
i+ struct ical_vnode **node, **prev = vcal->nested, *old; Err bitreich.org 70
i+ Err bitreich.org 70
i+ for (prev = node = vcal->nested; *node != NULL; node++) { Err bitreich.org 70
i+ vcal->current = *prev; Err bitreich.org 70
i+ prev = node; Err bitreich.org 70
i+ old = *node; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ *prev = NULL; Err bitreich.org 70
i+ if (vcal->nested[0] == NULL) Err bitreich.org 70
i+ vcal->current = NULL; Err bitreich.org 70
i+ return old; Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i int Err bitreich.org 70
i ical_begin_vnode(struct ical_vcalendar *vcal, char const *name) Err bitreich.org 70
i { Err bitreich.org 70
i- if (strcasecmp(name, "VCALENDAR")) Err bitreich.org 70
i- return 0; Err bitreich.org 70
i- return -1; Err bitreich.org 70
i+ struct ical_vnode *new; Err bitreich.org 70
i+ int e; Err bitreich.org 70
i+ Err bitreich.org 70
i+ if ((new = ical_new_vnode(name)) == NULL) Err bitreich.org 70
i+ return -ICAL_ERR_SYSTEM; Err bitreich.org 70
i+ if ((e = ical_push_nested(vcal, new)) < 0) Err bitreich.org 70
i+ goto err; Err bitreich.org 70
i+ if (vcal->root == NULL) { Err bitreich.org 70
i+ vcal->root = new; Err bitreich.org 70
i+ vcal->current = new; Err bitreich.org 70
i+ } else { Err bitreich.org 70
i+ new->next = vcal->current->child; Err bitreich.org 70
i+ vcal->current->child = new; Err bitreich.org 70
i+ vcal->current = new; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ return 0; Err bitreich.org 70
i+err: Err bitreich.org 70
i+ ical_free_vnode(new); Err bitreich.org 70
i+ return e; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i int Err bitreich.org 70
i ical_end_vnode(struct ical_vcalendar *vcal, char const *name) Err bitreich.org 70
i { Err bitreich.org 70
i- if (strcasecmp(name, "VCALENDAR")) Err bitreich.org 70
i- return 0; Err bitreich.org 70
i- return -1; Err bitreich.org 70
i+ struct ical_vnode *old; Err bitreich.org 70
i+ Err bitreich.org 70
i+ if ((old = ical_pop_nested(vcal)) == NULL) Err bitreich.org 70
i+ return -ICAL_ERR_MIN_NESTED; Err bitreich.org 70
i+ if (strcasecmp(name, old->name) != 0) Err bitreich.org 70
i+ return -ICAL_ERR_END_MISMATCH; Err bitreich.org 70
i+ return 0; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i int Err bitreich.org 70
i-ical_add_contentline(struct ical_vcalendar *vcal, struct ical_contentline *cl) Err bitreich.org 70
i+ical_push_value(struct ical_vcalendar *vcal, struct ical_value *new) Err bitreich.org 70
i { Err bitreich.org 70
i- struct ical_value value_buf, *value = &value_buf; Err bitreich.org 70
i- int i; Err bitreich.org 70
i- struct { Err bitreich.org 70
i- char *name; Err bitreich.org 70
i- enum ical_value_type type; Err bitreich.org 70
i- int (*fn)(struct ical_value *, struct ical_contentline *); Err bitreich.org 70
i- } map[] = { Err bitreich.org 70
i- { "DTSTART", ICAL_VALUE_TIME, ical_parse_date }, Err bitreich.org 70
i- { "DTEND", ICAL_VALUE_TIME, ical_parse_date }, Err bitreich.org 70
i- { "TZID", ICAL_VALUE_TIME, ical_parse_tzid }, Err bitreich.org 70
i- { NULL, ICAL_VALUE_ATTRIBUTE, ical_parse_attribute }, Err bitreich.org 70
i- }; Err bitreich.org 70
i- Err bitreich.org 70
i- if (strcasecmp(cl->name, "BEGIN") == 0) Err bitreich.org 70
i- return ical_begin_vnode(vcal, cl->value); Err bitreich.org 70
i- Err bitreich.org 70
i- if (strcasecmp(cl->name, "END") == 0) Err bitreich.org 70
i- return ical_end_vnode(vcal, cl->value); Err bitreich.org 70
i- Err bitreich.org 70
i- memset(value, 0, sizeof *value); Err bitreich.org 70
i- Err bitreich.org 70
i- for (i = 0; map[i].name == NULL; i++) Err bitreich.org 70
i- if (strcasecmp(cl->name, map[i].name) == 0) Err bitreich.org 70
i- break; Err bitreich.org 70
i- value->type = map[i].type; Err bitreich.org 70
i- if (map[i].fn(value, cl) < 0) Err bitreich.org 70
i- return -1; Err bitreich.org 70
i+ if (strcasecmp(new->name, "BEGIN") == 0) { Err bitreich.org 70
i+ int e = ical_begin_vnode(vcal, new->value); Err bitreich.org 70
i+ ical_free_value(new); Err bitreich.org 70
i+ return e; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ if (strcasecmp(new->name, "END") == 0) { Err bitreich.org 70
i+ int e = ical_end_vnode(vcal, new->value); Err bitreich.org 70
i+ ical_free_value(new); Err bitreich.org 70
i+ return e; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ Err bitreich.org 70
i+ if (vcal->current == NULL) Err bitreich.org 70
i+ return -ICAL_ERR_MISSING_BEGIN; Err bitreich.org 70
i+ Err bitreich.org 70
i+ debug("new %p %s:%s", new, new->name, new->value); Err bitreich.org 70
i+ new->next = map_get(&vcal->current->values, new->name); Err bitreich.org 70
i+ if (map_set(&vcal->current->values, new->name, new) < 0) Err bitreich.org 70
i+ return -ICAL_ERR_SYSTEM; Err bitreich.org 70
i+ Err bitreich.org 70
i return 0; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i-void Err bitreich.org 70
i-ical_free_value(struct ical_value *value) Err bitreich.org 70
i+int Err bitreich.org 70
i+ical_read_vcalendar(struct ical_vcalendar *vcal, FILE *fp) Err bitreich.org 70
i { Err bitreich.org 70
i- ; Err bitreich.org 70
i+ char *line = NULL, *ln = NULL; Err bitreich.org 70
i+ size_t sz = 0; Err bitreich.org 70
i+ ssize_t r; Err bitreich.org 70
i+ int e; Err bitreich.org 70
i+ Err bitreich.org 70
i+ memset(vcal, 0, sizeof *vcal); Err bitreich.org 70
i+ Err bitreich.org 70
i+ while ((r = ical_getline(&line, &ln, &sz, fp)) > 0) { Err bitreich.org 70
i+ struct ical_value *new; Err bitreich.org 70
i+ Err bitreich.org 70
i+ if ((new = ical_new_value(line)) == NULL) { Err bitreich.org 70
i+ e = -ICAL_ERR_SYSTEM; Err bitreich.org 70
i+ goto err; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ if ((e = ical_parse_value(new)) < 0) Err bitreich.org 70
i+ goto err; Err bitreich.org 70
i+ if ((e = ical_push_value(vcal, new)) < 0) Err bitreich.org 70
i+ goto err; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ e = (r == 0) ? 0 : -ICAL_ERR_SYSTEM; Err bitreich.org 70
i+err: Err bitreich.org 70
i+ free(line); Err bitreich.org 70
i+ free(ln); Err bitreich.org 70
i+ return e; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i void Err bitreich.org 70
i-ical_free_contentline(struct ical_contentline *cl) Err bitreich.org 70
i+ical_free_vcalendar(struct ical_vcalendar *vcal) Err bitreich.org 70
i { Err bitreich.org 70
i- map_free(&cl->param); Err bitreich.org 70
i- free(cl->value); Err bitreich.org 70
i+ debug("free vcalendar"); Err bitreich.org 70
i+ ical_free_vnode(vcal->root); Err bitreich.org 70
i } Err bitreich.org 70
1diff --git a/src/ical.h b/src/ical.h /scm/ics2txt/file/src/ical.h.gph bitreich.org 70
i@@ -6,36 +6,25 @@ Err bitreich.org 70
i Err bitreich.org 70
i #include "map.h" Err bitreich.org 70
i Err bitreich.org 70
i-#define ICAL_NEST_MAX 4 Err bitreich.org 70
i+#define ICAL_NESTED_MAX 4 Err bitreich.org 70
i Err bitreich.org 70
i-/* */ Err bitreich.org 70
i+enum ical_err { Err bitreich.org 70
i+ ICAL_ERR_OK, Err bitreich.org 70
i+ ICAL_ERR_SYSTEM, Err bitreich.org 70
i+ ICAL_ERR_END_MISMATCH, Err bitreich.org 70
i+ ICAL_ERR_MISSING_BEGIN, Err bitreich.org 70
i+ ICAL_ERR_MIN_NESTED, Err bitreich.org 70
i+ ICAL_ERR_MAX_NESTED, Err bitreich.org 70
i Err bitreich.org 70
i-struct ical_contentline { Err bitreich.org 70
i- char name[32], *value; Err bitreich.org 70
i- struct map param; Err bitreich.org 70
i-}; Err bitreich.org 70
i- Err bitreich.org 70
i-/* single value for an iCalendar element attribute */ Err bitreich.org 70
i- Err bitreich.org 70
i-enum ical_value_type { Err bitreich.org 70
i- ICAL_VALUE_TIME, ICAL_VALUE_ATTRIBUTE, Err bitreich.org 70
i-} type; Err bitreich.org 70
i- Err bitreich.org 70
i-union ical_value_union { Err bitreich.org 70
i- time_t *time; Err bitreich.org 70
i- char *str; Err bitreich.org 70
i-}; Err bitreich.org 70
i- Err bitreich.org 70
i-struct ical_value { Err bitreich.org 70
i- enum ical_value_type type; Err bitreich.org 70
i- union ical_value_union value; Err bitreich.org 70
i+ ICAL_ERR_LENGTH, Err bitreich.org 70
i }; Err bitreich.org 70
i Err bitreich.org 70
i /* global propoerties for an iCalendar document as well as parsing state */ Err bitreich.org 70
i Err bitreich.org 70
i struct ical_vcalendar { Err bitreich.org 70
i time_t tzid; Err bitreich.org 70
i- char *stack[ICAL_NEST_MAX + 1]; Err bitreich.org 70
i+ struct ical_vnode *root; Err bitreich.org 70
i+ struct ical_vnode *nested[ICAL_NESTED_MAX + 1]; Err bitreich.org 70
i struct ical_vnode *current; Err bitreich.org 70
i }; Err bitreich.org 70
i Err bitreich.org 70
i@@ -44,14 +33,34 @@ struct ical_vcalendar { Err bitreich.org 70
i struct ical_vnode { Err bitreich.org 70
i char name[32]; Err bitreich.org 70
i time_t beg, end; Err bitreich.org 70
i- struct map properties; /* struct ical_value */ Err bitreich.org 70
i- struct ical_vnode *child, *next; Err bitreich.org 70
i+ struct map values; /*(struct ical_value *)*/ Err bitreich.org 70
i+ struct ical_vnode *child; Err bitreich.org 70
i+ struct ical_vnode *next; Err bitreich.org 70
i+}; Err bitreich.org 70
i+ Err bitreich.org 70
i+/* one line whith the whole content unfolded */ Err bitreich.org 70
i+ Err bitreich.org 70
i+struct ical_value { Err bitreich.org 70
i+ char *name, *value; Err bitreich.org 70
i+ struct map param; Err bitreich.org 70
i+ struct ical_value *next; Err bitreich.org 70
i+ char buf[]; Err bitreich.org 70
i }; Err bitreich.org 70
i Err bitreich.org 70
i /** src/ical.c **/ Err bitreich.org 70
i-int ical_read_line(char **line, char **ln, size_t *sz, FILE *fp); Err bitreich.org 70
i-int ical_parse_contentline(struct ical_contentline *contentline, char *line); Err bitreich.org 70
i-void ical_init_contentline(struct ical_contentline *contentline); Err bitreich.org 70
i-void ical_free_contentline(struct ical_contentline *contentline); Err bitreich.org 70
i+int ical_getline(char **line, char **ln, size_t *sz, FILE *fp); Err bitreich.org 70
i+char * ical_strerror(int i); Err bitreich.org 70
i+struct ical_value * ical_new_value(char const *line); Err bitreich.org 70
i+void ical_free_value(struct ical_value *value); Err bitreich.org 70
i+int ical_parse_value(struct ical_value *value); Err bitreich.org 70
i+struct ical_vnode * ical_new_vnode(char const *name); Err bitreich.org 70
i+void ical_free_vnode(struct ical_vnode *node); Err bitreich.org 70
i+int ical_push_nested(struct ical_vcalendar *vcal, struct ical_vnode *new); Err bitreich.org 70
i+struct ical_vnode * ical_pop_nested(struct ical_vcalendar *vcal); Err bitreich.org 70
i+int ical_begin_vnode(struct ical_vcalendar *vcal, char const *name); Err bitreich.org 70
i+int ical_end_vnode(struct ical_vcalendar *vcal, char const *name); Err bitreich.org 70
i+int ical_push_value(struct ical_vcalendar *vcal, struct ical_value *new); Err bitreich.org 70
i+void ical_free_vcalendar(struct ical_vcalendar *vcal); Err bitreich.org 70
i+int ical_read_vcalendar(struct ical_vcalendar *vcal, FILE *fp); Err bitreich.org 70
i Err bitreich.org 70
i #endif Err bitreich.org 70
1diff --git a/src/map.c b/src/map.c /scm/ics2txt/file/src/map.c.gph bitreich.org 70
i@@ -54,8 +54,7 @@ map_set(struct map *map, char *key, void *value) Err bitreich.org 70
i for (; e >= insert; e--) Err bitreich.org 70
i e[1].key = e[0].key; Err bitreich.org 70
i Err bitreich.org 70
i- if ((insert->key = strdup(key)) == NULL) Err bitreich.org 70
i- return -1; Err bitreich.org 70
i+ insert->key = key; Err bitreich.org 70
i insert->value = value; Err bitreich.org 70
i Err bitreich.org 70
i return 0; Err bitreich.org 70
i@@ -90,16 +89,19 @@ map_init(struct map *map) Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i void Err bitreich.org 70
i-map_free_values(struct map *map) Err bitreich.org 70
i+map_free_keys(struct map *map) Err bitreich.org 70
i { Err bitreich.org 70
i for (size_t i = 0; i < map->len; i++) Err bitreich.org 70
i- free(map->entry[map->len - 1].value); Err bitreich.org 70
i+ free(map->entry[i].key); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i void Err bitreich.org 70
i-map_free(struct map *map) Err bitreich.org 70
i+map_free(struct map *map, void (*fn)(void *)) Err bitreich.org 70
i { Err bitreich.org 70
i- for (size_t i = 0; i < map->len; i++) Err bitreich.org 70
i- free(map->entry[map->len - 1].key); Err bitreich.org 70
i+ if (fn != NULL) { Err bitreich.org 70
i+ for (size_t i = 0; i < map->len; i++) Err bitreich.org 70
i+ fn(map->entry[i].value); Err bitreich.org 70
i+ } Err bitreich.org 70
i free(map->entry); Err bitreich.org 70
i+ map->len = 0; Err bitreich.org 70
i } Err bitreich.org 70
1diff --git a/src/map.h b/src/map.h /scm/ics2txt/file/src/map.h.gph bitreich.org 70
i@@ -18,7 +18,7 @@ void * map_get(struct map *map, char *key); Err bitreich.org 70
i int map_set(struct map *map, char *key, void *value); Err bitreich.org 70
i int map_del(struct map *map, char *key); Err bitreich.org 70
i void map_init(struct map *map); Err bitreich.org 70
i-void map_free_values(struct map *map); Err bitreich.org 70
i-void map_free(struct map *map); Err bitreich.org 70
i+void map_free_keys(struct map *map); Err bitreich.org 70
i+void map_free(struct map *map, void (*fn)(void *)); Err bitreich.org 70
i Err bitreich.org 70
i #endif Err bitreich.org 70
.
Response:
text/plain