4#define G_PI 3.14159265358979323846
5#define MIN(i, j) (((i) < (j)) ? (i) : (j))
6#define MAX(i, j) (((i) > (j)) ? (i) : (j))
7#define CLAMP(x, lo, hi) ( ((x) < (lo)) ? (lo) : ( ((x) > (hi)) ? (hi) : (x)) )
8#define N_ELEMENTS(arr) (sizeof(arr) / sizeof((arr)[0]))
9#define g_strlcpy(dest, src, size) strlcpy((dest),(src),(size))
10#define g_strlcat(dest, src, size) strlcat((dest),(src),(size))
32 for (
char **p = strv; *p; ++p) free(*p);
38 const char *delimiter,
40 if (!
string)
return NULL;
41 size_t dlen = (delimiter && *delimiter) ? strlen(delimiter) : 0;
43 if (*
string ==
'\0') {
44 char **v = malloc(
sizeof *v);
51 if (dlen == 0 || max_tokens == 1) {
52 char **v = (
char**)malloc(2 *
sizeof *v);
54 v[0] = strdup(
string);
55 if (!v[0]) { free(v);
return NULL; }
60 if (max_tokens < 1) max_tokens = INT_MAX;
62 size_t cap = 8, n = 0;
63 char **v = (
char**)malloc((cap + 1) *
sizeof *v);
66 const char *p = string;
69 if (n == (
size_t)(max_tokens - 1)) {
76 const char *q = strstr(p, delimiter);
84 size_t len = (size_t)(q - p);
85 char *tok = (
char*)malloc(len + 1);
93 char **nv = (
char**)realloc(v, (cap + 1) *
sizeof *nv);
103 for (
size_t i = 0; i < n; i++) free(v[i]);
111 return c ==
' ' || (c >=
'\t' && c <=
'\r');
123 char *end = start + strlen(start);
127 size_t len = (size_t)(end - start);
129 if (start != s) memmove(s, start, len);
135static inline void g_strdelimit (
char *s,
const char *delims,
char repl) {
136 if (!s || !delims)
return;
137 for (
char *p = s; *p; ++p)
138 if (strchr(delims, *p)) *p = repl;
143 return s ? strdup(s) : NULL;
148 if (!path)
return NULL;
149 if (*path ==
'\0')
return strdup(
".");
151 const char *end = path + strlen(path);
152 while (end > path && end[-1] ==
'/') end--;
153 if (end == path)
return strdup(
"/");
155 const char *start = end;
156 while (start > path && start[-1] !=
'/') start--;
158 size_t len = (size_t)(end - start);
159 char *out = (
char *)malloc(len + 1);
160 if (!out)
return NULL;
161 memcpy(out, start, len);
168 if (!s || !suffix)
return false;
169 size_t ls = strlen(s);
170 size_t lsu = strlen(suffix);
171 if (lsu > ls)
return false;
173 return memcmp(s + (ls - lsu), suffix, lsu) == 0;
178 if (!s || !prefix)
return false;
179 size_t lp = strlen(prefix);
180 return strncmp(s, prefix, lp) == 0;
static void g_strdelimit(char *s, const char *delims, char repl)
static void g_atomic_int_set(int *x, int val)
Attention NOT SAFE.
static bool g_str_has_prefix(const char *s, const char *prefix)
Equivalent to Glib g_str_has_prefix.
static void g_strfreev(char **strv)
Free array with elements (like GLib g_strfreev)
static bool g_ascii_isspace(unsigned char c)
GLib LIKE ' ', '\t', ' ', '\v', '\f', '\r'.
static size_t g_strv_length(char *const *strv)
static bool g_str_has_suffix(const char *s, const char *suffix)
Equivalent to Glib g_str_has_suffix.
static int g_atomic_int_get(int *x)
Attention NOT SAFE.
static char * g_strdup(const char *s)
equivalent to GLIB
static char * g_path_get_basename(const char *path)
close to Glib g_path_get_basename
static char ** g_strsplit(const char *string, const char *delimiter, int max_tokens)
Clone of GLib g_strsplit.
static char * g_strstrip(char *s)
Équivalent to GLIB g_strstrip: trim in place, return s.