From df5898083dcd28b33ec3ace15cd942ce546c137b Mon Sep 17 00:00:00 2001
From: obarun <eric@obarun.org>
Date: Sat, 4 Dec 2021 20:52:38 +1100
Subject: [PATCH] implement resolve API for a tree

---
 src/include/66/tree.h    |  51 +++++++++++--
 src/lib66/tree_resolve.c | 159 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 205 insertions(+), 5 deletions(-)
 create mode 100644 src/lib66/tree_resolve.c

diff --git a/src/include/66/tree.h b/src/include/66/tree.h
index e415f14a..e2398bab 100644
--- a/src/include/66/tree.h
+++ b/src/include/66/tree.h
@@ -18,12 +18,38 @@
 #include <sys/types.h>
 
 #include <skalibs/stralloc.h>
+#include <skalibs/cdb.h>
+#include <skalibs/cdbmake.h>
+
 #include <66/ssexec.h>
 
+#define TREE_STRUCT 1
+
+typedef struct resolve_tree_s resolve_tree_t, *resolve_tree_t_ref ;
+struct resolve_tree_s
+{
+    uint32_t salen ;
+    stralloc sa ;
+
+    uint32_t name ;
+    uint32_t depends ;
+    uint32_t requiredby ;
+    uint32_t allow ;
+    uint32_t contents ;
+
+    uint32_t ndepends ;
+    uint32_t nrequiredby ;
+    uint32_t ncontents ;
+    uint32_t current ;//no->0, yes->1
+    uint32_t init ;//not initialized->0, initialized->1
+    uint32_t disen ;//disable->0, enable->1
+} ;
+#define RESOLVE_TREE_ZERO { 0,STRALLOC_ZERO,0,0,0,0,0,0,0,0,0,0,0 }
+
 extern stralloc saseed ;
 
-typedef struct ss_tree_seed_s ss_tree_seed_t, ss_tree_seed_t_ref ;
-struct ss_tree_seed_s
+typedef struct tree_seed_s tree_seed_t, tree_seed_t_ref ;
+struct tree_seed_s
 {
     int name ;
     int depends ;
@@ -37,7 +63,6 @@ struct ss_tree_seed_s
     uint8_t nopts ;
 
 } ;
-
 #define TREE_SEED_ZERO { -1, -1, -1, 0, -1, -1, 0, -1, -1, 0 }
 
 extern int tree_cmd_state(unsigned int verbosity,char const *cmd,char const *tree) ;
@@ -65,8 +90,24 @@ extern int tree_switch_current(char const *base, char const *tree) ;
 
 extern int tree_isvalid(ssexec_t *info) ;
 
-// seed
+/**
+ *
+ * Resolve API
+ *
+ * */
+
+extern int tree_read_cdb(cdb *c, resolve_tree_t *tres) ;
+extern int tree_write_cdb(cdbmaker *c, resolve_tree_t *tres) ;
+extern int tree_resolve_copy(resolve_tree_t *dst, resolve_tree_t *tres) ;
+
+/**
+ *
+ * Seed API
+ *
+ * */
+
 extern void tree_seed_free(void) ;
-extern int tree_seed_setseed(ss_tree_seed_t *seed, char const *treename, uint8_t check_service) ;
+extern int tree_seed_setseed(tree_seed_t *seed, char const *treename, uint8_t check_service) ;
 extern int tree_seed_isvalid(char const *seed) ;
+
 #endif
diff --git a/src/lib66/tree_resolve.c b/src/lib66/tree_resolve.c
new file mode 100644
index 00000000..81ebe9ad
--- /dev/null
+++ b/src/lib66/tree_resolve.c
@@ -0,0 +1,159 @@
+/*
+ * tree_resolve.c
+ *
+ * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
+ *
+ * All rights reserved.
+ *
+ * This file is part of Obarun. It is subject to the license terms in
+ * the LICENSE file found in the top-level directory of this
+ * distribution.
+ * This file may not be copied, modified, propagated, or distributed
+ * except according to the terms contained in the LICENSE file./
+ */
+
+#include <stdint.h>
+#include <stddef.h>
+#include <stdlib.h>//free
+
+#include <oblibs/log.h>
+
+#include <skalibs/stralloc.h>
+#include <skalibs/cdbmake.h>
+#include <skalibs/cdb.h>
+
+#include <66/tree.h>
+#include <66/resolve.h>
+
+int tree_read_cdb(cdb *c, resolve_tree_t *tres)
+{
+    log_flow() ;
+
+    stralloc tmp = STRALLOC_ZERO ;
+    resolve_wrapper_t_ref wres ;
+    uint32_t x ;
+
+    wres = resolve_set_struct(SERVICE_STRUCT, tres) ;
+
+    resolve_init(wres) ;
+
+    /* name */
+    resolve_find_cdb(&tmp,c,"name") ;
+    tres->name = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
+
+    /* depends */
+    resolve_find_cdb(&tmp,c,"depends") ;
+    tres->depends = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
+
+    /* requiredby */
+    resolve_find_cdb(&tmp,c,"requiredby") ;
+    tres->requiredby = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
+
+    /* allow */
+    resolve_find_cdb(&tmp,c,"allow") ;
+    tres->allow = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
+
+    /* contents */
+    resolve_find_cdb(&tmp,c,"contents") ;
+    tres->contents = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
+
+    /* ndepends */
+    x = resolve_find_cdb(&tmp,c,"ndepends") ;
+    tres->ndepends = x ;
+
+    /* nrequiredby */
+    x = resolve_find_cdb(&tmp,c,"nrequiredby") ;
+    tres->nrequiredby = x ;
+
+    /* ncontents */
+    x = resolve_find_cdb(&tmp,c,"ncontents") ;
+    tres->ncontents = x ;
+
+    /* current */
+    x = resolve_find_cdb(&tmp,c,"current") ;
+    tres->current = x ;
+
+    /* init */
+    x = resolve_find_cdb(&tmp,c,"init") ;
+    tres->init = x ;
+
+    /* disen */
+    x = resolve_find_cdb(&tmp,c,"disen") ;
+    tres->disen = x ;
+
+    free(wres) ;
+    stralloc_free(&tmp) ;
+
+    return 1 ;
+}
+
+int tree_write_cdb(cdbmaker *c, resolve_tree_t *tres)
+{
+    log_flow() ;
+
+    char *str = tres->sa.s ;
+
+    /* name */
+    if (!resolve_add_cdb(c,"name",str + tres->name) ||
+
+    /* depends */
+    !resolve_add_cdb(c,"depends",str + tres->depends) ||
+
+    /* requiredby */
+    !resolve_add_cdb(c,"requiredby",str + tres->requiredby) ||
+
+    /* allow */
+    !resolve_add_cdb(c,"allow",str + tres->allow) ||
+
+    /* contents */
+    !resolve_add_cdb(c,"contents",str + tres->contents) ||
+
+    /* ndepends */
+    !resolve_add_cdb_uint(c,"ndepends",tres->ndepends) ||
+
+    /* nrequiredby */
+    !resolve_add_cdb_uint(c,"nrequiredby",tres->nrequiredby) ||
+
+    /* ncontents */
+    !resolve_add_cdb_uint(c,"ncontents",tres->ncontents) ||
+
+    /* current */
+    !resolve_add_cdb_uint(c,"current",tres->current) ||
+
+    /* init */
+    !resolve_add_cdb_uint(c,"init",tres->init) ||
+
+    /* disen */
+    !resolve_add_cdb_uint(c,"disen",tres->disen)) return 0 ;
+
+    return 1 ;
+}
+
+int tree_resolve_copy(resolve_tree_t *dst, resolve_tree_t *tres)
+{
+    log_flow() ;
+
+    stralloc_free(&dst->sa) ;
+
+    size_t len = tres->sa.len - 1 ;
+    dst->salen = tres->salen ;
+
+    if (!stralloc_catb(&dst->sa,tres->sa.s,len) ||
+        !stralloc_0(&dst->sa))
+            return 0 ;
+
+    dst->name = tres->name ;
+    dst->depends = tres->depends ;
+    dst->requiredby = tres->requiredby ;
+    dst->allow = tres->allow ;
+    dst->contents = tres->contents ;
+    dst->ndepends = tres->ndepends ;
+    dst->nrequiredby = tres->nrequiredby ;
+    dst->ncontents = tres->ncontents ;
+    dst->current = tres->current ;
+    dst->init = tres->init ;
+    dst->disen = tres->disen ;
+
+    return 1 ;
+
+}
-- 
GitLab