diff options
| author | Riley Beckett <rbeckettvt@gmail.com> | 2025-10-24 19:14:25 -0400 |
|---|---|---|
| committer | Riley Beckett <rbeckettvt@gmail.com> | 2025-10-24 19:14:25 -0400 |
| commit | ecf6d868aa0fbf1f30c2a286a526018d412e7e28 (patch) | |
| tree | b570089bbaea046d4c4124e8ab66321b77cc049a | |
| parent | ec67361bb19d4c43ca41df6a56beb5b29344bc6a (diff) | |
these macros maybe work
| -rw-r--r-- | array.c | 20 | ||||
| -rw-r--r-- | array.h | 62 | ||||
| -rw-r--r-- | keyboard.c | 2 |
3 files changed, 57 insertions, 27 deletions
@@ -40,16 +40,19 @@ void* array_add_(void* array, size_t item_size) { info = realloc(info, sizeof(array_info) + (info->capacity * item_size)); } info->size++; - return &(info[1]); + return info->array; } -void array_resize(void* array, size_t size) { - array_info* info = &((array_info*)array)[-1]; - info->size = size; - if (size > info->capacity) { +void* array_resize_(void* array, size_t item_size, size_t size) { + array_info* info = NULL; + if (!array) { + info = array_new_(item_size, 0); + } + else { + info = ((array_info*)array) - 1; + } + if (size >= info->capacity) { info->capacity = size; - - // round up to next power of 2 info->capacity--; info->capacity |= info->capacity >> 1; info->capacity |= info->capacity >> 2; @@ -57,7 +60,10 @@ void array_resize(void* array, size_t size) { info->capacity |= info->capacity >> 8; info->capacity |= info->capacity >> 16; info->capacity++; + info = realloc(info, sizeof(array_info) + (info->capacity * item_size)); } + info->size = size; + return info->array; } void array_print(void* array) { @@ -10,10 +10,10 @@ typedef struct { } array_info; array_info* array_new_(size_t item_size, size_t size); -void array_resize(void* array, size_t size); void array_print(void* array); void array_pop(void* array); void* array_add_(void* array, size_t item_size); +void* array_resize_(void* array, size_t item_size, size_t size); #define CONCAT_INNER(a, b) a ## b #define CONCAT(a, b) CONCAT_INNER(a, b) @@ -27,33 +27,55 @@ void* array_add_(void* array, size_t item_size); (array) = NULL; \ } while (0) -#define array_erase(array, index) do { \ - if ((index)) { \ - for (int __i = (index) - 1; __i < array_size((array)) - 1; __i++) \ - (array)[__i] = (array)[__i + 1]; \ - ((array_info*)(array))[-1].size--; \ - } \ +#define array_erase(array, index) do { \ + if ((index)) { \ + for (int __i = (index) - 1; __i < array_size((array)) - 1; __i++) \ + (array)[__i] = (array)[__i + 1]; \ + ((array_info*)(array))[-1].size--; \ + } \ } while(0) -#define array_insert(array, index, value) do { \ - void* __temp = array_add_((array), sizeof(*(array))); \ - (array) = __temp; \ - for (int __i = array_size((array)) - 1; __i > (index); __i--) \ - (array)[__i] = (array)[__i - 1]; \ - (array)[(index)] = value; \ -} while(0) \ +#define array_insert(array, index, value) do { \ + void* __temp = array_resize_((array), sizeof(*(array)), array_size(array) + 1); \ + (array) = __temp; \ + for (int __i = array_size((array)) - 1; __i > (index); __i--) \ + (array)[__i] = (array)[__i - 1]; \ + (array)[(index)] = value; \ +} while(0) + +#define array_insert_many(array, index, values, len) do { \ + void* __temp = array_resize_((array), sizeof(*(array)), array_size(array) + len); \ + (array) = __temp; \ + for (int __i = array_size((array)) - 1; __i > (index) + len; __i--) \ + (array)[__i] = (array)[__i - len]; \ + memcpy(&array[(index)], (values), len * sizeof(*(array))) \ +} while (0) + +#define array_insert_str(array, index, values) array_insert_many((array), (index), (values), strlen(values)) +#define array_add_many(array, index, values, len) do { \ + void* __temp = array_resize_((array), sizeof(*(array)), array_size(array) + len); \ + (array) = __temp; \ + memcpy(&array[array_size((array)) - 1], (values), len * sizeof(*(array))) \ +} while (0) + +#define array_add_str(array, index, values) array_add_many((array), (index), (values), strlen(values)) + +#define array_resize(array, size) do { \ + void* __temp = array_resize_((array), sizeof(*(array)), size); \ + (array) = __temp; \ +} while (0) -#define array_add(array, value) do { \ - void* __temp = array_add_((array), sizeof(*(array))); \ - (array) = __temp; \ - (array)[array_size((array)) - 1] = value; \ +#define array_add(array, value) do { \ + void* __temp = array_resize_((array), sizeof(*(array)), array_size(array) + 1); \ + (array) = __temp; \ + (array)[array_size((array)) - 1] = value; \ } while (0) #define array_last(array) (array)[array_size(array) - 1] -#define array_for_all(type__, name__, array__) \ -type__* CONCAT(it__, __LINE__) = array__; type__* CONCAT(end__, __LINE__) = array__ ? array__ + array_size(array__) : NULL; \ +#define array_for_all(type__, name__, array__) \ +type__* CONCAT(it__, __LINE__) = array__; type__* CONCAT(end__, __LINE__) = array__ ? array__ + array_size(array__) : NULL; \ for (type__* name__; (CONCAT(it__, __LINE__) < CONCAT(end__, __LINE__)) ? (name__ = CONCAT(it__, __LINE__), true) : false; CONCAT(it__, __LINE__)++) #endif // ARRAY_H_ @@ -126,6 +126,8 @@ void wl_keyboard_modifiers(void *data, struct wl_keyboard *wl_keyboard, uint32_t group) { client_state* state = data; xkb_state_update_mask(state->xkb_state, mods_depressed, mods_latched, mods_locked, 0, 0, group); + struct itimerspec timer = {0}; + timerfd_settime(state->key_repeat_timer_fd, 0, &timer, NULL); } void wl_keyboard_repeat_info(void *data, struct wl_keyboard *wl_keyboard, |
