summaryrefslogtreecommitdiff
path: root/src/config
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2023-10-23 10:31:31 +0000
committerLaurent Bercot <ska@appnovation.com>2023-10-23 10:31:31 +0000
commit12891d0e8551e3d6bb7bf1429f936e04be4da8b5 (patch)
tree7e4ac4bb5dc895b1b7604c8c9f76cca470964162 /src/config
parent941ff50d2183999d8f1cbd249b6a892f70091ded (diff)
downloadtipidee-12891d0e8551e3d6bb7bf1429f936e04be4da8b5.tar.xz
Refactor tipidee-config code to accommodate for headers
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src/config')
-rw-r--r--src/config/conftree.c70
-rw-r--r--src/config/defaults.c2
-rw-r--r--src/config/deps-exe/tipidee-config4
-rw-r--r--src/config/headers.c46
-rw-r--r--src/config/lexparse.c18
-rw-r--r--src/config/node.c (renamed from src/config/confnode.c)16
-rw-r--r--src/config/repo.c46
-rw-r--r--src/config/tipidee-config-internal.h59
8 files changed, 187 insertions, 74 deletions
diff --git a/src/config/conftree.c b/src/config/conftree.c
index 47bf4fb..d4b01ef 100644
--- a/src/config/conftree.c
+++ b/src/config/conftree.c
@@ -1,78 +1,56 @@
/* ISC license. */
-#include <stdint.h>
-#include <string.h>
-#include <errno.h>
-
-#include <skalibs/gensetdyn.h>
+#include <skalibs/genalloc.h>
#include <skalibs/avltree.h>
#include <skalibs/cdbmake.h>
-#include <skalibs/strerr.h>
#include "tipidee-config-internal.h"
-static void *confnode_dtok (uint32_t d, void *data)
-{
- return g.storage.s + GENSETDYN_P(confnode, (gensetdyn *)data, d)->key ;
-}
+static repo conftree = \
+{ \
+ .ga = GENALLOC_ZERO, \
+ .tree = AVLTREE_INIT(8, 3, 8, &node_dtok, &node_cmp, &conftree.ga), \
+ .storage = &g.storage \
+} ;
-static int confnode_cmp (void const *a, void const *b, void *data)
+void confnode_start (node *node, char const *key, size_t filepos, uint32_t line)
{
- (void)data ;
- return strcmp((char const *)a, (char const *)b) ;
+ return node_start(&g.storage, node, key, filepos, line) ;
}
-struct nodestore_s
+void confnode_add (node *node, char const *s, size_t len)
{
- gensetdyn set ;
- avltree tree ;
-} ;
-
-static struct nodestore_s nodestore = \
-{ \
- .set = GENSETDYN_INIT(confnode, 8, 3, 8), \
- .tree = AVLTREE_INIT(8, 3, 8, &confnode_dtok, &confnode_cmp, &nodestore.set) \
-} ;
+ return node_add(&g.storage, node, s, len) ;
+}
-confnode const *conftree_search (char const *key)
+node const *conftree_search (char const *key)
{
- uint32_t i ;
- return avltree_search(&nodestore.tree, key, &i) ? GENSETDYN_P(confnode const, &nodestore.set, i) : 0 ;
+ return repo_search(&conftree, key) ;
}
-void conftree_add (confnode const *node)
+void conftree_add (node const *node)
{
- uint32_t i ;
- if (!gensetdyn_new(&nodestore.set, &i)) dienomem() ;
- *GENSETDYN_P(confnode, &nodestore.set, i) = *node ;
- if (!avltree_insert(&nodestore.tree, i)) dienomem() ;
+ return repo_add(&conftree, node) ;
}
-void conftree_update (confnode const *node)
+void conftree_update (node const *node)
{
- uint32_t i ;
- if (avltree_search(&nodestore.tree, g.storage.s + node->key, &i))
- {
- if (!avltree_delete(&nodestore.tree, g.storage.s + node->key)) dienomem() ;
- *GENSETDYN_P(confnode, &nodestore.set, i) = *node ;
- if (!avltree_insert(&nodestore.tree, i)) dienomem() ;
- }
- else return conftree_add(node) ;
+ return repo_update(&conftree, node) ;
}
static int confnode_write (uint32_t d, unsigned int h, void *data)
{
- confnode *node = GENSETDYN_P(confnode, &nodestore.set, d) ;
+ node *nod = genalloc_s(node, &conftree.ga) + d ;
(void)h ;
- if ((g.storage.s[node->key] & ~0x20) == 'A')
+ if ((conftree.storage->s[nod->key] & ~0x20) == 'A')
{
- g.storage.s[++node->data] |= '@' ;
- node->datalen-- ;
+ conftree.storage->s[++nod->data] |= '@' ;
+ nod->datalen-- ;
}
- return cdbmake_add((cdbmaker *)data, g.storage.s + node->key, node->keylen, g.storage.s + node->data, node->datalen) ;
+ return cdbmake_add((cdbmaker *)data, conftree.storage->s + nod->key, nod->keylen, conftree.storage->s + nod->data, nod->datalen) ;
}
int conftree_write (cdbmaker *cm)
{
- return avltree_iter(&nodestore.tree, &confnode_write, cm) ;
+ return avltree_iter(&conftree.tree, &confnode_write, cm) ;
}
diff --git a/src/config/defaults.c b/src/config/defaults.c
index 69881fb..3db2ad2 100644
--- a/src/config/defaults.c
+++ b/src/config/defaults.c
@@ -103,7 +103,7 @@ void conf_defaults (void)
{
if (!conftree_search(p->key))
{
- confnode node ;
+ node node ;
confnode_start(&node, p->key, 0, 0) ;
confnode_add(&node, p->value, p->vlen) ;
conftree_add(&node) ;
diff --git a/src/config/deps-exe/tipidee-config b/src/config/deps-exe/tipidee-config
index 85a9645..55cf760 100644
--- a/src/config/deps-exe/tipidee-config
+++ b/src/config/deps-exe/tipidee-config
@@ -1,5 +1,7 @@
-confnode.o
+node.o
+repo.o
conftree.o
+headers.o
defaults.o
lexparse.o
-lskarnet
diff --git a/src/config/headers.c b/src/config/headers.c
new file mode 100644
index 0000000..7bbb573
--- /dev/null
+++ b/src/config/headers.c
@@ -0,0 +1,46 @@
+/* ISC license. */
+
+#include <skalibs/genalloc.h>
+#include <skalibs/avltree.h>
+
+#include "tipidee-config-internal.h"
+
+static stralloc headers_storage = GENALLOC_ZERO ;
+
+static repo headers = \
+{ \
+ .ga = GENALLOC_ZERO, \
+ .tree = AVLTREE_INIT(8, 3, 8, &node_dtok, &node_cmp, &headers.ga), \
+ .storage = &headers_storage \
+} ;
+
+void header_start (node *node, char const *key, size_t filepos, uint32_t line)
+{
+ return node_start(&headers_storage, node, key, filepos, line) ;
+}
+
+void header_add (node *node, char const *s, size_t len)
+{
+ return node_add(&headers_storage, node, s, len) ;
+}
+
+node const *headers_search (char const *key)
+{
+ return repo_search(&headers, key) ;
+}
+
+void headers_add (node const *node)
+{
+ return repo_add(&headers, node) ;
+}
+
+static int header_write (uint32_t d, unsigned int h, void *data)
+{
+ return 1 ;
+}
+
+int headers_write (void)
+{
+ if (!avltree_iter(&headers.tree, &header_write, 0)) return 0 ;
+ return 1 ;
+}
diff --git a/src/config/lexparse.c b/src/config/lexparse.c
index 88a9157..5fb9b71 100644
--- a/src/config/lexparse.c
+++ b/src/config/lexparse.c
@@ -73,7 +73,7 @@ static int keycmp (void const *a, void const *b)
static void check_unique (char const *key, mdt const *md)
{
- confnode const *node = conftree_search(key) ;
+ node const *node = conftree_search(key) ;
if (node)
{
char fmt[UINT32_FMT] ;
@@ -84,7 +84,7 @@ static void check_unique (char const *key, mdt const *md)
static void add_unique (char const *key, char const *value, size_t valuelen, mdt const *md)
{
- confnode node ;
+ node node ;
check_unique(key, md) ;
confnode_start(&node, key, md->filepos, md->line) ;
confnode_add(&node, value, valuelen) ;
@@ -123,7 +123,7 @@ static inline void parse_global (char const *s, size_t const *word, size_t n, md
}
case 1 : /* argv */
{
- confnode node ;
+ node node ;
check_unique(gl->key, md) ;
confnode_start(&node, gl->key, md->filepos, md->line) ;
for (size_t i = 1 ; i < n ; i++)
@@ -210,7 +210,7 @@ static inline void parse_redirect (char const *s, size_t const *word, size_t n,
if (strncmp(s + word[2], "http://", 7) && strncmp(s + word[2], "https://", 8))
strerr_dief5x(1, "redirection target must be a full http:// or https:// target", " in file ", g.storage.s + md->filepos, " line ", md->linefmt) ;
{
- confnode node ;
+ node node ;
size_t urlen = strlen(s + word[0]) ;
char key[3 + domainlen + urlen] ;
if (s[word[0] + urlen - 1] == '/') { key[0] = 'r' ; urlen-- ; } else key[0] = 'R' ;
@@ -240,7 +240,7 @@ static void parse_bitattr (char const *s, size_t const *word, size_t n, char con
if (s[*word] != '/')
strerr_dief6x(1, "resource", " must start with /", " in file ", g.storage.s + md->filepos, " line ", md->linefmt) ;
{
- confnode const *oldnode ;
+ node const *oldnode ;
size_t arglen = strlen(s + *word) ;
char key[3 + domainlen + arglen] ;
if (s[*word + arglen - 1] == '/') { key[0] = 'a' ; arglen-- ; } else key[0] = 'A' ;
@@ -264,7 +264,7 @@ static void parse_bitattr (char const *s, size_t const *word, size_t n, char con
}
else
{
- confnode node ;
+ node node ;
char val[3] = { mask, set ? mask : 0, 0 } ;
confnode_start(&node, key, md->filepos, md->line) ;
confnode_add(&node, val, 3) ;
@@ -282,7 +282,7 @@ static inline void parse_filetype (char const *s, size_t const *word, size_t n,
if (s[word[0]] != '/')
strerr_dief6x(1, "resource", " must start with /", " in file ", g.storage.s + md->filepos, " line ", md->linefmt) ;
{
- confnode const *oldnode ;
+ node const *oldnode ;
size_t arglen = strlen(s + word[0]) ;
char key[3 + domainlen + arglen] ;
if (s[word[0] + arglen - 1] == '/') { key[0] = 'a' ; arglen-- ; } else key[0] = 'A' ;
@@ -302,7 +302,7 @@ static inline void parse_filetype (char const *s, size_t const *word, size_t n,
else
{
- confnode node ;
+ node node ;
char val[2] = { g.storage.s[oldnode->data] | 0x80, g.storage.s[oldnode->data + 1] } ;
confnode_start(&node, key, md->filepos, md->line) ;
confnode_add(&node, val, 2) ;
@@ -312,7 +312,7 @@ static inline void parse_filetype (char const *s, size_t const *word, size_t n,
}
else
{
- confnode node ;
+ node node ;
char val[2] = { 0x80, 0x00 } ;
confnode_start(&node, key, md->filepos, md->line) ;
confnode_add(&node, val, 2) ;
diff --git a/src/config/confnode.c b/src/config/node.c
index abcf962..6f3fd5a 100644
--- a/src/config/confnode.c
+++ b/src/config/node.c
@@ -11,24 +11,24 @@
#define diestorage() strerr_diefu2x(100, "add node to configuration tree", ": too much data")
#define diefilepos() strerr_diefu2x(100, "add node to configuration tree", ": file too large")
-void confnode_start (confnode *node, char const *key, size_t filepos, uint32_t line)
+void node_start (stralloc *storage, node *node, char const *key, size_t filepos, uint32_t line)
{
size_t l = strlen(key) ;
- size_t k = g.storage.len ;
- if (!stralloc_catb(&g.storage, key, l + 1)) dienomem() ;
- if (g.storage.len >= UINT32_MAX) diestorage() ;
+ size_t k = storage->len ;
+ if (!stralloc_catb(storage, key, l + 1)) dienomem() ;
+ if (storage->len >= UINT32_MAX) diestorage() ;
if (filepos > UINT32_MAX) diefilepos() ;
node->key = k ;
node->keylen = l ;
- node->data = g.storage.len ;
+ node->data = storage->len ;
node->datalen = 0 ;
node->filepos = filepos ;
node->line = line ;
}
-void confnode_add (confnode *node, char const *s, size_t len)
+void node_add (stralloc *storage, node *node, char const *s, size_t len)
{
- if (!stralloc_catb(&g.storage, s, len)) dienomem() ;
- if (g.storage.len >= UINT32_MAX) diestorage() ;
+ if (!stralloc_catb(storage, s, len)) dienomem() ;
+ if (storage->len >= UINT32_MAX) diestorage() ;
node->datalen += len ;
}
diff --git a/src/config/repo.c b/src/config/repo.c
new file mode 100644
index 0000000..a3ba390
--- /dev/null
+++ b/src/config/repo.c
@@ -0,0 +1,46 @@
+/* ISC license. */
+
+#include <stdint.h>
+#include <string.h>
+
+#include <skalibs/genalloc.h>
+#include <skalibs/avltree.h>
+
+#include "tipidee-config-internal.h"
+
+void *node_dtok (uint32_t d, void *data)
+{
+ repo *r = data ;
+ return r->storage->s + genalloc_s(node, &r->ga)[d].key ;
+}
+
+int node_cmp (void const *a, void const *b, void *data)
+{
+ (void)data ;
+ return strcmp((char const *)a, (char const *)b) ;
+}
+
+node const *repo_search (repo const *r, char const *key)
+{
+ uint32_t i ;
+ return avltree_search(&r->tree, key, &i) ? genalloc_s(node const, &r->ga) + i : 0 ;
+}
+
+void repo_add (repo *r, node const *node)
+{
+ uint32_t i = genalloc_len(node, &r->ga) ;
+ if (!genalloc_append(node, &r->ga, node)) dienomem() ;
+ if (!avltree_insert(&r->tree, i)) dienomem() ;
+}
+
+void repo_update (repo *r, node const *nod)
+{
+ uint32_t i ;
+ if (avltree_search(&r->tree, r->storage->s + nod->key, &i))
+ {
+ if (!avltree_delete(&r->tree, r->storage->s + nod->key)) dienomem() ;
+ genalloc_s(node, &r->ga)[i] = *nod ;
+ if (!avltree_insert(&r->tree, i)) dienomem() ;
+ }
+ else repo_add(r, nod) ;
+}
diff --git a/src/config/tipidee-config-internal.h b/src/config/tipidee-config-internal.h
index 7ffee8a..190ac45 100644
--- a/src/config/tipidee-config-internal.h
+++ b/src/config/tipidee-config-internal.h
@@ -7,13 +7,16 @@
#include <string.h>
#include <skalibs/buffer.h>
+#include <skalibs/strerr.h>
#include <skalibs/stralloc.h>
+#include <skalibs/genalloc.h>
#include <skalibs/cdbmake.h>
+#include <skalibs/avltree.h>
#define dienomem() strerr_diefu1sys(111, "stralloc_catb")
-typedef struct confnode_s confnode, *confnode_ref ;
-struct confnode_s
+typedef struct node_s node, *node_ref ;
+struct node_s
{
uint32_t key ;
uint32_t keylen ;
@@ -22,7 +25,16 @@ struct confnode_s
uint32_t filepos ;
uint32_t line ;
} ;
-#define CONFNODE_ZERO { .key = 0, .keylen = 0, .data = 0, .datalen = 0 }
+#define NODE_ZERO { .key = 0, .keylen = 0, .data = 0, .datalen = 0 }
+
+typedef struct repo_s repo, *repo_ref ;
+struct repo_s
+{
+ genalloc ga ;
+ avltree tree ;
+ stralloc *storage ;
+} ;
+#define REPO_ZERO { .ga = GENALLOC_ZERO, .tree = AVLTREE_ZERO, .storage = 0 }
struct global_s
{
@@ -33,20 +45,42 @@ struct global_s
extern struct global_s g ;
- /* confnode */
+ /* node */
+
+extern void node_start (stralloc *, node *, char const *, size_t, uint32_t) ;
+extern void node_add (stralloc *, node *, char const *, size_t) ;
-extern void confnode_start (confnode *, char const *, size_t, uint32_t) ;
-extern void confnode_add (confnode *, char const *, size_t) ;
+
+ /* repo */
+
+extern void *node_dtok (uint32_t, void *) ;
+extern int node_cmp (void const *, void const *, void *) ;
+extern node const *repo_search (repo const *, char const *) ;
+extern void repo_add (repo *, node const *) ;
+extern void repo_update (repo *, node const *) ;
/* conftree */
-extern confnode const *conftree_search (char const *) ;
-extern void conftree_add (confnode const *) ;
-extern void conftree_update (confnode const *) ;
+extern void confnode_start (node *, char const *, size_t, uint32_t) ;
+extern void confnode_add (node *, char const *, size_t) ;
+
+extern node const *conftree_search (char const *) ;
+extern void conftree_add (node const *) ;
+extern void conftree_update (node const *) ;
extern int conftree_write (cdbmaker *) ;
+ /* headers */
+
+extern void header_start (node *, char const *, size_t, uint32_t) ;
+extern void header_add (node *, char const *, size_t) ;
+
+extern node const *headers_search (char const *) ;
+extern void headers_add (node const *) ;
+extern int headers_write (void) ;
+
+
/* lexparse */
extern void conf_lexparse (buffer *, char const *) ;
@@ -56,4 +90,11 @@ extern void conf_lexparse (buffer *, char const *) ;
extern void conf_defaults (void) ;
+
+ /* headers */
+
+extern node const *headers_search (char const *) ;
+extern void headers_add (node const *) ;
+extern void headers_finish (void) ;
+
#endif