* UCW Library -- Configuration files: sections
*
* (c) 2001--2006 Robert Spalek <robert@ucw.cz>
- * (c) 2003--2012 Martin Mares <mj@ucw.cz>
+ * (c) 2003--2014 Martin Mares <mj@ucw.cz>
*
* This software may be freely distributed and used according to the terms
* of the GNU Lesser General Public License.
#include <ucw/conf-internal.h>
#include <ucw/clists.h>
#include <ucw/binsearch.h>
+#include <ucw/gary.h>
#include <string.h>
}
void
-cf_declare_section(const char *name, struct cf_section *sec, uns allow_unknown)
+cf_declare_rel_section(const char *name, struct cf_section *sec, void *ptr, uint allow_unknown)
{
struct cf_context *cc = cf_obtain_context();
if (!cc->sections.cfg)
ci->cls = CC_SECTION;
ci->name = name;
ci->number = 1;
- ci->ptr = NULL;
+ ci->ptr = ptr;
ci->u.sec = sec;
inspect_section(sec);
if (allow_unknown)
}
void
-cf_init_section(const char *name, struct cf_section *sec, void *ptr, uns do_bzero)
+cf_declare_section(const char *name, struct cf_section *sec, uint allow_unknown)
+{
+ cf_declare_rel_section(name, sec, NULL, allow_unknown);
+}
+
+void
+cf_init_section(const char *name, struct cf_section *sec, void *ptr, uint do_bzero)
{
if (do_bzero) {
ASSERT(sec->size);
clist_init(ptr + (uintptr_t) ci->ptr);
else if (ci->cls == CC_DYNAMIC) {
void **dyn = ptr + (uintptr_t) ci->ptr;
- if (!*dyn) { // replace NULL by an empty array
- static uns zero = 0;
- *dyn = (&zero) + 1;
- }
+ if (!*dyn) // replace NULL by an empty array
+ *dyn = GARY_FOREVER_EMPTY;
}
if (sec->init) {
char *msg = sec->init(ptr);
}
static char *
-commit_section(struct cf_section *sec, void *ptr, uns commit_all)
+commit_section(struct cf_section *sec, void *ptr, uint commit_all)
{
struct cf_context *cc = cf_get_context();
char *err;
return "commit of a subsection failed";
}
} else if (ci->cls == CC_LIST) {
- uns idx = 0;
+ uint idx = 0;
CLIST_FOR_EACH(cnode *, n, * (clist*) (ptr + (uintptr_t) ci->ptr))
if (idx++, err = commit_section(ci->u.sec, n, commit_all)) {
msg(L_ERROR, "Cannot commit node #%d of list %s: %s", idx, ci->name, err);
* hence we need to call them in a fixed order. */
#define ARY_LT_X(ary,i,x) ary[i].sec < x.sec || ary[i].sec == x.sec && ary[i].ptr < x.ptr
struct dirty_section comp = { sec, ptr };
- uns pos = BIN_SEARCH_FIRST_GE_CMP(cc->dirty.ptr, cc->dirties, comp, ARY_LT_X);
+ uint pos = BIN_SEARCH_FIRST_GE_CMP(cc->dirty.ptr, cc->dirties, comp, ARY_LT_X);
if (commit_all
|| (pos < cc->dirties && cc->dirty.ptr[pos].sec == sec && cc->dirty.ptr[pos].ptr == ptr))