annotate util.c @ 25:b74c1f165e51

misc: update copyright years
author David Demelier <markand@malikania.fr>
date Sun, 02 Jan 2022 10:24:45 +0100
parents f19f5f9fee56
children 222d013399cf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * util.c -- various utilities
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
25
b74c1f165e51 misc: update copyright years
David Demelier <markand@malikania.fr>
parents: 23
diff changeset
4 * Copyright (c) 2020-2022 David Demelier <markand@malikania.fr>
0
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <errno.h>
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <ctype.h>
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <limits.h>
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <stdarg.h>
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <stdio.h>
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <stdlib.h>
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #include <stdnoreturn.h>
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include <string.h>
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #include <time.h>
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 #include "image.h"
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 #include "config.h"
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 #include "util.h"
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
33
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 noreturn void
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 die(const char *fmt, ...)
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 {
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 assert(fmt);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
38
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 va_list ap;
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
40
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 va_start(ap, fmt);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 vfprintf(stderr, fmt, ap);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 va_end(ap);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
44
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 exit(1);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 }
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
47
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 char *
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 estrdup(const char *str)
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 {
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 assert(str);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
52
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 char *ret;
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 size_t length = strlen(str);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
55
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 if (!(ret = calloc(1, length + 1)))
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 die(strerror(errno));
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
58
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 return strcpy(ret, str);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 }
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
61
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 void *
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 ememdup(const void *src, size_t length)
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 {
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 assert(src);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 assert(length > 0);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
67
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 void *ptr;
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
69
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 if (!(ptr = malloc(length)))
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 die(strerror(errno));
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
72
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 return memcpy(ptr, src, length);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 }
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
75
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 const char *
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 bprintf(const char *fmt, ...)
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 {
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 assert(fmt);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
80
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 static char buf[BUFSIZ];
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 va_list ap;
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
83
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 va_start(ap, fmt);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 vsnprintf(buf, sizeof (buf), fmt, ap);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 va_end(ap);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
87
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 return buf;
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 }
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
90
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 const char *
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 bstrftime(const char *fmt, const struct tm *tm)
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 {
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 assert(fmt);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 assert(tm);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
96
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 static char buf[BUFSIZ];
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
98
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 strftime(buf, sizeof (buf), fmt, tm);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
100
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 return buf;
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 }
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
103
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 const char *
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 path(const char *filename)
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 {
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 assert(filename);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
108
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 /* Build path to the template file. */
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 static char path[PATH_MAX];
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
111
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 snprintf(path, sizeof (path), "%s/%s", config.themedir, filename);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
113
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 return path;
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 }
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
116
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 void
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 replace(char **dst, const char *s)
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 {
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 assert(dst);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 assert(s);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
122
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 /* Trim leading spaces. */
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 while (*s && isspace(*s))
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 s++;
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
126
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 if (*s) {
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 free(*dst);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 *dst = estrdup(s);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 }
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 }
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
132
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 const char *
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 ttl(time_t timestamp, long long int duration)
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 {
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 const time_t now = time(NULL);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 const long long int left = duration - difftime(now, timestamp);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
138
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 if (left < IMAGE_DURATION_HOUR)
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 return bprintf("%lld minute(s)", left / 60);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 if (left < IMAGE_DURATION_DAY)
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 return bprintf("%lld hour(s)", left / 3600);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
143
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 /* Other in days. */
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 return bprintf("%lld day(s)", left / 86400);
f41e1b48510d misc: initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 }