49 TRACE (configitem_dbg);
52 llist_init (&self->link);
54 llist_init (&self->children);
56 llist_init (&self->lookup);
72 TRACE (configitem_dbg);
79 ENSURE (llist_is_empty (&self->children),
"destructor didn't remove children");
81 if (self->vtable && self->vtable->destroy)
82 self->vtable->destroy (self);
84 if (!llist_is_empty (&self->lookup))
87 llist_unlink (&self->link);
98 TRACE (configitem_dbg,
"%s", line);
100 lumiera_configitem tmp;
106 ? tmp.vtable->newitem (&tmp)
116 TRACE (configitem_dbg);
125 REQUIRE (self->delim);
137 TRACE (configitem_dbg);
141 llist_init (&self->link);
142 llist_insertlist_next (&self->link, &source->link);
144 self->parent = source->parent;
146 llist_init (&self->children);
147 llist_insertlist_next (&self->children, &source->children);
149 llist_init (&self->lookup);
150 llist_insertlist_next (&self->lookup, &source->lookup);
152 self->line = source->line;
155 self->key = source->key;
156 self->key_size = source->key_size;
157 self->delim = source->delim;
158 self->vtable = source->vtable;
167 TRACE (configitem_dbg);
174 char* itr = self->line;
177 while (*itr && isspace (*itr))
181 if (!*itr || *itr ==
'#' )
185 else if (*itr ==
'@' )
190 else if (*itr ==
'[' )
213 if (*itr && !isspace(*itr))
218 itr += self->key_size;
223 if ( self->key_size && ( !*itr || (*itr && isspace(*itr)) ))
228 while (*itr && isspace (*itr))
234 self->delim = itr - 1;
269 while (*itr && isspace(*itr))
278 itr += self->key_size;
282 if (self->key_size && *itr && *itr ==
']')
285 TODO(
"self->vtable = &lumiera_configsection_funcs;");
287 else if (self->key_size && *itr && isspace(*itr))
290 while (*itr && isspace(*itr))
293 if (*itr && *itr ==
']')
297 self->delim = itr - 1;
298 TODO(
"self->vtable = &lumiera_configsection_funcs;");
302 TODO(
"check wheter suffix is made of legal characters");
306 self->delim = itr - 1;
307 TODO(
"self->vtable = &lumiera_configsection_funcs;");
344 itr += self->key_size;
345 while (*itr && isspace (*itr))
348 if (self->key_size && *itr ==
'=')
354 else if (self->key_size && *itr ==
'<')
LumieraConfigitem lumiera_config_lookup_remove(LumieraConfigLookup self, LumieraConfigitem item)
Remove a config item from a lookup structure.
lumiera_config_lookup * LumieraConfigLookup
Interface for a lumiera configuration system (draft).
#define LUMIERA_CONFIG_KEY_CHARS
struct lumiera_configitem_vtable lumiera_configentry_funcs
Draft for a configuration system (2008).
LumieraConfigitem lumiera_configitem_set_value(LumieraConfigitem self, const char *delim_value)
LumieraConfigitem lumiera_configitem_new(const char *line)
void lumiera_configitem_delete(LumieraConfigitem self, LumieraConfigLookup lookup)
LumieraConfigitem lumiera_configitem_parse(LumieraConfigitem self, const char *line)
LumieraConfigitem lumiera_configitem_destroy(LumieraConfigitem self, LumieraConfigLookup lookup)
LumieraConfigitem lumiera_configitem_init(LumieraConfigitem self)
LumieraConfigitem lumiera_configitem_move(LumieraConfigitem self, LumieraConfigitem source)
static LumieraConfigitem parse_directive(LumieraConfigitem self, char *itr)
static LumieraConfigitem parse_configentry(LumieraConfigitem self, char *itr)
static LumieraConfigitem parse_section(LumieraConfigitem self, char *itr)
Draft for a configuration system (2008).
lumiera_configitem * LumieraConfigitem
#define LUMIERA_ERROR_SET(flag, err, extra)
Helper macro to raise an error for the current thread.
Intrusive cyclic double linked list There is only one node type which contains a forward and a backwa...
#define LLIST_WHILE_HEAD(list, head)
Consume a list from head.
This header is for including and configuring NoBug.
char * lumiera_strndup(const char *str, size_t len)
Duplicate a C string.
void * lumiera_malloc(size_t size)
Allocate memory.
Portable and safe wrappers around some C-Lib functions.
static void lumiera_free(void *mem)
Free previously allocated memory.
char * lumiera_tmpbuf_snprintf(size_t size, const char *fmt,...)
Construct a string in a tmpbuf.
Round robin temporary buffers.