00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00036 #ifndef _cfg_h_
00037 #define _cfg_h_
00038
00039 #ifdef __cplusplus
00040 extern "C" {
00041 #endif
00042
00043 #include <stdio.h>
00044 #include <stdarg.h>
00045
00046 #if defined(_WIN32) && !defined(__GNUC__)
00047 # ifdef HAVE__FILENO
00048 # define fileno _fileno
00049 # endif
00050 # include <io.h>
00051 # ifdef HAVE__ISATTY
00052 # define isatty _isatty
00053 # endif
00054 # ifdef BUILDING_DLL
00055 # define DLLIMPORT __declspec (dllexport)
00056 # else
00057 # define DLLIMPORT __declspec (dllimport)
00058 # endif
00059 #else
00060 # define DLLIMPORT
00061 #endif
00062
00063 #ifndef __BORLANDC__
00064 # define __export
00065 #endif
00066
00068 enum cfg_type_t {
00069 CFGT_NONE,
00070 CFGT_INT,
00071 CFGT_FLOAT,
00072 CFGT_STR,
00073 CFGT_BOOL,
00074 CFGT_SEC,
00075 CFGT_FUNC,
00076 CFGT_PTR
00077 };
00078 typedef enum cfg_type_t cfg_type_t;
00079
00081 #define CFGF_NONE 0
00082 #define CFGF_MULTI 1
00083 #define CFGF_LIST 2
00084 #define CFGF_NOCASE 4
00085 #define CFGF_TITLE 8
00086 #define CFGF_NODEFAULT 16
00087 #define CFGF_NO_TITLE_DUPES 32
00091 #define CFGF_RESET 64
00092 #define CFGF_DEFINIT 128
00093
00095 #define CFG_SUCCESS 0
00096 #define CFG_FILE_ERROR -1
00097 #define CFG_PARSE_ERROR 1
00098
00099 typedef union cfg_value_t cfg_value_t;
00100 typedef struct cfg_opt_t cfg_opt_t;
00101 typedef struct cfg_t cfg_t;
00102 typedef struct cfg_defvalue_t cfg_defvalue_t;
00103 typedef int cfg_flag_t;
00104
00130 typedef int (*cfg_func_t)(cfg_t *cfg, cfg_opt_t *opt,
00131 int argc, const char **argv);
00132
00153 typedef void (*cfg_print_func_t)(cfg_opt_t *opt, unsigned int index, FILE *fp);
00154
00176 typedef int (*cfg_callback_t)(cfg_t *cfg, cfg_opt_t *opt,
00177 const char *value, void *result);
00178
00192 typedef int (*cfg_validate_callback_t)(cfg_t *cfg, cfg_opt_t *opt);
00193
00202 typedef void (*cfg_free_func_t)(void *value);
00203
00205 typedef enum {cfg_false, cfg_true} cfg_bool_t;
00206
00208 typedef void (*cfg_errfunc_t)(cfg_t *cfg, const char *fmt, va_list ap);
00209
00214 struct cfg_t {
00215 cfg_flag_t flags;
00216 char *name;
00219 cfg_opt_t *opts;
00220 char *title;
00222 char *filename;
00223 int line;
00224 cfg_errfunc_t errfunc;
00227 };
00228
00231 union cfg_value_t {
00232 long int number;
00233 double fpnumber;
00234 cfg_bool_t boolean;
00235 char *string;
00236 cfg_t *section;
00237 void *ptr;
00238 };
00239
00243 struct cfg_defvalue_t {
00244 long int number;
00245 double fpnumber;
00246 cfg_bool_t boolean;
00247 char *string;
00248 char *parsed;
00251 };
00252
00257 struct cfg_opt_t {
00258 char *name;
00259 cfg_type_t type;
00260 unsigned int nvalues;
00261 cfg_value_t **values;
00262 cfg_flag_t flags;
00263 cfg_opt_t *subopts;
00264 cfg_defvalue_t def;
00265 cfg_func_t func;
00266 void *simple_value;
00269 cfg_callback_t parsecb;
00270 cfg_validate_callback_t validcb;
00271 cfg_print_func_t pf;
00272 cfg_free_func_t freecb;
00273 };
00274
00275 extern const char __export confuse_copyright[];
00276 extern const char __export confuse_version[];
00277 extern const char __export confuse_author[];
00278
00279 #define __CFG_STR(name, def, flags, svalue, cb) \
00280 {name,CFGT_STR,0,0,flags,0,{0,0,cfg_false,def,0},0,svalue,cb,0,0,0}
00281 #define __CFG_STR_LIST(name, def, flags, svalue, cb) \
00282 {name,CFGT_STR,0,0,flags | CFGF_LIST,0,{0,0,cfg_false,0,def},0,svalue,cb,0,0,0}
00283
00286 #define CFG_STR(name, def, flags) \
00287 __CFG_STR(name, def, flags, 0, 0)
00288
00291 #define CFG_STR_LIST(name, def, flags) \
00292 __CFG_STR_LIST(name, def, flags, 0, 0)
00293
00296 #define CFG_STR_CB(name, def, flags, cb) \
00297 __CFG_STR(name, def, flags, 0, cb)
00298
00301 #define CFG_STR_LIST_CB(name, def, flags, cb) \
00302 __CFG_STR_LIST(name, def, flags, 0, cb)
00303
00356 #define CFG_SIMPLE_STR(name, svalue) \
00357 __CFG_STR(name, 0, CFGF_NONE, svalue, 0)
00358
00359
00360 #define __CFG_INT(name, def, flags, svalue, cb) \
00361 {name,CFGT_INT,0,0,flags,0,{def,0,cfg_false,0,0},0,svalue,cb,0,0,0}
00362 #define __CFG_INT_LIST(name, def, flags, svalue, cb) \
00363 {name,CFGT_INT,0,0,flags | CFGF_LIST,0,{0,0,cfg_false,0,def},0,svalue,cb,0,0,0}
00364
00367 #define CFG_INT(name, def, flags) \
00368 __CFG_INT(name, def, flags, 0, 0)
00369
00372 #define CFG_INT_LIST(name, def, flags) \
00373 __CFG_INT_LIST(name, def, flags, 0, 0)
00374
00377 #define CFG_INT_CB(name, def, flags, cb) \
00378 __CFG_INT(name, def, flags, 0, cb)
00379
00382 #define CFG_INT_LIST_CB(name, def, flags, cb) \
00383 __CFG_INT_LIST(name, def, flags, 0, cb)
00384
00391 #define CFG_SIMPLE_INT(name, svalue) \
00392 __CFG_INT(name, 0, CFGF_NONE, svalue, 0)
00393
00394
00395
00396 #define __CFG_FLOAT(name, def, flags, svalue, cb) \
00397 {name,CFGT_FLOAT,0,0,flags,0,{0,def,cfg_false,0,0},0,svalue,cb,0,0,0}
00398 #define __CFG_FLOAT_LIST(name, def, flags, svalue, cb) \
00399 {name,CFGT_FLOAT,0,0,flags | CFGF_LIST,0,{0,0,cfg_false,0,def},0,svalue,cb,0,0,0}
00400
00403 #define CFG_FLOAT(name, def, flags) \
00404 __CFG_FLOAT(name, def, flags, 0, 0)
00405
00408 #define CFG_FLOAT_LIST(name, def, flags) \
00409 __CFG_FLOAT_LIST(name, def, flags, 0, 0)
00410
00413 #define CFG_FLOAT_CB(name, def, flags, cb) \
00414 __CFG_FLOAT(name, def, flags, 0, cb)
00415
00418 #define CFG_FLOAT_LIST_CB(name, def, flags, cb) \
00419 __CFG_FLOAT_LIST(name, def, flags, 0, cb)
00420
00424 #define CFG_SIMPLE_FLOAT(name, svalue) \
00425 __CFG_FLOAT(name, 0, CFGF_NONE, svalue, 0)
00426
00427
00428
00429 #define __CFG_BOOL(name, def, flags, svalue, cb) \
00430 {name,CFGT_BOOL,0,0,flags,0,{0,0,def,0,0},0,svalue,cb,0,0,0}
00431 #define __CFG_BOOL_LIST(name, def, flags, svalue, cb) \
00432 {name,CFGT_BOOL,0,0,flags | CFGF_LIST,0,{0,0,cfg_false,0,def},0,svalue,cb,0,0,0}
00433
00436 #define CFG_BOOL(name, def, flags) \
00437 __CFG_BOOL(name, def, flags, 0, 0)
00438
00441 #define CFG_BOOL_LIST(name, def, flags) \
00442 __CFG_BOOL_LIST(name, def, flags, 0, 0)
00443
00446 #define CFG_BOOL_CB(name, def, flags, cb) \
00447 __CFG_BOOL(name, def, flags, 0, cb)
00448
00451 #define CFG_BOOL_LIST_CB(name, def, flags, cb) \
00452 __CFG_BOOL_LIST(name, def, flags, 0, cb)
00453
00457 #define CFG_SIMPLE_BOOL(name, svalue) \
00458 __CFG_BOOL(name, cfg_false, CFGF_NONE, svalue, 0)
00459
00460
00461
00473 #define CFG_SEC(name, opts, flags) \
00474 {name,CFGT_SEC,0,0,flags,opts,{0,0,cfg_false,0,0},0,0,0,0,0,0}
00475
00476
00477
00484 #define CFG_FUNC(name, func) \
00485 {name,CFGT_FUNC,0,0,CFGF_NONE,0,{0,0,cfg_false,0,0},func,0,0,0,0,0}
00486
00487
00488 #define __CFG_PTR(name, def, flags, svalue, parsecb, freecb) \
00489 {name,CFGT_PTR,0,0,flags,0,{0,0,cfg_false,0,def},0,svalue,parsecb,0,0,freecb}
00490 #define __CFG_PTR_LIST(name, def, flags, svalue, parsecb, freecb) \
00491 {name,CFGT_PTR,0,0,flags | CFGF_LIST,0,{0,0,cfg_false,0,def},0,svalue,parsecb,0,0,freecb}
00492
00505 #define CFG_PTR_CB(name, def, flags, parsecb, freecb) \
00506 __CFG_PTR(name, def, flags, 0, parsecb, freecb)
00507
00510 #define CFG_PTR_LIST_CB(name, def, flags, parsecb, freecb) \
00511 __CFG_PTR(name, def, flags | CFGF_LIST, 0, parsecb, freecb)
00512
00513
00514
00515
00516
00520 #define CFG_END() \
00521 {0,CFGT_NONE,0,0,CFGF_NONE,0,{0,0,cfg_false,0,0},0,0,0,0,0,0}
00522
00523
00524
00541 DLLIMPORT cfg_t * __export cfg_init(cfg_opt_t *opts, cfg_flag_t flags);
00542
00556 DLLIMPORT int __export cfg_parse(cfg_t *cfg, const char *filename);
00557
00568 DLLIMPORT int __export cfg_parse_fp(cfg_t *cfg, FILE *fp);
00569
00578 DLLIMPORT int __export cfg_parse_buf(cfg_t *cfg, const char *buf);
00579
00585 DLLIMPORT void __export cfg_free_value(cfg_opt_t *opt);
00586
00590 DLLIMPORT void __export cfg_free(cfg_t *cfg);
00591
00595 DLLIMPORT cfg_errfunc_t __export cfg_set_error_function(cfg_t *cfg,
00596 cfg_errfunc_t errfunc);
00597
00601 DLLIMPORT void __export cfg_error(cfg_t *cfg, const char *fmt, ...);
00602
00608 DLLIMPORT signed long __export cfg_opt_getnint(cfg_opt_t *opt, unsigned int index);
00609
00616 DLLIMPORT long int __export cfg_getnint(cfg_t *cfg, const char *name,
00617 unsigned int index);
00618
00628 DLLIMPORT long int __export cfg_getint(cfg_t *cfg, const char *name);
00629
00635 DLLIMPORT double __export cfg_opt_getnfloat(cfg_opt_t *opt, unsigned int index);
00636
00643 DLLIMPORT double __export cfg_getnfloat(cfg_t *cfg, const char *name,
00644 unsigned int index);
00645
00654 DLLIMPORT double __export cfg_getfloat(cfg_t *cfg, const char *name);
00655
00661 DLLIMPORT char * __export cfg_opt_getnstr(cfg_opt_t *opt, unsigned int index);
00662
00669 DLLIMPORT char * __export cfg_getnstr(cfg_t *cfg, const char *name,
00670 unsigned int index);
00671
00680 DLLIMPORT char * __export cfg_getstr(cfg_t *cfg, const char *name);
00681
00687 DLLIMPORT cfg_bool_t __export cfg_opt_getnbool(cfg_opt_t *opt, unsigned int index);
00688
00696 DLLIMPORT cfg_bool_t __export cfg_getnbool(cfg_t *cfg, const char *name,
00697 unsigned int index);
00698
00707 DLLIMPORT cfg_bool_t __export cfg_getbool(cfg_t *cfg, const char *name);
00708
00709
00710 DLLIMPORT void * __export cfg_opt_getnptr(cfg_opt_t *opt, unsigned int index);
00711 DLLIMPORT void * __export cfg_getnptr(cfg_t *cfg, const char *name, unsigned int indx);
00712
00721 DLLIMPORT void * __export cfg_getptr(cfg_t *cfg, const char *name);
00722
00723
00729 DLLIMPORT cfg_t * __export cfg_opt_getnsec(cfg_opt_t *opt, unsigned int index);
00730
00739 DLLIMPORT cfg_t * __export cfg_getnsec(cfg_t *cfg, const char *name,
00740 unsigned int index);
00741
00749 DLLIMPORT cfg_t * __export cfg_opt_gettsec(cfg_opt_t *opt, const char *title);
00750
00760 DLLIMPORT cfg_t * __export cfg_gettsec(cfg_t *cfg, const char *name,
00761 const char *title);
00762
00773 DLLIMPORT cfg_t * __export cfg_getsec(cfg_t *cfg, const char *name);
00774
00780 DLLIMPORT unsigned int __export cfg_opt_size(cfg_opt_t *opt);
00781
00794 DLLIMPORT unsigned int __export cfg_size(cfg_t *cfg, const char *name);
00795
00802 DLLIMPORT const char * __export cfg_title(cfg_t *cfg);
00803
00810 DLLIMPORT const char * __export cfg_name(cfg_t *cfg);
00811
00818 DLLIMPORT const char * __export cfg_opt_name(cfg_opt_t *opt);
00819
00825 DLLIMPORT int __export cfg_include(cfg_t *cfg, cfg_opt_t *opt, int argc,
00826 const char **argv);
00827
00834 DLLIMPORT char * __export cfg_tilde_expand(const char *filename);
00835
00843 DLLIMPORT int __export cfg_parse_boolean(const char *s);
00844
00853 DLLIMPORT cfg_opt_t * __export cfg_getopt(cfg_t *cfg, const char *name);
00854
00863 DLLIMPORT cfg_value_t *cfg_setopt(cfg_t *cfg, cfg_opt_t *opt, char *value);
00864
00873 DLLIMPORT void __export cfg_opt_setnint(cfg_opt_t *opt,
00874 long int value, unsigned int index);
00875
00883 DLLIMPORT void __export cfg_setint(cfg_t *cfg, const char *name,
00884 long int value);
00885
00895 DLLIMPORT void __export cfg_setnint(cfg_t *cfg, const char *name,
00896 long int value, unsigned int index);
00897
00906 DLLIMPORT void __export cfg_opt_setnfloat(cfg_opt_t *opt,
00907 double value, unsigned int index);
00908
00916 DLLIMPORT void __export cfg_setfloat(cfg_t *cfg, const char *name,
00917 double value);
00918
00928 DLLIMPORT void __export cfg_setnfloat(cfg_t *cfg, const char *name,
00929 double value, unsigned int index);
00930
00939 DLLIMPORT void __export cfg_opt_setnbool(cfg_opt_t *opt,
00940 cfg_bool_t value, unsigned int index);
00941
00949 DLLIMPORT void __export cfg_setbool(cfg_t *cfg, const char *name,
00950 cfg_bool_t value);
00951
00961 DLLIMPORT void __export cfg_setnbool(cfg_t *cfg, const char *name,
00962 cfg_bool_t value, unsigned int index);
00963
00973 DLLIMPORT void __export cfg_opt_setnstr(cfg_opt_t *opt,
00974 const char *value, unsigned int index);
00975
00984 DLLIMPORT void __export cfg_setstr(cfg_t *cfg, const char *name,
00985 const char *value);
00986
00997 DLLIMPORT void __export cfg_setnstr(cfg_t *cfg, const char *name,
00998 const char *value, unsigned int index);
00999
01010 DLLIMPORT void __export cfg_setlist(cfg_t *cfg, const char *name,
01011 unsigned int nvalues, ...);
01012
01013 DLLIMPORT int __export cfg_numopts(cfg_opt_t *opts);
01014
01025 DLLIMPORT void __export cfg_addlist(cfg_t *cfg, const char *name,
01026 unsigned int nvalues, ...);
01027
01040 DLLIMPORT void __export cfg_opt_nprint_var(cfg_opt_t *opt, unsigned int index,
01041 FILE *fp);
01042
01047 DLLIMPORT void __export cfg_opt_print_indent(cfg_opt_t *opt, FILE *fp, int indent);
01048
01059 DLLIMPORT void __export cfg_opt_print(cfg_opt_t *opt, FILE *fp);
01060
01065 DLLIMPORT void __export cfg_print_indent(cfg_t *cfg, FILE *fp, int indent);
01066
01080 DLLIMPORT void __export cfg_print(cfg_t *cfg, FILE *fp);
01081
01089 DLLIMPORT cfg_print_func_t __export cfg_opt_set_print_func(cfg_opt_t *opt,
01090 cfg_print_func_t pf);
01091
01100 DLLIMPORT cfg_print_func_t __export cfg_set_print_func(cfg_t *cfg, const char *name,
01101 cfg_print_func_t pf);
01102
01111 DLLIMPORT cfg_validate_callback_t __export cfg_set_validate_func(cfg_t *cfg,
01112 const char *name,
01113 cfg_validate_callback_t vf);
01114
01115 #ifdef __cplusplus
01116 }
01117 #endif
01118
01119 #endif
01120