69 lines
1.5 KiB
C
69 lines
1.5 KiB
C
/* 2025 DTB. Public domain. */
|
|
|
|
#undef NDEBUG /* LOAD-BEARING ASSERTS! */
|
|
#include <assert.h> /* assert(3) */
|
|
#include <stdlib.h> /* atoi(3) */
|
|
#include <string.h> /* 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;
|
|
}
|