ics2tree.c - ics2txt - convert icalendar .ics file to plain text
(HTM) git clone git://bitreich.org/ics2txt git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ics2txt
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Tags
(DIR) README
---
ics2tree.c (1959B)
---
1 #include <unistd.h>
2 #include <errno.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <strings.h>
7 #include "ical.h"
8 #include "util.h"
9
10 #ifndef __OpenBSD__
11 #define pledge(...) 0
12 #endif
13
14 static void
15 print_ruler(int level)
16 {
17 while (level-- > 0)
18 fprintf(stdout, ": ");
19 }
20
21 static int
22 fn_field_name(IcalParser *p, char *name)
23 {
24 print_ruler(ical_get_level(p));
25 printf("name %s\n", name);
26 fflush(stdout);
27 return 0;
28 }
29
30 static int
31 fn_block_begin(IcalParser *p, char *name)
32 {
33 print_ruler(ical_get_level(p) - 1);
34 printf("begin %s\n", name);
35 fflush(stdout);
36 return 0;
37 }
38
39 static int
40 fn_param_value(IcalParser *p, char *name, char *value)
41 {
42 print_ruler(ical_get_level(p) + 1);
43 printf("param %s=%s\n", name, value);
44 fflush(stdout);
45 return 0;
46 }
47
48 static int
49 fn_field_value(IcalParser *p, char *name, char *value)
50 {
51 size_t len;
52 (void)name;
53
54 if (ical_get_value(p, value, &len) < 0)
55 return -1;
56 print_ruler(ical_get_level(p) + 1);
57 if (strcasecmp(name, "DTSTART") == 0 ||
58 strcasecmp(name, "DTSTAMP") == 0 ||
59 strcasecmp(name, "DTEND") == 0) {
60 time_t t;
61 if (ical_get_time(p, value, &t) != 0)
62 warn("%s: %s", p->errmsg, value);
63 printf("epoch %lld\n", t);
64 } else {
65 printf("value %s\n", value);
66 }
67 fflush(stdout);
68 return 0;
69 }
70
71 int
72 main(int argc, char **argv)
73 {
74 IcalParser p = {0};
75 arg0 = *argv++;
76
77 if (pledge("stdio", "") < 0)
78 err(1, "pledge: %s", strerror(errno));
79
80 p.fn_field_name = fn_field_name;
81 p.fn_block_begin = fn_block_begin;
82 p.fn_param_value = fn_param_value;
83 p.fn_field_value = fn_field_value;
84
85 if (*argv == NULL) {
86 if (ical_parse(&p, stdin) < 0)
87 err(1, "parsing stdin:%d: %s", p.linenum, p.errmsg);
88 }
89
90 for (; *argv != NULL; argv++, argc--) {
91 FILE *fp;
92
93 debug("converting \"%s\"", *argv);
94 if ((fp = fopen(*argv, "r")) == NULL)
95 err(1, "opening %s", *argv);
96 if (ical_parse(&p, fp) < 0)
97 err(1, "parsing %s:%d: %s", *argv, p.linenum, p.errmsg);
98 fclose(fp);
99 }
100 return 0;
101 }