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 */