/* grecs - Gray's Extensible Configuration System Copyright (C) 2007-2011 Sergey Poznyakoff Grecs is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. Grecs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Grecs. If not, see . */ #include #include #include #include #include #if ENABLE_NLS # include "gettext.h" #else # ifndef gettext # define gettext(msgid) msgid # endif #endif #ifndef _ # define _(msgid) gettext (msgid) #endif #ifndef N_ # define N_(s) s #endif typedef struct { char *file; int line; } grecs_locus_t; extern grecs_locus_t grecs_locus; enum grecs_data_type { grecs_type_void, grecs_type_string, grecs_type_short, grecs_type_ushort, grecs_type_int, grecs_type_uint, grecs_type_long, grecs_type_ulong, grecs_type_size, /* grecs_type_off,*/ grecs_type_time, grecs_type_bool, grecs_type_ipv4, grecs_type_cidr, grecs_type_host, grecs_type_sockaddr, grecs_type_section }; #define GRECS_LIST 0x8000 #define GRECS_TYPE_MASK 0x00ff #define GRECS_TYPE(c) ((c) & GRECS_TYPE_MASK) #define GRECS_IS_LIST(c) ((c) & GRECS_LIST) enum grecs_callback_command { grecs_callback_section_begin, grecs_callback_section_end, grecs_callback_set_value }; #define GRECS_TYPE_STRING 0 #define GRECS_TYPE_LIST 1 #define GRECS_TYPE_ARRAY 2 struct grecs_list_entry { struct grecs_list_entry *next; void *data; }; struct grecs_list { struct grecs_list_entry *head, *tail; size_t count; int (*cmp)(const void *, const void *); void (*free_entry)(void *); }; typedef struct grecs_value { int type; union { struct grecs_list *list; const char *string; struct { size_t c; struct grecs_value *v; } arg; } v; } grecs_value_t; typedef int (*grecs_callback_fn) ( enum grecs_callback_command cmd, grecs_locus_t * /* locus */, void * /* varptr */, grecs_value_t * /* value */, void * /* cb_data */ ); struct grecs_keyword { const char *ident; const char *argname; const char *docstring; enum grecs_data_type type; void *varptr; size_t offset; grecs_callback_fn callback; void *callback_data; struct grecs_keyword *kwd; }; struct grecs_sockaddr { int len; struct sockaddr *sa; }; extern void *(*grecs_malloc_fun)(size_t size); extern void *(*grecs_realloc_fun)(void *ptr, size_t size); extern void (*grecs_alloc_die_fun) (void); void *grecs_malloc(size_t size); void *grecs_zalloc(size_t size); void *grecs_calloc(size_t nmemb, size_t size); void *grecs_realloc(void *ptr, size_t size); void grecs_alloc_die(void); char *grecs_strdup(const char *str); grecs_value_t *grecs_value_dup(grecs_value_t *input); extern void grecs_print_diag(grecs_locus_t *, int, int, const char*); void grecs_warning(grecs_locus_t *locus, int errcode, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 3, 4))); void grecs_error(grecs_locus_t *locus, int errcode, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 3, 4))); void grecs_set_keywords(struct grecs_keyword *kwd); void grecs_gram_trace(int n); void grecs_lex_trace (int n); int grecs_lex_begin(const char*); void grecs_lex_end(void); int grecs_parse (const char *name); void grecs_line_begin (void); void grecs_line_add (const char *text, size_t len); char *grecs_line_finish (void); extern int grecs_string_convert (void *target, enum grecs_data_type type, const char *string, grecs_locus_t *locus); extern void grecs_process_ident (struct grecs_keyword *kwp, grecs_value_t *value, void *base, grecs_locus_t *locus); extern grecs_locus_t grecs_current_locus; extern int grecs_error_count; extern int grecs_default_port; extern const char *grecs_preprocessor; extern int grecs_log_to_stderr; extern void (*grecs_log_setup_hook) (); size_t grecs_preproc_fill_buffer (char *buf, size_t size); void grecs_preproc_add_include_dir (char *dir); int grecs_preproc_init (const char *name); void grecs_preproc_done (void); int grecs_preproc_run (const char *config_file, const char *extpp); FILE *grecs_preproc_extrn_start (const char *file, pid_t *ppid); void grecs_preproc_extrn_shutdown (pid_t pid); char *grecs_install_text (const char *str); void grecs_destroy_text (void); void grecs_include_path_setup (const char *dir, ...); void grecs_include_path_setup_v (char **dirs); const char *grecs_data_type_string (enum grecs_data_type type); void grecs_format_docstring (FILE *stream, const char *docstring, unsigned level); void grecs_format_simple_statement (FILE *stream, struct grecs_keyword *kwp, unsigned level); void grecs_format_block_statement (FILE *stream, struct grecs_keyword *kwp, unsigned level); void grecs_format_statement_array (FILE *stream, struct grecs_keyword *kwp, unsigned n, unsigned level); struct grecs_list *grecs_list_create (void); size_t grecs_list_size (struct grecs_list *lp); void grecs_list_append (struct grecs_list *lp, void *val); void grecs_list_push (struct grecs_list *lp, void *val); void *grecs_list_pop (struct grecs_list *lp); void *grecs_list_locate (struct grecs_list *lp, void *data); void *grecs_list_index (struct grecs_list *lp, size_t idx); void *grecs_list_remove_tail (struct grecs_list *lp); void grecs_list_clear (struct grecs_list *lp); void grecs_list_free (struct grecs_list *lp); int grecs_vasprintf (char **pbuf, size_t *psize, const char *fmt, va_list ap); int grecs_asprintf (char **pbuf, size_t *psize, const char *fmt, ...); struct grecs_symtab; struct grecs_syment { char *name; }; typedef int (*grecs_symtab_enumerator_t)(void *sym, void *data); const char *grecs_symtab_strerror(int rc); void *grecs_symtab_lookup_or_install(struct grecs_symtab *st, void *key, int *install); void grecs_symtab_clear(struct grecs_symtab *st); struct grecs_symtab *grecs_symtab_create(size_t elsize, unsigned (*hash_fun)(void *, unsigned long), int (*cmp_fun)(const void *, const void *), int (*copy_fun)(void *, void *), void *(*alloc_fun)(size_t), void (*free_fun)(void *)); struct grecs_symtab *grecs_symtab_create_default(size_t elsize); void grecs_symtab_free(struct grecs_symtab *pst); int grecs_symtab_remove(struct grecs_symtab *st, void *elt); int grecs_symtab_replace(struct grecs_symtab *st, void *ent, void **old_ent); int grecs_symtab_enumerate(struct grecs_symtab *st, grecs_symtab_enumerator_t fun, void *data); size_t grecs_symtab_count_entries(struct grecs_symtab *st);