/* 2025 DTB. Public domain. */ #undef NDEBUG /* LOAD-BEARING ASSERTS! */ #include /* assert(3) */ #include /* atoi(3) */ #include /* strcmp(3) */ #include "libkeyval.h" static struct State state = { 0 }; void cpy(char *key) { state.settings[state.setting_last].key = key; state.settings[state.setting_last].val = get(key); assert(++state.setting_last < state_settings_size); } void del(char *key) { size_t i; for (i = idx(key); i < state.setting_last; ++i) { state.settings[i].key = state.settings[i + 1].key; state.settings[i].val = state.settings[i + 1].val; } --state.setting_last; } char * get(char *key) { return state.settings[idx(key)].val; } int getd(char *key) { return atoi(get(key)); } size_t idx(char *key) { size_t r; for (r = 0; state.settings[r].key != NULL && strcmp(state.settings[r].key, key) != 0; ++r); return (state.settings[r].key == NULL) ? state.setting_last : r; } void keyval_init(void) { /* Unnecessary, but means a wrong state.setting_last won't blow up. */ (void)memset(&state.settings[state.setting_last], state_settings_size - state.setting_last, '\0'); #include "settings.c" } size_t ren(char *key, char *new) { size_t i; if ((i = idx(key)) != state.setting_last) { state.settings[i].key = new; } return i; } size_t set(char *key, char *val) { size_t i; i = idx(key); state.settings[i].key = key; state.settings[i].val = val; if (i == state.setting_last) { assert(++state.setting_last < state_settings_size); } return i; }