• 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 
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 /*#define CFG_SIMPLE_PTR(name, svalue, cb) \
00514   __CFG_PTR(name, 0, 0, svalue, cb)*/
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