2 * UCW Library -- Configuration files: only for internal use of conf-*.c
4 * (c) 2001--2006 Robert Spalek <robert@ucw.cz>
5 * (c) 2003--2012 Martin Mares <mj@ucw.cz>
7 * This software may be freely distributed and used according to the terms
8 * of the GNU Lesser General Public License.
11 #ifndef _UCW_CONF_INTERNAL_H
12 #define _UCW_CONF_INTERNAL_H
14 #include <ucw/threads.h>
16 /* Item stack used by conf-intr.c */
18 #define MAX_STACK_SIZE 16
20 struct item_stack { // used by conf-intr.c
21 struct cf_section *sec; // nested section
22 void *base_ptr; // because original pointers are often relative
23 int op; // it is performed when a closing brace is encountered
24 void *list; // list the operations should be done on
25 u32 mask; // bit array of selectors searching in a list
26 struct cf_item *item; // cf_item of the list
29 /* List of dirty sections used by conf-section.c */
31 struct dirty_section {
32 struct cf_section *sec;
36 #define GBUF_TYPE struct dirty_section
37 #define GBUF_PREFIX(x) dirtsec_##x
40 /* Configuration context */
49 struct cf_parser_state *parser;
50 uns everything_committed; // after the 1st load, this flag is set on
51 uns postpone_commit; // used internally by cf_getopt()
54 struct old_pools *pools;
55 struct cf_journal_item *journal;
56 struct item_stack stack[MAX_STACK_SIZE];
59 struct cf_section sections; // root section
60 dirtsec_t dirty; // dirty sections
65 static inline struct cf_context *
68 return ucwlib_thread_context()->cf_context;
72 #define OP_MASK 0xff // only get the operation
73 #define OP_OPEN 0x100 // here we only get an opening brace instead of parameters
74 #define OP_1ST 0x200 // in the 1st phase selectors are recorded into the mask
75 #define OP_2ND 0x400 // in the 2nd phase real data are entered
77 extern char *cf_op_names[];
78 extern char *cf_type_names[];
80 uns cf_type_size(enum cf_type type, struct cf_user_type *utype);
81 char *cf_interpret_line(struct cf_context *cc, char *name, enum cf_operation op, int number, char **pars);
82 void cf_init_stack(struct cf_context *cc);
83 int cf_check_stack(struct cf_context *cc);
86 void cf_journal_swap(void);
87 void cf_journal_delete(void);
90 #define SEC_FLAG_DYNAMIC 0x80000000 // contains a dynamic attribute
91 #define SEC_FLAG_UNKNOWN 0x40000000 // ignore unknown entriies
92 #define SEC_FLAG_CANT_COPY 0x20000000 // contains lists or parsers
93 #define SEC_FLAG_NUMBER 0x0fffffff // number of entries
94 enum cf_commit_mode { CF_NO_COMMIT, CF_COMMIT, CF_COMMIT_ALL };
95 extern struct cf_section cf_sections;
97 struct cf_item *cf_find_subitem(struct cf_section *sec, const char *name);
98 int cf_commit_all(enum cf_commit_mode cm);
99 void cf_add_dirty(struct cf_section *sec, void *ptr);