+#include <ucw/threads.h>
+
+#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
+ struct cf_section *sec; // nested section
+ void *base_ptr; // because original pointers are often relative
+ int op; // it is performed when a closing brace is encountered
+ void *list; // list the operations should be done on
+ u32 mask; // bit array of selectors searching in a list
+ 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 <ucw/gbuf.h>
+
+/* Configuration context */
+
+struct cf_context {
+ struct mempool *pool;
+ int is_active;
+ int config_loaded; // at least one config file was loaded
+ struct cf_parser_state *parser;
+ 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 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)
+{
+ 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);
+