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