• Main Page
  • Data Structures
  • Files
  • Examples
  • File List
  • Globals

confuse.h

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2002,2003,2007 Martin Hedenfalk <martin@bzero.se>
00003  *
00004  * Permission to use, copy, modify, and distribute this software for any
00005  * purpose with or without fee is hereby granted, provided that the above
00006  * copyright notice and this permission notice appear in all copies.
00007  *
00008  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
00009  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
00010  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
00011  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
00012  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
00013  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
00014  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
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 /* ! BUILDING_DLL */
00057 #  define DLLIMPORT __declspec (dllimport)
00058 # endif /* BUILDING_DLL */
00059 #else /* ! _WIN32 || __GNUC__ */
00060 # define DLLIMPORT
00061 #endif /* _WIN32 */
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; /***< user-defined memory release function */
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 
00388 #define CFG_SIMPLE_INT(name, svalue) \
00389   __CFG_INT(name, 0, CFGF_NONE, svalue, 0)
00390 
00391 
00392 
00393 #define __CFG_FLOAT(name, def, flags, svalue, cb) \
00394   {name,CFGT_FLOAT,0,0,flags,0,{0,def,cfg_false,0,0},0,svalue,cb,0,0,0}
00395 #define __CFG_FLOAT_LIST(name, def, flags, svalue, cb) \
00396   {name,CFGT_FLOAT,0,0,flags | CFGF_LIST,0,{0,0,cfg_false,0,def},0,svalue,cb,0,0,0}
00397 
00400 #define CFG_FLOAT(name, def, flags) \
00401   __CFG_FLOAT(name, def, flags, 0, 0)
00402 
00405 #define CFG_FLOAT_LIST(name, def, flags) \
00406   __CFG_FLOAT_LIST(name, def, flags, 0, 0)
00407 
00410 #define CFG_FLOAT_CB(name, def, flags, cb) \
00411   __CFG_FLOAT(name, def, flags, 0, cb)
00412 
00415 #define CFG_FLOAT_LIST_CB(name, def, flags, cb) \
00416   __CFG_FLOAT_LIST(name, def, flags, 0, cb)
00417 
00421 #define CFG_SIMPLE_FLOAT(name, svalue) \
00422   __CFG_FLOAT(name, 0, CFGF_NONE, svalue, 0)
00423 
00424 
00425 
00426 #define __CFG_BOOL(name, def, flags, svalue, cb) \
00427   {name,CFGT_BOOL,0,0,flags,0,{0,0,def,0,0},0,svalue,cb,0,0,0}
00428 #define __CFG_BOOL_LIST(name, def, flags, svalue, cb) \
00429   {name,CFGT_BOOL,0,0,flags | CFGF_LIST,0,{0,0,cfg_false,0,def},0,svalue,cb,0,0,0}
00430 
00433 #define CFG_BOOL(name, def, flags) \
00434   __CFG_BOOL(name, def, flags, 0, 0)
00435 
00438 #define CFG_BOOL_LIST(name, def, flags) \
00439   __CFG_BOOL_LIST(name, def, flags, 0, 0)
00440 
00443 #define CFG_BOOL_CB(name, def, flags, cb) \
00444   __CFG_BOOL(name, def, flags, 0, cb)
00445 
00448 #define CFG_BOOL_LIST_CB(name, def, flags, cb) \
00449   __CFG_BOOL_LIST(name, def, flags, 0, cb)
00450 
00454 #define CFG_SIMPLE_BOOL(name, svalue) \
00455   __CFG_BOOL(name, cfg_false, CFGF_NONE, svalue, 0)
00456 
00457 
00458 
00470 #define CFG_SEC(name, opts, flags) \
00471   {name,CFGT_SEC,0,0,flags,opts,{0,0,cfg_false,0,0},0,0,0,0,0,0}
00472 
00473 
00474 
00481 #define CFG_FUNC(name, func) \
00482   {name,CFGT_FUNC,0,0,CFGF_NONE,0,{0,0,cfg_false,0,0},func,0,0,0,0,0}
00483 
00484 
00485 #define __CFG_PTR(name, def, flags, svalue, parsecb, freecb) \
00486   {name,CFGT_PTR,0,0,flags,0,{0,0,cfg_false,0,def},0,svalue,parsecb,0,0,freecb}
00487 #define __CFG_PTR_LIST(name, def, flags, svalue, parsecb, freecb) \
00488   {name,CFGT_PTR,0,0,flags | CFGF_LIST,0,{0,0,cfg_false,0,def},0,svalue,parsecb,0,0,freecb}
00489 
00502 #define CFG_PTR_CB(name, def, flags, parsecb, freecb) \
00503   __CFG_PTR(name, def, flags, 0, parsecb, freecb)
00504 
00507 #define CFG_PTR_LIST_CB(name, def, flags, parsecb, freecb) \
00508   __CFG_PTR(name, def, flags | CFGF_LIST, 0, parsecb, freecb)
00509 
00510 /*#define CFG_SIMPLE_PTR(name, svalue, cb) \
00511   __CFG_PTR(name, 0, 0, svalue, cb)*/
00512 
00513 
00517 #define CFG_END() \
00518    {0,CFGT_NONE,0,0,CFGF_NONE,0,{0,0,cfg_false,0,0},0,0,0,0,0,0}
00519 
00520 
00521 
00538 DLLIMPORT cfg_t * __export cfg_init(cfg_opt_t *opts, cfg_flag_t flags);
00539 
00553 DLLIMPORT int __export cfg_parse(cfg_t *cfg, const char *filename);
00554 
00565 DLLIMPORT int __export cfg_parse_fp(cfg_t *cfg, FILE *fp);
00566 
00575 DLLIMPORT int __export cfg_parse_buf(cfg_t *cfg, const char *buf);
00576 
00582 DLLIMPORT void __export cfg_free_value(cfg_opt_t *opt);
00583 
00587 DLLIMPORT void __export cfg_free(cfg_t *cfg);
00588 
00592 DLLIMPORT cfg_errfunc_t __export cfg_set_error_function(cfg_t *cfg,
00593                                                         cfg_errfunc_t errfunc);
00594 
00598 DLLIMPORT void __export cfg_error(cfg_t *cfg, const char *fmt, ...);
00599 
00605 DLLIMPORT signed long __export cfg_opt_getnint(cfg_opt_t *opt, unsigned int index);
00606 
00613 DLLIMPORT long int __export cfg_getnint(cfg_t *cfg, const char *name,
00614                                         unsigned int index);
00615 
00625 DLLIMPORT long int __export cfg_getint(cfg_t *cfg, const char *name);
00626 
00632 DLLIMPORT double __export cfg_opt_getnfloat(cfg_opt_t *opt, unsigned int index);
00633 
00640 DLLIMPORT double __export cfg_getnfloat(cfg_t *cfg, const char *name,
00641                                         unsigned int index);
00642 
00651 DLLIMPORT double __export cfg_getfloat(cfg_t *cfg, const char *name);
00652 
00658 DLLIMPORT char * __export cfg_opt_getnstr(cfg_opt_t *opt, unsigned int index);
00659 
00666 DLLIMPORT char * __export cfg_getnstr(cfg_t *cfg, const char *name,
00667                                       unsigned int index);
00668 
00677 DLLIMPORT char * __export cfg_getstr(cfg_t *cfg, const char *name);
00678 
00684 DLLIMPORT cfg_bool_t __export cfg_opt_getnbool(cfg_opt_t *opt, unsigned int index);
00685     
00693 DLLIMPORT cfg_bool_t __export cfg_getnbool(cfg_t *cfg, const char *name,
00694                                            unsigned int index);
00695 
00704 DLLIMPORT cfg_bool_t __export cfg_getbool(cfg_t *cfg, const char *name);
00705 
00706 
00707 DLLIMPORT void * __export cfg_opt_getnptr(cfg_opt_t *opt, unsigned int index);
00708 DLLIMPORT void * __export cfg_getnptr(cfg_t *cfg, const char *name, unsigned int indx);
00709 
00718 DLLIMPORT void * __export cfg_getptr(cfg_t *cfg, const char *name);
00719 
00720 
00726 DLLIMPORT cfg_t * __export cfg_opt_getnsec(cfg_opt_t *opt, unsigned int index);
00727 
00736 DLLIMPORT cfg_t * __export cfg_getnsec(cfg_t *cfg, const char *name,
00737                                        unsigned int index);
00738 
00746 DLLIMPORT cfg_t * __export cfg_opt_gettsec(cfg_opt_t *opt, const char *title);
00747 
00757 DLLIMPORT cfg_t * __export cfg_gettsec(cfg_t *cfg, const char *name,
00758                                        const char *title);
00759 
00770 DLLIMPORT cfg_t * __export cfg_getsec(cfg_t *cfg, const char *name);
00771 
00777 DLLIMPORT unsigned int __export cfg_opt_size(cfg_opt_t *opt);
00778 
00791 DLLIMPORT unsigned int __export cfg_size(cfg_t *cfg, const char *name);
00792 
00799 DLLIMPORT const char * __export cfg_title(cfg_t *cfg);
00800 
00807 DLLIMPORT const char * __export cfg_name(cfg_t *cfg);
00808 
00815 DLLIMPORT const char * __export cfg_opt_name(cfg_opt_t *opt);
00816 
00822 DLLIMPORT int __export cfg_include(cfg_t *cfg, cfg_opt_t *opt, int argc,
00823                                    const char **argv);
00824 
00831 DLLIMPORT char * __export cfg_tilde_expand(const char *filename);
00832 
00840 DLLIMPORT int __export cfg_parse_boolean(const char *s);
00841 
00850 DLLIMPORT cfg_opt_t * __export cfg_getopt(cfg_t *cfg, const char *name);
00851 
00860 DLLIMPORT cfg_value_t *cfg_setopt(cfg_t *cfg, cfg_opt_t *opt, char *value);
00861 
00870 DLLIMPORT void __export cfg_opt_setnint(cfg_opt_t *opt,
00871                                         long int value, unsigned int index);
00872 
00880 DLLIMPORT void __export cfg_setint(cfg_t *cfg, const char *name,
00881                                    long int value);
00882 
00892 DLLIMPORT void __export cfg_setnint(cfg_t *cfg, const char *name,
00893                                     long int value, unsigned int index);
00894 
00903 DLLIMPORT void __export cfg_opt_setnfloat(cfg_opt_t *opt,
00904                                           double value, unsigned int index);
00905 
00913 DLLIMPORT void __export cfg_setfloat(cfg_t *cfg, const char *name,
00914                                      double value);
00915 
00925 DLLIMPORT void __export cfg_setnfloat(cfg_t *cfg, const char *name,
00926                                       double value, unsigned int index);
00927 
00936 DLLIMPORT void __export cfg_opt_setnbool(cfg_opt_t *opt,
00937                                          cfg_bool_t value, unsigned int index);
00938 
00946 DLLIMPORT void __export cfg_setbool(cfg_t *cfg, const char *name,
00947                                     cfg_bool_t value);
00948 
00958 DLLIMPORT void __export cfg_setnbool(cfg_t *cfg, const char *name,
00959                                      cfg_bool_t value, unsigned int index);
00960 
00970 DLLIMPORT void __export cfg_opt_setnstr(cfg_opt_t *opt,
00971                                         const char *value, unsigned int index);
00972 
00981 DLLIMPORT void __export cfg_setstr(cfg_t *cfg, const char *name,
00982                                    const char *value);
00983 
00994 DLLIMPORT void __export cfg_setnstr(cfg_t *cfg, const char *name,
00995                                     const char *value, unsigned int index);
00996 
01007 DLLIMPORT void __export cfg_setlist(cfg_t *cfg, const char *name,
01008                                     unsigned int nvalues, ...);
01009 
01010 DLLIMPORT int __export cfg_numopts(cfg_opt_t *opts);
01011 
01022 DLLIMPORT void __export cfg_addlist(cfg_t *cfg, const char *name,
01023                                     unsigned int nvalues, ...);
01024 
01037 DLLIMPORT void __export cfg_opt_nprint_var(cfg_opt_t *opt, unsigned int index,
01038                                   FILE *fp);
01039 
01044 DLLIMPORT void __export cfg_opt_print_indent(cfg_opt_t *opt, FILE *fp, int indent);
01045 
01056 DLLIMPORT void __export cfg_opt_print(cfg_opt_t *opt, FILE *fp);
01057 
01062 DLLIMPORT void __export cfg_print_indent(cfg_t *cfg, FILE *fp, int indent);
01063 
01077 DLLIMPORT void __export cfg_print(cfg_t *cfg, FILE *fp);
01078 
01086 DLLIMPORT cfg_print_func_t __export cfg_opt_set_print_func(cfg_opt_t *opt,
01087                                                   cfg_print_func_t pf);
01088 
01097 DLLIMPORT cfg_print_func_t __export cfg_set_print_func(cfg_t *cfg, const char *name,
01098                                               cfg_print_func_t pf);
01099 
01108 DLLIMPORT cfg_validate_callback_t __export cfg_set_validate_func(cfg_t *cfg,
01109                                                         const char *name,
01110                                                         cfg_validate_callback_t vf);
01111 
01112 #ifdef __cplusplus
01113 }
01114 #endif
01115 
01116 #endif
01117