iadd tests and cleanup I/O function - 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 a7b4ceeaf4a57476c0952e0da2def5f92bdfdb9f /scm/ics2txt/commit/a7b4ceeaf4a57476c0952e0da2def5f92bdfdb9f.gph bitreich.org 70 1parent 94bccd0b9ea7049ebeec4fcf2416f6f0b7d221b5 /scm/ics2txt/commit/94bccd0b9ea7049ebeec4fcf2416f6f0b7d221b5.gph bitreich.org 70 hAuthor: Josuah Demangeon URL:mailto:me@josuah.net bitreich.org 70 iDate: Sun, 28 Jun 2020 10:34:46 +0200 Err bitreich.org 70 i Err bitreich.org 70 iadd tests and cleanup I/O function Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M ics2tsv.c | 7 +++++-- Err bitreich.org 70 i M src/ical.c | 72 +++++++++---------------------- Err bitreich.org 70 i M src/ical.h | 2 +- Err bitreich.org 70 i M src/map.c | 6 ++++++ Err bitreich.org 70 i M src/map.h | 1 + Err bitreich.org 70 i M src/util.c | 5 +++-- Err bitreich.org 70 i A test/map.c | 18 ++++++++++++++++++ Err bitreich.org 70 i A test/random-ics.awk | 40 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i Err bitreich.org 70 i8 files changed, 94 insertions(+), 57 deletions(-) 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@@ -1,4 +1,5 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i+#include 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@@ -8,17 +9,19 @@ int Err bitreich.org 70 i print_ical_to_tsv(FILE *fp) Err bitreich.org 70 i { Err bitreich.org 70 i struct ical_contentline contentline; Err bitreich.org 70 i- char *line = NULL; 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 Err bitreich.org 70 i ical_init_contentline(&contentline); Err bitreich.org 70 i Err bitreich.org 70 i- while ((r = ical_read_line(&line, &sz, fp)) > 0) { 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(&contentline, 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 } 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@@ -8,38 +8,28 @@ Err bitreich.org 70 i #include "util.h" Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i-ical_read_line(char **line, size_t *sz, FILE *fp) Err bitreich.org 70 i+ical_read_line(char **line, char **ln, size_t *sz, FILE *fp) Err bitreich.org 70 i { Err bitreich.org 70 i- ssize_t r; Err bitreich.org 70 i- char *tail = NULL; Err bitreich.org 70 i- size_t tail_sz = 0; Err bitreich.org 70 i- int c, ret = -1; Err bitreich.org 70 i+ int c; Err bitreich.org 70 i+ void *v; Err bitreich.org 70 i Err bitreich.org 70 i- if ((r = getline(line, sz, fp)) <= 0) Err bitreich.org 70 i- return r; Err bitreich.org 70 i- strchomp(*line); Err bitreich.org 70 i- Err bitreich.org 70 i- for (;;) { Err bitreich.org 70 i- if ((c = fgetc(fp)) == EOF) { Err bitreich.org 70 i- ret = ferror(fp) ? -1 : 0; Err bitreich.org 70 i- goto end; Err bitreich.org 70 i- } Err bitreich.org 70 i- if (c != ' ') Err bitreich.org 70 i- break; Err bitreich.org 70 i- if ((r = getline(&tail, &tail_sz, fp)) <= 0) { Err bitreich.org 70 i- ret = r; Err bitreich.org 70 i- goto end; Err bitreich.org 70 i- } Err bitreich.org 70 i- strchomp(tail); Err bitreich.org 70 i- if (strappend(line, tail) < 0) Err bitreich.org 70 i- goto end; Err bitreich.org 70 i- } Err bitreich.org 70 i+ if ((v = realloc(*line, 1)) == NULL) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ *line = v; Err bitreich.org 70 i+ (*line)[0] = '\0'; Err bitreich.org 70 i+ Err bitreich.org 70 i+ do { Err bitreich.org 70 i+ if (getline(ln, sz, fp) <= 0) Err bitreich.org 70 i+ return ferror(fp) ? -1 : 0; Err bitreich.org 70 i+ strchomp(*ln); Err bitreich.org 70 i+ if (strappend(line, *ln) < 0) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ if ((c = fgetc(fp)) == EOF) Err bitreich.org 70 i+ return ferror(fp) ? -1 : 1; Err bitreich.org 70 i+ } while (c == ' '); Err bitreich.org 70 i Err bitreich.org 70 i- ret = 1; Err bitreich.org 70 i-end: Err bitreich.org 70 i- free(tail); Err bitreich.org 70 i ungetc(c, fp); Err bitreich.org 70 i- return ret; Err bitreich.org 70 i+ return 1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i@@ -48,48 +38,26 @@ ical_parse_contentline(struct ical_contentline *contentline, char *line) Err bitreich.org 70 i char *column, *equal, *param, *cp; Err bitreich.org 70 i size_t sz; Err bitreich.org 70 i Err bitreich.org 70 i- debug("0"); Err bitreich.org 70 i- Err bitreich.org 70 i if ((column = strchr(line, ':')) == NULL) Err bitreich.org 70 i return -1; Err bitreich.org 70 i *column = '\0'; Err bitreich.org 70 i- Err bitreich.org 70 i- { Err bitreich.org 70 i- size_t len; Err bitreich.org 70 i- Err bitreich.org 70 i- debug("1.1"); Err bitreich.org 70 i- len = strlen(column + 1); Err bitreich.org 70 i- debug("1.2"); Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- Err bitreich.org 70 i if ((contentline->value = strdup(column + 1)) == NULL) Err bitreich.org 70 i return -1; Err bitreich.org 70 i Err bitreich.org 70 i- debug("2"); Err bitreich.org 70 i- Err bitreich.org 70 i- cp = strchr(line, ';'); Err bitreich.org 70 i- cp = (cp == NULL) ? (NULL) : (cp + 1); Err bitreich.org 70 i- Err bitreich.org 70 i- debug("3"); 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 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- Err bitreich.org 70 i if (map_set(&contentline->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- debug("4"); Err bitreich.org 70 i- Err bitreich.org 70 i sz = sizeof(contentline->name); Err bitreich.org 70 i if (strlcpy(contentline->name, line, sz) >= sz) Err bitreich.org 70 i return errno=EMSGSIZE, -1; Err bitreich.org 70 i Err bitreich.org 70 i- debug("5"); 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 1diff --git a/src/ical.h b/src/ical.h /scm/ics2txt/file/src/ical.h.gph bitreich.org 70 i@@ -17,7 +17,7 @@ struct ical_contentline { 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, size_t *sz, FILE *fp); 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 1diff --git a/src/map.c b/src/map.c /scm/ics2txt/file/src/map.c.gph bitreich.org 70 i@@ -87,6 +87,12 @@ map_del(struct map *map, char *key) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i+map_init(struct map *map) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ memset(map, 0, sizeof(*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 { Err bitreich.org 70 i for (size_t i = 0; i < map->len; 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@@ -17,6 +17,7 @@ struct map { Err bitreich.org 70 i 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 Err bitreich.org 70 1diff --git a/src/util.c b/src/util.c /scm/ics2txt/file/src/util.c.gph bitreich.org 70 i@@ -10,7 +10,8 @@ strlcpy(char *buf, char const *str, size_t sz) Err bitreich.org 70 i { Err bitreich.org 70 i size_t len, cpy; Err bitreich.org 70 i Err bitreich.org 70 i- cpy = ((len = strlen(str)) > sz) ? (sz) : (len); Err bitreich.org 70 i+ len = strlen(str); Err bitreich.org 70 i+ cpy = (len > sz) ? (sz) : (len); Err bitreich.org 70 i memcpy(buf, str, cpy + 1); Err bitreich.org 70 i buf[sz - 1] = '\0'; Err bitreich.org 70 i return len; Err bitreich.org 70 i@@ -54,7 +55,7 @@ strappend(char **base_p, char const *s) Err bitreich.org 70 i size_t base_len, s_len; Err bitreich.org 70 i void *v; Err bitreich.org 70 i Err bitreich.org 70 i- base_len = strlen(*base_p); Err bitreich.org 70 i+ base_len = (*base_p == NULL) ? (0) : (strlen(*base_p)); Err bitreich.org 70 i s_len = strlen(s); Err bitreich.org 70 i Err bitreich.org 70 i if ((v = realloc(*base_p, base_len + s_len + 1)) == NULL) Err bitreich.org 70 1diff --git a/test/map.c b/test/map.c /scm/ics2txt/file/test/map.c.gph bitreich.org 70 i@@ -0,0 +1,18 @@ Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i+#include "map.h" Err bitreich.org 70 i+ Err bitreich.org 70 i+int main(int argc, char **argv) { Err bitreich.org 70 i+ struct map map; Err bitreich.org 70 i+ Err bitreich.org 70 i+ memset(&map, 0, sizeof(map)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (argv++; *argv != NULL; argv++) Err bitreich.org 70 i+ if (map_set(&map, *argv, "abra") < 0) Err bitreich.org 70 i+ return 1; Err bitreich.org 70 i+ Err bitreich.org 70 i+ fprintf(stdout, "."); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 1diff --git a/test/random-ics.awk b/test/random-ics.awk /scm/ics2txt/file/test/random-ics.awk.gph bitreich.org 70 i@@ -0,0 +1,40 @@ Err bitreich.org 70 i+#!/usr/bin/awk -f Err bitreich.org 70 i+ Err bitreich.org 70 i+function random(n) { Err bitreich.org 70 i+ "exec od -An