X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=ucw%2Fconf-internal.h;h=7ac490fbed4fd58bfc0804c48a67ad7e6fce8398;hb=ec6703bb4d58e504fde8ea8429f9b26ab6632696;hp=d8c77d622853fec9fa5191c2381d983642a46c64;hpb=0ca8c151f5afe1680e98f3bfbe9d5c752d8a2924;p=libucw.git diff --git a/ucw/conf-internal.h b/ucw/conf-internal.h index d8c77d62..7ac490fb 100644 --- a/ucw/conf-internal.h +++ b/ucw/conf-internal.h @@ -13,6 +13,25 @@ #include +#ifdef CONFIG_UCW_CLEAN_ABI +#define cf_add_dirty ucw_cf_add_dirty +#define cf_commit_all ucw_cf_commit_all +#define cf_done_stack ucw_cf_done_stack +#define cf_find_subitem ucw_cf_find_subitem +#define cf_init_stack ucw_cf_init_stack +#define cf_interpret_line ucw_cf_interpret_line +#define cf_journal_delete ucw_cf_journal_delete +#define cf_journal_swap ucw_cf_journal_swap +#define cf_load_default ucw_cf_load_default +#define cf_obtain_context ucw_cf_obtain_context +#define cf_op_names ucw_cf_op_names +#define cf_sections ucw_cf_sections +#define cf_type_names ucw_cf_type_names +#define cf_type_size ucw_cf_type_size +#endif + +/* Item stack used by conf-intr.c */ + #define MAX_STACK_SIZE 16 struct item_stack { // used by conf-intr.c @@ -24,33 +43,52 @@ struct item_stack { // used by conf-intr.c struct cf_item *item; // cf_item of the list }; +/* List of dirty sections used by conf-section.c */ + +struct dirty_section { + struct cf_section *sec; + void *ptr; +}; + +#define GBUF_TYPE struct dirty_section +#define GBUF_PREFIX(x) dirtsec_##x +#include + +/* Configuration context */ + struct cf_context { struct mempool *pool; int is_active; - int need_journal; - char *def_file; - char *env_file; - int def_loaded; + int config_loaded; // at least one config file was loaded struct cf_parser_state *parser; - uns everything_committed; // after the 1st load, this flag is set on - uns postpone_commit; // used internally by cf_getopt() - uns other_options; - clist conf_entries; + uint everything_committed; // did we already commit each section? + uint postpone_commit; // counter of calls to cf_open_group() + uint other_options; // used internally by cf_getopt() + clist conf_entries; // files/strings to reload + struct cf_journal_item *journal; // journalling + int enable_journal; struct old_pools *pools; - struct cf_journal_item *journal; - struct item_stack stack[MAX_STACK_SIZE]; - uns stack_level; - uns initialized; + struct item_stack stack[MAX_STACK_SIZE]; // interpreter stack + uint stack_level; struct cf_section sections; // root section + uint sections_initialized; + dirtsec_t dirty; // dirty sections + uint dirties; }; /* conf-ctxt.c */ -static inline struct cf_context * -cf_get_context(void) +static inline struct cf_context *cf_get_context(void) { - return ucwlib_thread_context()->cf_context; + struct cf_context *cc = ucwlib_thread_context()->cf_context; + ASSERT(cc->is_active); + return cc; } +// In fact, this is equivalent to cf_get_context(), but it is not inlined, +// because we want to force the linker to include conf-context.c, which contains +// a constructor of the whole context mechanism. +struct cf_context *cf_obtain_context(void); + /* conf-intr.c */ #define OP_MASK 0xff // only get the operation #define OP_OPEN 0x100 // here we only get an opening brace instead of parameters @@ -60,10 +98,10 @@ enum cf_operation; extern char *cf_op_names[]; extern char *cf_type_names[]; -uns cf_type_size(enum cf_type type, struct cf_user_type *utype); +uint cf_type_size(enum cf_type type, struct cf_user_type *utype); char *cf_interpret_line(struct cf_context *cc, char *name, enum cf_operation op, int number, char **pars); void cf_init_stack(struct cf_context *cc); -int cf_check_stack(struct cf_context *cc); +int cf_done_stack(struct cf_context *cc); /* conf-journal.c */ void cf_journal_swap(void); @@ -81,4 +119,7 @@ struct cf_item *cf_find_subitem(struct cf_section *sec, const char *name); int cf_commit_all(enum cf_commit_mode cm); void cf_add_dirty(struct cf_section *sec, void *ptr); +/* conf-getopt.c */ +void cf_load_default(struct cf_context *cc); + #endif