Main Page | Data Structures | File List | Data Fields | Globals | Examples

confuse.h

Go to the documentation of this file.
00001 /* Configuration file parser -*- tab-width: 4; -*- 00002 * 00003 * $Id: confuse.h,v 1.15 2004/05/22 13:00:39 mhe Exp $ 00004 * 00005 * Copyright (c) 2002-2003, Martin Hedenfalk <mhe@home.se> 00006 * 00007 * This library is free software; you can redistribute it and/or 00008 * modify it under the terms of the GNU Lesser General Public 00009 * License as published by the Free Software Foundation; either 00010 * version 2.1 of the License, or (at your option) any later version. 00011 * 00012 * This library is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 * Lesser General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU Lesser General Public 00018 * License along with this library; if not, write to the Free Software 00019 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00020 */ 00021 00041 #ifndef _cfg_h_ 00042 #define _cfg_h_ 00043 00044 #ifdef __cplusplus 00045 extern "C" { 00046 #endif 00047 00048 #include <stdio.h> 00049 #include <stdarg.h> 00050 00051 #ifdef _WIN32 00052 00053 # ifdef HAVE__FILENO 00054 # define fileno _fileno 00055 # endif 00056 # include <io.h> 00057 # ifdef HAVE__ISATTY 00058 # define isatty _isatty 00059 # endif 00060 00061 # ifdef BUILDING_DLL 00062 # define DLLIMPORT __declspec (dllexport) 00063 # else /* Not BUILDING_DLL */ 00064 # define DLLIMPORT __declspec (dllimport) 00065 # endif /* Not BUILDING_DLL */ 00066 00067 #else /* ! _WIN32 */ 00068 # define DLLIMPORT 00069 00070 #endif /* _WIN32 */ 00071 00072 #ifndef __BORLANDC__ 00073 # define __export 00074 #endif 00075 00077 enum cfg_type_t { 00078 CFGT_NONE, 00079 CFGT_INT, 00080 CFGT_FLOAT, 00081 CFGT_STR, 00082 CFGT_BOOL, 00083 CFGT_SEC, 00084 CFGT_FUNC, 00085 CFGT_PTR 00086 }; 00087 typedef enum cfg_type_t cfg_type_t; 00088 00090 #define CFGF_NONE 0 00091 #define CFGF_MULTI 1 00092 #define CFGF_LIST 2 00093 #define CFGF_NOCASE 4 00094 #define CFGF_TITLE 8 00095 #define CFGF_RESET 32 00096 #define CFGF_DEFINIT 64 00097 00099 #define CFG_SUCCESS 0 00100 #define CFG_FILE_ERROR -1 00101 #define CFG_PARSE_ERROR 1 00102 00103 typedef union cfg_value_t cfg_value_t; 00104 typedef struct cfg_opt_t cfg_opt_t; 00105 typedef struct cfg_t cfg_t; 00106 typedef struct cfg_defvalue_t cfg_defvalue_t; 00107 typedef int cfg_flag_t; 00108 00134 typedef int (*cfg_func_t)(cfg_t *cfg, cfg_opt_t *opt, 00135 int argc, const char **argv); 00136 00157 typedef void (*cfg_print_func_t)(cfg_opt_t *opt, unsigned int index, FILE *fp); 00158 00180 typedef int (*cfg_callback_t)(cfg_t *cfg, cfg_opt_t *opt, 00181 const char *value, void *result); 00182 00196 typedef int (*cfg_validate_callback_t)(cfg_t *cfg, cfg_opt_t *opt); 00197 00206 typedef void (*cfg_free_func_t)(void *value); 00207 00209 typedef enum {cfg_false, cfg_true} cfg_bool_t; 00210 00212 typedef void (*cfg_errfunc_t)(cfg_t *cfg, const char *fmt, va_list ap); 00213 00218 struct cfg_t { 00219 cfg_flag_t flags; 00220 char *name; 00223 cfg_opt_t *opts; 00224 char *title; 00226 char *filename; 00227 int line; 00228 cfg_errfunc_t errfunc; 00231 }; 00232 00235 union cfg_value_t { 00236 long int number; 00237 double fpnumber; 00238 cfg_bool_t boolean; 00239 char *string; 00240 cfg_t *section; 00241 void *ptr; 00242 }; 00243 00247 struct cfg_defvalue_t { 00248 long int number; 00249 double fpnumber; 00250 cfg_bool_t boolean; 00251 char *string; 00252 char *parsed; 00255 }; 00256 00261 struct cfg_opt_t { 00262 char *name; 00263 cfg_type_t type; 00264 unsigned int nvalues; 00265 cfg_value_t **values; 00266 cfg_flag_t flags; 00267 cfg_opt_t *subopts; 00268 cfg_defvalue_t def; 00269 cfg_func_t func; 00270 void *simple_value; 00273 cfg_callback_t parsecb; 00274 cfg_validate_callback_t validcb; 00275 cfg_print_func_t pf; 00276 cfg_free_func_t freecb; /***< user-defined memory release function */ 00277 }; 00278 00279 extern const char __export confuse_copyright[]; 00280 extern const char __export confuse_version[]; 00281 extern const char __export confuse_author[]; 00282 00283 #define __CFG_STR(name, def, flags, svalue, cb) \ 00284 {name,CFGT_STR,0,0,flags,0,{0,0,cfg_false,def,0},0,svalue,cb,0,0,0} 00285 #define __CFG_STR_LIST(name, def, flags, svalue, cb) \ 00286 {name,CFGT_STR,0,0,flags | CFGF_LIST,0,{0,0,cfg_false,0,def},0,svalue,cb,0,0,0} 00287 00290 #define CFG_STR(name, def, flags) \ 00291 __CFG_STR(name, def, flags, 0, 0) 00292 00295 #define CFG_STR_LIST(name, def, flags) \ 00296 __CFG_STR_LIST(name, def, flags, 0, 0) 00297 00300 #define CFG_STR_CB(name, def, flags, cb) \ 00301 __CFG_STR(name, def, flags, 0, cb) 00302 00305 #define CFG_STR_LIST_CB(name, def, flags, cb) \ 00306 __CFG_STR_LIST(name, def, flags, 0, cb) 00307 00360 #define CFG_SIMPLE_STR(name, svalue) \ 00361 __CFG_STR(name, 0, CFGF_NONE, svalue, 0) 00362 00363 00364 #define __CFG_INT(name, def, flags, svalue, cb) \ 00365 {name,CFGT_INT,0,0,flags,0,{def,0,cfg_false,0,0},0,svalue,cb,0,0,0} 00366 #define __CFG_INT_LIST(name, def, flags, svalue, cb) \ 00367 {name,CFGT_INT,0,0,flags | CFGF_LIST,0,{0,0,cfg_false,0,def},0,svalue,cb,0,0,0} 00368 00371 #define CFG_INT(name, def, flags) \ 00372 __CFG_INT(name, def, flags, 0, 0) 00373 00376 #define CFG_INT_LIST(name, def, flags) \ 00377 __CFG_INT_LIST(name, def, flags, 0, 0) 00378 00381 #define CFG_INT_CB(name, def, flags, cb) \ 00382 __CFG_INT(name, def, flags, 0, cb) 00383 00386 #define CFG_INT_LIST_CB(name, def, flags, cb) \ 00387 __CFG_INT_LIST(name, def, flags, 0, cb) 00388 00392 #define CFG_SIMPLE_INT(name, svalue) \ 00393 __CFG_INT(name, 0, CFGF_NONE, svalue, 0) 00394 00395 00396 00397 #define __CFG_FLOAT(name, def, flags, svalue, cb) \ 00398 {name,CFGT_FLOAT,0,0,flags,0,{0,def,cfg_false,0,0},0,svalue,cb,0,0,0} 00399 #define __CFG_FLOAT_LIST(name, def, flags, svalue, cb) \ 00400 {name,CFGT_FLOAT,0,0,flags | CFGF_LIST,0,{0,0,cfg_false,0,def},0,svalue,cb,0,0,0} 00401 00404 #define CFG_FLOAT(name, def, flags) \ 00405 __CFG_FLOAT(name, def, flags, 0, 0) 00406 00409 #define CFG_FLOAT_LIST(name, def, flags) \ 00410 __CFG_FLOAT_LIST(name, def, flags, 0, 0) 00411 00414 #define CFG_FLOAT_CB(name, def, flags, cb) \ 00415 __CFG_FLOAT(name, def, flags, 0, cb) 00416 00419 #define CFG_FLOAT_LIST_CB(name, def, flags, cb) \ 00420 __CFG_FLOAT_LIST(name, def, flags, 0, cb) 00421 00425 #define CFG_SIMPLE_FLOAT(name, svalue) \ 00426 __CFG_FLOAT(name, 0, CFGF_NONE, svalue, 0) 00427 00428 00429 00430 #define __CFG_BOOL(name, def, flags, svalue, cb) \ 00431 {name,CFGT_BOOL,0,0,flags,0,{0,0,def,0,0},0,svalue,cb,0,0,0} 00432 #define __CFG_BOOL_LIST(name, def, flags, svalue, cb) \ 00433 {name,CFGT_BOOL,0,0,flags | CFGF_LIST,0,{0,0,cfg_false,0,def},0,svalue,cb,0,0,0} 00434 00437 #define CFG_BOOL(name, def, flags) \ 00438 __CFG_BOOL(name, def, flags, 0, 0) 00439 00442 #define CFG_BOOL_LIST(name, def, flags) \ 00443 __CFG_BOOL_LIST(name, def, flags, 0, 0) 00444 00447 #define CFG_BOOL_CB(name, def, flags, cb) \ 00448 __CFG_BOOL(name, def, flags, 0, cb) 00449 00452 #define CFG_BOOL_LIST_CB(name, def, flags, cb) \ 00453 __CFG_BOOL_LIST(name, def, flags, 0, cb) 00454 00458 #define CFG_SIMPLE_BOOL(name, svalue) \ 00459 __CFG_BOOL(name, cfg_false, CFGF_NONE, svalue, 0) 00460 00461 00462 00474 #define CFG_SEC(name, opts, flags) \ 00475 {name,CFGT_SEC,0,0,flags,opts,{0,0,cfg_false,0,0},0,0,0,0,0,0} 00476 00477 00478 00485 #define CFG_FUNC(name, func) \ 00486 {name,CFGT_FUNC,0,0,CFGF_NONE,0,{0,0,cfg_false,0,0},func,0,0,0,0,0} 00487 00488 00489 #define __CFG_PTR(name, def, flags, svalue, parsecb, freecb) \ 00490 {name,CFGT_PTR,0,0,flags,0,{0,0,cfg_false,0,def},0,svalue,parsecb,0,0,freecb} 00491 #define __CFG_PTR_LIST(name, def, flags, svalue, parsecb, freecb) \ 00492 {name,CFGT_PTR,0,0,flags | CFGF_LIST,0,{0,0,cfg_false,0,def},0,svalue,parsecb,0,0,freecb} 00493 00497 #define CFG_PTR_CB(name, def, flags, parsecb, freecb) \ 00498 __CFG_PTR(name, def, flags, 0, parsecb, freecb) 00499 00500 #define CFG_PTR_LIST_CB(name, def, flags, parsecb, freecb) \ 00501 __CFG_PTR(name, def, flags | CFGF_LIST, 0, parsecb, freecb) 00502 00503 /*#define CFG_SIMPLE_PTR(name, svalue, cb) \ 00504 __CFG_PTR(name, 0, 0, svalue, cb)*/ 00505 00506 00510 #define CFG_END() \ 00511 {0,CFGT_NONE,0,0,CFGF_NONE,0,{0,0,cfg_false,0,0},0,0,0,0,0,0} 00512 00513 00514 00531 DLLIMPORT cfg_t * __export cfg_init(cfg_opt_t *opts, cfg_flag_t flags); 00532 00546 DLLIMPORT int __export cfg_parse(cfg_t *cfg, const char *filename); 00547 00558 DLLIMPORT int __export cfg_parse_fp(cfg_t *cfg, FILE *fp); 00559 00568 DLLIMPORT int __export cfg_parse_buf(cfg_t *cfg, const char *buf); 00569 00575 DLLIMPORT void __export cfg_free_value(cfg_opt_t *opt); 00576 00580 DLLIMPORT void __export cfg_free(cfg_t *cfg); 00581 00585 DLLIMPORT cfg_errfunc_t __export cfg_set_error_function(cfg_t *cfg, 00586 cfg_errfunc_t errfunc); 00587 00591 DLLIMPORT void __export cfg_error(cfg_t *cfg, const char *fmt, ...); 00592 00598 DLLIMPORT signed long cfg_opt_getnint(cfg_opt_t *opt, unsigned int index); 00599 00606 DLLIMPORT long int __export cfg_getnint(cfg_t *cfg, const char *name, 00607 unsigned int index); 00608 00618 DLLIMPORT long int __export cfg_getint(cfg_t *cfg, const char *name); 00619 00625 DLLIMPORT double cfg_opt_getnfloat(cfg_opt_t *opt, unsigned int index); 00626 00633 DLLIMPORT double __export cfg_getnfloat(cfg_t *cfg, const char *name, 00634 unsigned int index); 00635 00644 DLLIMPORT double __export cfg_getfloat(cfg_t *cfg, const char *name); 00645 00651 DLLIMPORT char *cfg_opt_getnstr(cfg_opt_t *opt, unsigned int index); 00652 00659 DLLIMPORT char * __export cfg_getnstr(cfg_t *cfg, const char *name, 00660 unsigned int index); 00661 00670 DLLIMPORT char * __export cfg_getstr(cfg_t *cfg, const char *name); 00671 00677 DLLIMPORT cfg_bool_t cfg_opt_getnbool(cfg_opt_t *opt, unsigned int index); 00678 00686 DLLIMPORT cfg_bool_t __export cfg_getnbool(cfg_t *cfg, const char *name, 00687 unsigned int index); 00688 00697 DLLIMPORT cfg_bool_t __export cfg_getbool(cfg_t *cfg, const char *name); 00698 00699 00700 DLLIMPORT void *cfg_opt_getnptr(cfg_opt_t *opt, unsigned int index); 00701 DLLIMPORT void *cfg_getnptr(cfg_t *cfg, const char *name, unsigned int indx); 00702 DLLIMPORT void *cfg_getptr(cfg_t *cfg, const char *name); 00703 00704 00710 DLLIMPORT cfg_t *cfg_opt_getnsec(cfg_opt_t *opt, unsigned int index); 00711 00720 DLLIMPORT cfg_t * __export cfg_getnsec(cfg_t *cfg, const char *name, 00721 unsigned int index); 00722 00730 DLLIMPORT cfg_t *cfg_opt_gettsec(cfg_opt_t *opt, const char *title); 00731 00741 DLLIMPORT cfg_t * __export cfg_gettsec(cfg_t *cfg, const char *name, 00742 const char *title); 00743 00754 DLLIMPORT cfg_t * __export cfg_getsec(cfg_t *cfg, const char *name); 00755 00761 DLLIMPORT unsigned int cfg_opt_size(cfg_opt_t *opt); 00762 00775 DLLIMPORT unsigned int __export cfg_size(cfg_t *cfg, const char *name); 00776 00783 DLLIMPORT const char * __export cfg_title(cfg_t *cfg); 00784 00790 DLLIMPORT int __export cfg_include(cfg_t *cfg, cfg_opt_t *opt, int argc, 00791 const char **argv); 00792 00799 DLLIMPORT char * __export cfg_tilde_expand(const char *filename); 00800 00808 DLLIMPORT int __export cfg_parse_boolean(const char *s); 00809 00818 DLLIMPORT cfg_opt_t * __export cfg_getopt(cfg_t *cfg, const char *name); 00819 00828 DLLIMPORT void __export cfg_opt_setnint(cfg_opt_t *opt, 00829 long int value, unsigned int index); 00830 00838 DLLIMPORT void __export cfg_setint(cfg_t *cfg, const char *name, 00839 long int value); 00840 00850 DLLIMPORT void __export cfg_setnint(cfg_t *cfg, const char *name, 00851 long int value, unsigned int index); 00852 00861 DLLIMPORT void __export cfg_opt_setnfloat(cfg_opt_t *opt, 00862 double value, unsigned int index); 00863 00871 DLLIMPORT void __export cfg_setfloat(cfg_t *cfg, const char *name, 00872 double value); 00873 00883 DLLIMPORT void __export cfg_setnfloat(cfg_t *cfg, const char *name, 00884 double value, unsigned int index); 00885 00894 DLLIMPORT void __export cfg_opt_setnbool(cfg_opt_t *opt, 00895 cfg_bool_t value, unsigned int index); 00896 00904 DLLIMPORT void __export cfg_setbool(cfg_t *cfg, const char *name, 00905 cfg_bool_t value); 00906 00916 DLLIMPORT void __export cfg_setnbool(cfg_t *cfg, const char *name, 00917 cfg_bool_t value, unsigned int index); 00918 00928 DLLIMPORT void __export cfg_opt_setnstr(cfg_opt_t *opt, 00929 const char *value, unsigned int index); 00930 00939 DLLIMPORT void __export cfg_setstr(cfg_t *cfg, const char *name, 00940 const char *value); 00941 00952 DLLIMPORT void __export cfg_setnstr(cfg_t *cfg, const char *name, 00953 const char *value, unsigned int index); 00954 00965 DLLIMPORT void __export cfg_setlist(cfg_t *cfg, const char *name, 00966 unsigned int nvalues, ...); 00967 00968 00979 DLLIMPORT void __export cfg_addlist(cfg_t *cfg, const char *name, 00980 unsigned int nvalues, ...); 00981 00994 DLLIMPORT void cfg_opt_nprint_var(cfg_opt_t *opt, unsigned int index, 00995 FILE *fp); 00996 01001 DLLIMPORT void cfg_opt_print_indent(cfg_opt_t *opt, FILE *fp, int indent); 01002 01013 DLLIMPORT void cfg_opt_print(cfg_opt_t *opt, FILE *fp); 01014 01019 DLLIMPORT void cfg_print_indent(cfg_t *cfg, FILE *fp, int indent); 01020 01034 DLLIMPORT void cfg_print(cfg_t *cfg, FILE *fp); 01035 01043 DLLIMPORT cfg_print_func_t cfg_opt_set_print_func(cfg_opt_t *opt, 01044 cfg_print_func_t pf); 01045 01054 DLLIMPORT cfg_print_func_t cfg_set_print_func(cfg_t *cfg, const char *name, 01055 cfg_print_func_t pf); 01056 01065 DLLIMPORT cfg_validate_callback_t cfg_set_validate_func(cfg_t *cfg, 01066 const char *name, 01067 cfg_validate_callback_t vf); 01068 01069 #ifdef __cplusplus 01070 } 01071 #endif 01072 01073 #endif 01074