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