Workshop o mikrokontrolérech na SKSP 2024.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

127 lines
4.1 KiB

2 months ago
/*
* UCW Library -- Configuration files: only for internal use of conf-*.c
*
* (c) 2001--2006 Robert Spalek <robert@ucw.cz>
* (c) 2003--2012 Martin Mares <mj@ucw.cz>
* (c) 2014 Pavel Charvat <pchar@ucw.cz>
*
* This software may be freely distributed and used according to the terms
* of the GNU Lesser General Public License.
*/
#ifndef _UCW_CONF_INTERNAL_H
#define _UCW_CONF_INTERNAL_H
#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);
/* 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
#define OP_1ST 0x200 // in the 1st phase selectors are recorded into the mask
#define OP_2ND 0x400 // in the 2nd phase real data are entered
enum cf_operation;
extern char *cf_op_names[];
extern char *cf_type_names[];
uint cf_type_size(enum cf_type type, const union cf_union *u);
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_done_stack(struct cf_context *cc);
/* conf-journal.c */
void cf_journal_swap(void);
void cf_journal_delete(void);
/* conf-section.c */
#define SEC_FLAG_DYNAMIC 0x80000000 // contains a dynamic attribute
#define SEC_FLAG_UNKNOWN 0x40000000 // ignore unknown entriies
#define SEC_FLAG_CANT_COPY 0x20000000 // contains lists or parsers
#define SEC_FLAG_NUMBER 0x0fffffff // number of entries
enum cf_commit_mode { CF_NO_COMMIT, CF_COMMIT, CF_COMMIT_ALL };
extern struct cf_section cf_sections;
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