|
|
ics2tree.c - ics2txt - convert icalendar .ics file to plain text |
|
|
 |
git clone git://bitreich.org/ics2txt git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ics2txt (git://bitreich.org) |
|
|
 |
Log |
|
|
 |
Files |
|
|
 |
Refs |
|
|
 |
Tags |
|
|
 |
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 } |
|