16#define UNUSED(x) ((x) = (x))
20lwc__calculate_hash(
const char *str,
size_t len)
33#define STR_OF(str) ((char *)(str + 1))
34#define CSTR_OF(str) ((const char *)(str + 1))
36#define NR_BUCKETS_DEFAULT (4091)
45#define LWC_ALLOC(s) malloc(s)
46#define LWC_FREE(p) free(p)
49typedef int (*
lwc_strncmp)(
const char *,
const char *, size_t);
50typedef void * (*lwc_memcpy)(
void * restrict,
const void * restrict, size_t);
80lwc__intern(
const char *s,
size_t slen,
91 assert((s != NULL) || (slen == 0));
95 eret = lwc__initialise();
106 while (str != NULL) {
107 if ((str->
hash == h) && (str->
len == slen)) {
108 if (compare(
CSTR_OF(str), s, slen) == 0) {
125 if (str->
next != NULL)
134 copy(
STR_OF(str), s, slen);
146 return lwc__intern(s, slen, ret,
153 size_t ssoffset,
size_t sslen,
159 if (ssoffset >= str->
len)
161 if ((ssoffset + sslen) > str->
len)
193 if (str->
next != NULL)
200 memset(str, 0xA5,
sizeof(*str) + str->
len);
209lwc__dolower(
const char c)
211 if (c >=
'A' && c <=
'Z')
212 return c +
'a' -
'A';
217lwc__calculate_lcase_hash(
const char *str,
size_t len)
223 z ^= lwc__dolower(*str++);
231lwc__lcase_strncmp(
const char *s1,
const char *s2,
size_t n)
234 if (*s1++ != lwc__dolower(*s2++))
242lwc__lcase_memcpy(
void *restrict _target,
const void *restrict _source,
size_t n)
244 char *restrict target = _target;
245 const char *restrict source = _source;
248 *target++ = lwc__dolower(*source++);
260 return lwc__intern(
CSTR_OF(str),
262 lwc__calculate_lcase_hash,
280 for (str = ctx->
buckets[n]; str != NULL; str = str->
next) {
286 if (found ==
false) {
lwc_error lwc_string_tolower(lwc_string *str, lwc_string **ret)
lwc_error lwc_intern_substring(lwc_string *str, size_t ssoffset, size_t sslen, lwc_string **ret)
lwc_error lwc_intern_string(const char *s, size_t slen, lwc_string **ret)
void *(* lwc_memcpy)(void *restrict, const void *restrict, size_t)
#define NR_BUCKETS_DEFAULT
void lwc_string_destroy(lwc_string *str)
lwc_hash(* lwc_hasher)(const char *, size_t)
void lwc_iterate_strings(lwc_iteration_callback_fn cb, void *pw)
lwc_error lwc__intern_caseless_string(lwc_string *str)
struct lwc_context_s lwc_context
int(* lwc_strncmp)(const char *, const char *, size_t)
#define lwc_string_unref(str)
enum lwc_error_e lwc_error
void(* lwc_iteration_callback_fn)(lwc_string *str, void *pw)
struct lwc_string_s * next
struct lwc_string_s * insensitive
struct lwc_string_s ** prevptr