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