iutil.c - 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 iutil.c (3112B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 #include "util.h" Err bitreich.org 70 i 2 #include Err bitreich.org 70 i 3 #include Err bitreich.org 70 i 4 #include Err bitreich.org 70 i 5 #include Err bitreich.org 70 i 6 #include Err bitreich.org 70 i 7 #include Err bitreich.org 70 i 8 #include Err bitreich.org 70 i 9 #include Err bitreich.org 70 i 10 Err bitreich.org 70 i 11 char *arg0; Err bitreich.org 70 i 12 Err bitreich.org 70 i 13 static void Err bitreich.org 70 i 14 _log(char const *fmt, va_list va) Err bitreich.org 70 i 15 { Err bitreich.org 70 i 16 if (arg0 != NULL) Err bitreich.org 70 i 17 fprintf(stderr, "%s: ", arg0); Err bitreich.org 70 i 18 vfprintf(stderr, fmt, va); Err bitreich.org 70 i 19 fprintf(stderr, "\n"); Err bitreich.org 70 i 20 fflush(stderr); Err bitreich.org 70 i 21 } Err bitreich.org 70 i 22 Err bitreich.org 70 i 23 void Err bitreich.org 70 i 24 err(int e, char const *fmt, ...) Err bitreich.org 70 i 25 { Err bitreich.org 70 i 26 va_list va; Err bitreich.org 70 i 27 Err bitreich.org 70 i 28 va_start(va, fmt); Err bitreich.org 70 i 29 _log( fmt, va); Err bitreich.org 70 i 30 exit(e); Err bitreich.org 70 i 31 } Err bitreich.org 70 i 32 Err bitreich.org 70 i 33 void Err bitreich.org 70 i 34 warn(char const *fmt, ...) Err bitreich.org 70 i 35 { Err bitreich.org 70 i 36 va_list va; Err bitreich.org 70 i 37 Err bitreich.org 70 i 38 va_start(va, fmt); Err bitreich.org 70 i 39 _log(fmt, va); Err bitreich.org 70 i 40 } Err bitreich.org 70 i 41 Err bitreich.org 70 i 42 void Err bitreich.org 70 i 43 debug(char const *fmt, ...) Err bitreich.org 70 i 44 { Err bitreich.org 70 i 45 static int verbose = -1; Err bitreich.org 70 i 46 va_list va; Err bitreich.org 70 i 47 Err bitreich.org 70 i 48 if (verbose < 0) Err bitreich.org 70 i 49 verbose = (getenv("DEBUG") != NULL); Err bitreich.org 70 i 50 if (!verbose) Err bitreich.org 70 i 51 return; Err bitreich.org 70 i 52 va_start(va, fmt); Err bitreich.org 70 i 53 _log(fmt, va); Err bitreich.org 70 i 54 } Err bitreich.org 70 i 55 Err bitreich.org 70 i 56 size_t Err bitreich.org 70 i 57 strlcpy(char *d, char const *s, size_t sz) Err bitreich.org 70 i 58 { Err bitreich.org 70 i 59 size_t len, cpy; Err bitreich.org 70 i 60 Err bitreich.org 70 i 61 len = strlen(s); Err bitreich.org 70 i 62 cpy = (len > sz) ? (sz) : (len); Err bitreich.org 70 i 63 memcpy(d, s, cpy + 1); Err bitreich.org 70 i 64 d[sz - 1] = '\0'; Err bitreich.org 70 i 65 return len; Err bitreich.org 70 i 66 } Err bitreich.org 70 i 67 Err bitreich.org 70 i 68 size_t Err bitreich.org 70 i 69 strlcat(char *d, char const *s, size_t dsz) Err bitreich.org 70 i 70 { Err bitreich.org 70 i 71 size_t dlen; Err bitreich.org 70 i 72 Err bitreich.org 70 i 73 dlen = strlen(d); Err bitreich.org 70 i 74 if (dlen >= dsz) Err bitreich.org 70 i 75 return dlen + strlen(s); Err bitreich.org 70 i 76 return dlen + strlcpy(d + dlen, s, dsz - dlen); Err bitreich.org 70 i 77 } Err bitreich.org 70 i 78 Err bitreich.org 70 i 79 char * Err bitreich.org 70 i 80 strsep(char **sp, char const *sep) Err bitreich.org 70 i 81 { Err bitreich.org 70 i 82 char *s, *prev; Err bitreich.org 70 i 83 Err bitreich.org 70 i 84 if (*sp == NULL) Err bitreich.org 70 i 85 return NULL; Err bitreich.org 70 i 86 prev = *sp; Err bitreich.org 70 i 87 for (s = *sp; strchr(sep, *s) == NULL; s++); Err bitreich.org 70 i 88 if (*s == '\0') { Err bitreich.org 70 i 89 *sp = NULL; Err bitreich.org 70 i 90 } else { Err bitreich.org 70 i 91 *sp = s + 1; Err bitreich.org 70 i 92 *s = '\0'; Err bitreich.org 70 i 93 } Err bitreich.org 70 i 94 return prev; Err bitreich.org 70 i 95 } Err bitreich.org 70 i 96 Err bitreich.org 70 i 97 void Err bitreich.org 70 i 98 strchomp(char *line) Err bitreich.org 70 i 99 { Err bitreich.org 70 i 100 size_t len; Err bitreich.org 70 i 101 Err bitreich.org 70 i 102 len = strlen(line); Err bitreich.org 70 i 103 if (len > 0 && line[len - 1] == '\n') Err bitreich.org 70 i 104 line[--len] = '\0'; Err bitreich.org 70 i 105 if (len > 0 && line[len - 1] == '\r') Err bitreich.org 70 i 106 line[--len] = '\0'; Err bitreich.org 70 i 107 } Err bitreich.org 70 i 108 Err bitreich.org 70 i 109 char * Err bitreich.org 70 i 110 strappend(char **dp, char const *s) Err bitreich.org 70 i 111 { Err bitreich.org 70 i 112 size_t dlen, slen; Err bitreich.org 70 i 113 void *mem; Err bitreich.org 70 i 114 Err bitreich.org 70 i 115 dlen = (*dp == NULL) ? 0 : strlen(*dp); Err bitreich.org 70 i 116 slen = strlen(s); Err bitreich.org 70 i 117 if ((mem = realloc(*dp, dlen + slen + 1)) == NULL) Err bitreich.org 70 i 118 return NULL; Err bitreich.org 70 i 119 *dp = mem; Err bitreich.org 70 i 120 memcpy(*dp + dlen, s, slen + 1); Err bitreich.org 70 i 121 return *dp; Err bitreich.org 70 i 122 } Err bitreich.org 70 i 123 Err bitreich.org 70 i 124 size_t Err bitreich.org 70 i 125 strsplit(char *s, char **array, size_t len, char const *sep) Err bitreich.org 70 i 126 { Err bitreich.org 70 i 127 size_t i; Err bitreich.org 70 i 128 Err bitreich.org 70 i 129 assert(len > 0); Err bitreich.org 70 i 130 for (i = 0; i < len; i++) Err bitreich.org 70 i 131 if ((array[i] = strsep(&s, sep)) == NULL) Err bitreich.org 70 i 132 break; Err bitreich.org 70 i 133 array[len - 1] = NULL; Err bitreich.org 70 i 134 return i; Err bitreich.org 70 i 135 } Err bitreich.org 70 i 136 Err bitreich.org 70 i 137 long long Err bitreich.org 70 i 138 strtonum(char const *s, long long min, long long max, char const **errstr) Err bitreich.org 70 i 139 { Err bitreich.org 70 i 140 long long ll = 0; Err bitreich.org 70 i 141 char *end; Err bitreich.org 70 i 142 Err bitreich.org 70 i 143 assert(min < max); Err bitreich.org 70 i 144 errno = 0; Err bitreich.org 70 i 145 ll = strtoll(s, &end, 10); Err bitreich.org 70 i 146 if ((errno == ERANGE && ll == LLONG_MIN) || ll < min) { Err bitreich.org 70 i 147 if (errstr != NULL) Err bitreich.org 70 i 148 *errstr = "too small"; Err bitreich.org 70 i 149 return 0; Err bitreich.org 70 i 150 } Err bitreich.org 70 i 151 if ((errno == ERANGE && ll == LLONG_MAX) || ll > max) { Err bitreich.org 70 i 152 if (errstr != NULL) Err bitreich.org 70 i 153 *errstr = "too large"; Err bitreich.org 70 i 154 return 0; Err bitreich.org 70 i 155 } Err bitreich.org 70 i 156 if (errno == EINVAL || *end != '\0') { Err bitreich.org 70 i 157 if (errstr != NULL) Err bitreich.org 70 i 158 *errstr = "invalid"; Err bitreich.org 70 i 159 return 0; Err bitreich.org 70 i 160 } Err bitreich.org 70 i 161 assert(errno == 0); Err bitreich.org 70 i 162 if (errstr != NULL) Err bitreich.org 70 i 163 *errstr = NULL; Err bitreich.org 70 i 164 return ll; Err bitreich.org 70 i 165 } Err bitreich.org 70 i 166 Err bitreich.org 70 i 167 void * Err bitreich.org 70 i 168 reallocarray(void *mem, size_t n, size_t sz) Err bitreich.org 70 i 169 { Err bitreich.org 70 i 170 if (SIZE_MAX / n < sz) Err bitreich.org 70 i 171 return errno=ERANGE, NULL; Err bitreich.org 70 i 172 return realloc(mem, n * sz); Err bitreich.org 70 i 173 } Err bitreich.org 70 i 174 Err bitreich.org 70 i 175 time_t Err bitreich.org 70 i 176 tztime(struct tm *tm, char const *tz) Err bitreich.org 70 i 177 { Err bitreich.org 70 i 178 char *env, old[32]; Err bitreich.org 70 i 179 time_t t; Err bitreich.org 70 i 180 Err bitreich.org 70 i 181 env = getenv("TZ"); Err bitreich.org 70 i 182 if (strlcpy(old, env ? env : "", sizeof old) >= sizeof old) Err bitreich.org 70 i 183 return -1; Err bitreich.org 70 i 184 if (setenv("TZ", tz, 1) < 0) Err bitreich.org 70 i 185 return -1; Err bitreich.org 70 i 186 Err bitreich.org 70 i 187 tzset(); Err bitreich.org 70 i 188 t = mktime(tm); Err bitreich.org 70 i 189 Err bitreich.org 70 i 190 if (env == NULL) Err bitreich.org 70 i 191 unsetenv("TZ"); Err bitreich.org 70 i 192 else if (setenv("TZ", old, 1) < 0) Err bitreich.org 70 i 193 return -1; Err bitreich.org 70 i 194 return t; Err bitreich.org 70 i 195 } Err bitreich.org 70 .