SMOLNET PORTAL home about changes
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
Original URLgopher://bitreich.org/0/scm/ics2txt/commit/d4d55c6876bf51...
Content-Typetext/plain; charset=utf-8