util.h - ltk - GUI toolkit for X11 (WIP)
HTML git clone git://lumidify.org/ltk.git (fast, but not encrypted)
HTML git clone https://lumidify.org/git/ltk.git (encrypted, but very slow)
HTML git clone git://4kcetb7mo7hj6grozzybxtotsub5bempzo4lirzc3437amof2c2impyd.onion/ltk.git (over tor)
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
util.h (3597B)
---
1 /*
2 * Copyright (c) 2021-2024 lumidify <nobody@lumidify.org>
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17 #ifndef LTK_UTIL_H
18 #define LTK_UTIL_H
19
20 #include <stdarg.h>
21 #include <stddef.h>
22
23 long long ltk_strtonum(
24 const char *numstr, long long minval,
25 long long maxval, const char **errstrp
26 );
27 long long ltk_strtoscalednum(
28 const char *numstr, long long minval, long long maxval,
29 char **endptr, const char **errstrp
30 );
31
32 char *ltk_read_file(const char *filename, size_t *len_ret, char **errstr_ret);
33 int ltk_write_file(const char *path, const char *data, size_t len, char **errstr_ret);
34 int ltk_parse_run_cmd(const char *cmdtext, size_t len, const char *filename);
35 void ltk_grow_string(char **str, int *alloc_size, int needed);
36 char *ltk_setup_directory(const char *envname, const char *defaultname, int create);
37 char *ltk_strcat_useful(const char *str1, const char *str2);
38
39 /*
40 * Compare the nul-terminated string 'terminated' with the char
41 * array 'array' with length 'len'.
42 * Returns non-zero if they are equal, 0 otherwise.
43 */
44 /* Note: this doesn't work if array contains '\0'. */
45 int str_array_equal(const char *terminated, const char *array, size_t len);
46
47 size_t prev_utf8(char *text, size_t index);
48 size_t next_utf8(char *text, size_t len, size_t index);
49
50 /* based on the assert found in OpenBSD */
51 void ltk_assert_impl(const char *file, int line, const char *func, const char *failedexpr);
52 #define ltk_assert(e) ((e) ? (void)0 : ltk_assert_impl(__FILE__, __LINE__, __func__, #e))
53
54 #define LENGTH(X) (sizeof(X) / sizeof(X[0]))
55
56 #define LTK_GEN_LOG_FUNC_PROTO(prefix) \
57 void prefix##_warn_errno(const char *format, ...); \
58 void prefix##_fatal_errno(const char *format, ...); \
59 void prefix##_fatal(const char *format, ...); \
60 void prefix##_warn(const char *format, ...);
61
62 #define LTK_GEN_LOG_FUNCS(prefix, log_func, cleanup_func) \
63 void \
64 prefix##_warn(const char *format, ...) { \
65 va_list args; \
66 va_start(args, format); \
67 log_func("Warning", format, args); \
68 va_end(args); \
69 } \
70 \
71 void \
72 prefix##_fatal(const char *format, ...) { \
73 va_list args; \
74 va_start(args, format); \
75 log_func("Fatal", format, args); \
76 va_end(args); \
77 cleanup_func(); \
78 \
79 exit(1); \
80 } \
81 \
82 void \
83 prefix##_warn_errno(const char *format, ...) { \
84 va_list args; \
85 char *errstr = strerror(errno); \
86 va_start(args, format); \
87 log_func("Warning", format, args); \
88 va_end(args); \
89 prefix##_warn("system error: %s\n", errstr); \
90 } \
91 \
92 void \
93 prefix##_fatal_errno(const char *format, ...) { \
94 va_list args; \
95 char *errstr = strerror(errno); \
96 va_start(args, format); \
97 log_func("Fatal", format, args); \
98 va_end(args); \
99 prefix##_fatal("system error: %s\n", errstr); \
100 }
101
102 LTK_GEN_LOG_FUNC_PROTO(ltk)
103
104 #endif /* LTK_UTIL_H */