]> mj.ucw.cz Git - libucw.git/blob - ucw/conf-internal.h
cfd2dbde8db99ac0af9caf0694cb16aeca3b507d
[libucw.git] / ucw / conf-internal.h
1 /*
2  *      UCW Library -- Configuration files: only for internal use of conf-*.c
3  *
4  *      (c) 2001--2006 Robert Spalek <robert@ucw.cz>
5  *      (c) 2003--2012 Martin Mares <mj@ucw.cz>
6  *
7  *      This software may be freely distributed and used according to the terms
8  *      of the GNU Lesser General Public License.
9  */
10
11 #ifndef _UCW_CONF_INTERNAL_H
12 #define _UCW_CONF_INTERNAL_H
13
14 #include <ucw/threads.h>
15
16 /* Item stack used by conf-intr.c */
17
18 #define MAX_STACK_SIZE 16
19
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
27 };
28
29 /* List of dirty sections used by conf-section.c */
30
31 struct dirty_section {
32   struct cf_section *sec;
33   void *ptr;
34 };
35
36 #define GBUF_TYPE       struct dirty_section
37 #define GBUF_PREFIX(x)  dirtsec_##x
38 #include <ucw/gbuf.h>
39
40 /* Configuration context */
41
42 struct cf_context {
43   struct mempool *pool;
44   int is_active;
45   int need_journal;
46   char *def_file;
47   char *env_file;
48   int def_loaded;
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()
52   uns other_options;
53   clist conf_entries;
54   struct old_pools *pools;
55   struct cf_journal_item *journal;
56   struct item_stack stack[MAX_STACK_SIZE];
57   uns stack_level;
58   uns initialized;
59   struct cf_section sections;           // root section
60   dirtsec_t dirty;                      // dirty sections
61   uns dirties;
62 };
63
64 /* conf-ctxt.c */
65 static inline struct cf_context *
66 cf_get_context(void)
67 {
68   return ucwlib_thread_context()->cf_context;
69 }
70
71 /* conf-intr.c */
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
76 enum cf_operation;
77 extern char *cf_op_names[];
78 extern char *cf_type_names[];
79
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);
84
85 /* conf-journal.c */
86 void cf_journal_swap(void);
87 void cf_journal_delete(void);
88
89 /* conf-section.c */
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;
96
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);
100
101 #endif