1
0
Files
src/status/libkeyval.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;
}