ilet user choose extra fields to print and custom date formats - 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 8894359aa6ad4ccc485901a8af9db03d1a2b4d5f /scm/ics2txt/commit/8894359aa6ad4ccc485901a8af9db03d1a2b4d5f.gph bitreich.org 70
1parent 65778fa74c2e72ca67a8dc4f6c1f0021f8ce2de4 /scm/ics2txt/commit/65778fa74c2e72ca67a8dc4f6c1f0021f8ce2de4.gph bitreich.org 70
hAuthor: Josuah Demangeon <me@josuah.net> URL:mailto:me@josuah.net bitreich.org 70
iDate: Fri, 18 Jun 2021 08:58:21 +0200 Err bitreich.org 70
i Err bitreich.org 70
ilet user choose extra fields to print and custom date formats Err bitreich.org 70
i Err bitreich.org 70
iDiffstat: Err bitreich.org 70
i M ical.c | 2 +- Err bitreich.org 70
i M ics2tsv.c | 111 ++++++++++++++++++++++++++++--- Err bitreich.org 70
i M util.c | 8 +++----- Err bitreich.org 70
i M util.h | 2 +- Err bitreich.org 70
i Err bitreich.org 70
i4 files changed, 108 insertions(+), 15 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@@ -297,7 +297,7 @@ ical_getline(char **contentline, char **line, size_t *sz, FILE *fp) Err bitreich.org 70
i num++; Err bitreich.org 70
i strchomp(*line); Err bitreich.org 70
i Err bitreich.org 70
i- if (strappend(contentline, *line) < 0) Err bitreich.org 70
i+ if (strappend(contentline, *line) == NULL) Err bitreich.org 70
i return -1; Err bitreich.org 70
i if ((c = fgetc(fp)) == EOF) Err bitreich.org 70
i goto end; Err bitreich.org 70
1diff --git a/ics2tsv.c b/ics2tsv.c /scm/ics2txt/file/ics2tsv.c.gph bitreich.org 70
i@@ -3,31 +3,49 @@ Err bitreich.org 70
i #include <stdlib.h> Err bitreich.org 70
i #include <string.h> Err bitreich.org 70
i #include <strings.h> Err bitreich.org 70
i+#include <time.h> Err bitreich.org 70
i+#include <unistd.h> Err bitreich.org 70
i Err bitreich.org 70
i #include "ical.h" Err bitreich.org 70
i #include "util.h" Err bitreich.org 70
i Err bitreich.org 70
i-#define FIELDS_MAX 64 Err bitreich.org 70
i+#define FIELDS_MAX 128 Err bitreich.org 70
i 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 Field { Err bitreich.org 70
i+ char *key; Err bitreich.org 70
i+ char *value; Err bitreich.org 70
i+}; Err bitreich.org 70
i+ 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-Block block; Err bitreich.org 70
i+static char default_fields[] = "CATEGORIES,LOCATION,SUMMARY,DESCRIPTION"; Err bitreich.org 70
i+static char *flag_s = ","; Err bitreich.org 70
i+static char *flag_t = NULL; Err bitreich.org 70
i+static char *flag_f = default_fields; Err bitreich.org 70
i+static char *fields[FIELDS_MAX]; Err bitreich.org 70
i+static Block block; Err bitreich.org 70
i Err bitreich.org 70
i static int Err bitreich.org 70
i fn_field_name(IcalParser *p, char *name) Err bitreich.org 70
i { Err bitreich.org 70
i+ (void)p; Err bitreich.org 70
i+ (void)name; 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 static int Err bitreich.org 70
i fn_block_begin(IcalParser *p, char *name) Err bitreich.org 70
i { Err bitreich.org 70
i+ (void)p; Err bitreich.org 70
i+ (void)name; Err bitreich.org 70
i+ Err bitreich.org 70
i memset(&block, 0, sizeof block); Err bitreich.org 70
i return 0; Err bitreich.org 70
i } Err bitreich.org 70
i@@ -35,9 +53,30 @@ fn_block_begin(IcalParser *p, char *name) 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+ char buf[128]; Err bitreich.org 70
i+ struct tm tm = {0}; Err bitreich.org 70
i+ Err bitreich.org 70
i+ (void)name; Err bitreich.org 70
i+ Err bitreich.org 70
i if (p->blocktype == ICAL_BLOCK_OTHER) Err bitreich.org 70
i return 0; Err bitreich.org 70
i- printf("%s\t%lld\t%lld", p->current->name, block.beg, block.end); Err bitreich.org 70
i+ fputs(p->current->name, stdout); Err bitreich.org 70
i+ Err bitreich.org 70
i+ /* printing dates with %s is much much slower than %lld */ Err bitreich.org 70
i+ if (flag_t == NULL) { Err bitreich.org 70
i+ printf("\t%lld\t%lld", block.beg, block.end); Err bitreich.org 70
i+ } else { Err bitreich.org 70
i+ strftime(buf, sizeof buf, flag_t, gmtime_r(&block.beg, &tm)); Err bitreich.org 70
i+ printf("\t%s", buf); Err bitreich.org 70
i+ strftime(buf, sizeof buf, flag_t, gmtime_r(&block.end, &tm)); Err bitreich.org 70
i+ printf("\t%s", buf); Err bitreich.org 70
i+ } Err bitreich.org 70
i+ Err bitreich.org 70
i+ for (int i = 0; fields[i] != NULL; i++) { Err bitreich.org 70
i+ fputc('\t', stdout); Err bitreich.org 70
i+ if (block.fields[i] != NULL) Err bitreich.org 70
i+ fputs(block.fields[i], stdout); Err bitreich.org 70
i+ } Err bitreich.org 70
i printf("\n"); Err bitreich.org 70
i return 0; Err bitreich.org 70
i } Err bitreich.org 70
i@@ -45,13 +84,17 @@ fn_block_end(IcalParser *p, char *name) Err bitreich.org 70
i static int Err bitreich.org 70
i fn_param_value(IcalParser *p, char *name, char *value) Err bitreich.org 70
i { Err bitreich.org 70
i+ (void)p; Err bitreich.org 70
i+ (void)name; Err bitreich.org 70
i+ (void)value; 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 static int Err bitreich.org 70
i fn_field_value(IcalParser *p, char *name, char *value) Err bitreich.org 70
i { Err bitreich.org 70
i- static char *fieldmap[][2] = { Err bitreich.org 70
i+ static char *map[][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@@ -61,22 +104,48 @@ fn_field_value(IcalParser *p, char *name, char *value) 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+ /* fill the date fields */ Err bitreich.org 70
i+ beg = map[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+ end = map[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+ Err bitreich.org 70
i+ /* fill text fields as requested with -o F1,F2... */ Err bitreich.org 70
i+ for (int i = 0; fields[i] != NULL; i++) { Err bitreich.org 70
i+ if (strcasecmp(name, fields[i]) == 0) { Err bitreich.org 70
i+ if (block.fields[i] == NULL) { Err bitreich.org 70
i+ if ((block.fields[i] = strdup(value)) == NULL) Err bitreich.org 70
i+ return ical_err(p, strerror(errno)); Err bitreich.org 70
i+ } else { Err bitreich.org 70
i+ if (strappend(&block.fields[i], flag_s) == NULL || Err bitreich.org 70
i+ strappend(&block.fields[i], value) == NULL) Err bitreich.org 70
i+ return ical_err(p, strerror(errno)); Err bitreich.org 70
i+ } Err bitreich.org 70
i+ } 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
i Err bitreich.org 70
i+static void Err bitreich.org 70
i+usage(void) Err bitreich.org 70
i+{ Err bitreich.org 70
i+ fprintf(stderr, "usage: %s [-f fields] [-s subsep] [-t timefmt] [file...]", arg0); Err bitreich.org 70
i+ exit(1); 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 IcalParser p = {0}; Err bitreich.org 70
i- arg0 = *argv++; Err bitreich.org 70
i+ size_t i; Err bitreich.org 70
i+ int c; Err bitreich.org 70
i+ Err bitreich.org 70
i+ arg0 = *argv; Err bitreich.org 70
i 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@@ -84,7 +153,33 @@ main(int argc, char **argv) Err bitreich.org 70
i p.fn_param_value = fn_param_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+ while ((c = getopt(argc, argv, "f:s:t:")) != -1) { Err bitreich.org 70
i+ switch (c) { Err bitreich.org 70
i+ case 'f': Err bitreich.org 70
i+ flag_f = optarg; Err bitreich.org 70
i+ break; Err bitreich.org 70
i+ case 's': Err bitreich.org 70
i+ flag_s = optarg; Err bitreich.org 70
i+ break; Err bitreich.org 70
i+ case 't': Err bitreich.org 70
i+ flag_t = optarg; Err bitreich.org 70
i+ break; Err bitreich.org 70
i+ case '?': Err bitreich.org 70
i+ usage(); Err bitreich.org 70
i+ break; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ } Err bitreich.org 70
i+ argv += optind; Err bitreich.org 70
i+ argc -= optind; Err bitreich.org 70
i+ Err bitreich.org 70
i+ i = 0; Err bitreich.org 70
i+ do { Err bitreich.org 70
i+ if (i >= sizeof fields / sizeof *fields - 1) Err bitreich.org 70
i+ err("too many fields specified with -o flag"); Err bitreich.org 70
i+ } while ((fields[i++] = strsep(&flag_f, ",")) != NULL); Err bitreich.org 70
i+ fields[i] = NULL; Err bitreich.org 70
i+ Err bitreich.org 70
i+ if (*argv == NULL || strcmp(*argv, "-") == 0) { Err bitreich.org 70
i debug("converting *stdin*"); Err bitreich.org 70
i if (ical_parse(&p, stdin) < 0) Err bitreich.org 70
i err("parsing *stdin*:%d: %s", p.linenum, p.errmsg); Err bitreich.org 70
1diff --git a/util.c b/util.c /scm/ics2txt/file/util.c.gph bitreich.org 70
i@@ -110,7 +110,7 @@ strchomp(char *line) Err bitreich.org 70
i line[--len] = '\0'; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i-int Err bitreich.org 70
i+char * Err bitreich.org 70
i strappend(char **dp, char const *s) Err bitreich.org 70
i { Err bitreich.org 70
i size_t dlen, slen; Err bitreich.org 70
i@@ -118,13 +118,11 @@ strappend(char **dp, char const *s) Err bitreich.org 70
i Err bitreich.org 70
i dlen = (*dp == NULL) ? 0 : strlen(*dp); Err bitreich.org 70
i slen = strlen(s); Err bitreich.org 70
i- Err bitreich.org 70
i if ((mem = realloc(*dp, dlen + slen + 1)) == NULL) Err bitreich.org 70
i- return -1; Err bitreich.org 70
i+ return NULL; Err bitreich.org 70
i *dp = mem; Err bitreich.org 70
i- Err bitreich.org 70
i memcpy(*dp + dlen, s, slen + 1); Err bitreich.org 70
i- return 0; Err bitreich.org 70
i+ return *dp; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i /** memory **/ Err bitreich.org 70
1diff --git a/util.h b/util.h /scm/ics2txt/file/util.h.gph bitreich.org 70
i@@ -15,7 +15,7 @@ void debug(char const *fmt, ...); Err bitreich.org 70
i size_t strlcpy(char *, char const *, size_t); Err bitreich.org 70
i char *strsep(char **, char const *); Err bitreich.org 70
i void strchomp(char *); Err bitreich.org 70
i-int strappend(char **, char const *); Err bitreich.org 70
i+char *strappend(char **, char const *); Err bitreich.org 70
i size_t strlcat(char *, char const *, size_t); Err bitreich.org 70
i Err bitreich.org 70
i /** memory **/ Err bitreich.org 70
.
Response:
text/plain