confuse.h
Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
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 
00064 
#  define DLLIMPORT __declspec (dllimport)
00065 
# endif 
00066 
00067 
#else 
00068 
# define DLLIMPORT
00069 
00070 
#endif 
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_NODEFAULT 16  
00096 
#define CFGF_RESET 32
00097 
#define CFGF_DEFINIT 64
00098 
00100 #define CFG_SUCCESS 0
00101 
#define CFG_FILE_ERROR -1
00102 
#define CFG_PARSE_ERROR 1
00103 
00104 
typedef union cfg_value_t cfg_value_t;
00105 
typedef struct cfg_opt_t cfg_opt_t;
00106 
typedef struct cfg_t cfg_t;
00107 
typedef struct cfg_defvalue_t cfg_defvalue_t;
00108 
typedef int cfg_flag_t;
00109 
00135 typedef int (*
cfg_func_t)(cfg_t *cfg, cfg_opt_t *opt,
00136                           
int argc, 
const char **argv);
00137 
00158 typedef void (*
cfg_print_func_t)(cfg_opt_t *opt, 
unsigned int index, FILE *fp);
00159     
00181 typedef int (*
cfg_callback_t)(cfg_t *cfg, cfg_opt_t *opt,
00182                               
const char *value, 
void *result);
00183 
00197 typedef int (*
cfg_validate_callback_t)(cfg_t *cfg, cfg_opt_t *opt);
00198 
00207 typedef void (*
cfg_free_func_t)(
void *value);
00208 
00210 typedef enum {cfg_false, cfg_true} 
cfg_bool_t;
00211 
00213 typedef void (*
cfg_errfunc_t)(cfg_t *cfg, 
const char *fmt, va_list ap);
00214 
00219 struct cfg_t {
00220     cfg_flag_t 
flags;       
00221     char *
name;             
00224     cfg_opt_t *
opts;        
00225     char *
title;            
00227     char *
filename;         
00228     int line;               
00229     cfg_errfunc_t errfunc;  
00232 };
00233 
00236 union cfg_value_t {
00237     long int number;        
00238     double fpnumber;        
00239     cfg_bool_t boolean;     
00240     char *
string;           
00241     cfg_t *
section;         
00242     void *
ptr;              
00243 };
00244 
00248 struct cfg_defvalue_t {
00249     long int number;        
00250     double fpnumber;        
00251     cfg_bool_t boolean;     
00252     char *
string;           
00253     char *
parsed;           
00256 };
00257 
00262 struct cfg_opt_t {
00263     char *
name;             
00264     cfg_type_t 
type;        
00265     unsigned int nvalues;   
00266     cfg_value_t **
values;   
00267     cfg_flag_t 
flags;       
00268     cfg_opt_t *
subopts;     
00269     cfg_defvalue_t 
def;     
00270     cfg_func_t func;        
00271     void *
simple_value;     
00274     cfg_callback_t parsecb; 
00275     cfg_validate_callback_t validcb; 
00276     cfg_print_func_t pf;    
00277     
cfg_free_func_t freecb; 
00278 };
00279 
00280 
extern const char __export confuse_copyright[];
00281 
extern const char __export confuse_version[];
00282 
extern const char __export confuse_author[];
00283 
00284 
#define __CFG_STR(name, def, flags, svalue, cb) \
00285 
  {name,CFGT_STR,0,0,flags,0,{0,0,cfg_false,def,0},0,svalue,cb,0,0,0}
00286 
#define __CFG_STR_LIST(name, def, flags, svalue, cb) \
00287 
  {name,CFGT_STR,0,0,flags | CFGF_LIST,0,{0,0,cfg_false,0,def},0,svalue,cb,0,0,0}
00288 
00291 #define CFG_STR(name, def, flags) \
00292 
  __CFG_STR(name, def, flags, 0, 0)
00293 
00296 #define CFG_STR_LIST(name, def, flags) \
00297 
  __CFG_STR_LIST(name, def, flags, 0, 0)
00298 
00301 #define CFG_STR_CB(name, def, flags, cb) \
00302 
  __CFG_STR(name, def, flags, 0, cb)
00303 
00306 #define CFG_STR_LIST_CB(name, def, flags, cb) \
00307 
  __CFG_STR_LIST(name, def, flags, 0, cb)
00308 
00361 #define CFG_SIMPLE_STR(name, svalue) \
00362 
  __CFG_STR(name, 0, CFGF_NONE, svalue, 0)
00363 
00364 
00365 
#define __CFG_INT(name, def, flags, svalue, cb) \
00366 
  {name,CFGT_INT,0,0,flags,0,{def,0,cfg_false,0,0},0,svalue,cb,0,0,0}
00367 
#define __CFG_INT_LIST(name, def, flags, svalue, cb) \
00368 
  {name,CFGT_INT,0,0,flags | CFGF_LIST,0,{0,0,cfg_false,0,def},0,svalue,cb,0,0,0}
00369 
00372 #define CFG_INT(name, def, flags) \
00373 
  __CFG_INT(name, def, flags, 0, 0)
00374 
00377 #define CFG_INT_LIST(name, def, flags) \
00378 
  __CFG_INT_LIST(name, def, flags, 0, 0)
00379 
00382 #define CFG_INT_CB(name, def, flags, cb) \
00383 
  __CFG_INT(name, def, flags, 0, cb)
00384 
00387 #define CFG_INT_LIST_CB(name, def, flags, cb) \
00388 
  __CFG_INT_LIST(name, def, flags, 0, cb)
00389 
00393 #define CFG_SIMPLE_INT(name, svalue) \
00394 
  __CFG_INT(name, 0, CFGF_NONE, svalue, 0)
00395 
00396 
00397 
00398 
#define __CFG_FLOAT(name, def, flags, svalue, cb) \
00399 
  {name,CFGT_FLOAT,0,0,flags,0,{0,def,cfg_false,0,0},0,svalue,cb,0,0,0}
00400 
#define __CFG_FLOAT_LIST(name, def, flags, svalue, cb) \
00401 
  {name,CFGT_FLOAT,0,0,flags | CFGF_LIST,0,{0,0,cfg_false,0,def},0,svalue,cb,0,0,0}
00402 
00405 #define CFG_FLOAT(name, def, flags) \
00406 
  __CFG_FLOAT(name, def, flags, 0, 0)
00407 
00410 #define CFG_FLOAT_LIST(name, def, flags) \
00411 
  __CFG_FLOAT_LIST(name, def, flags, 0, 0)
00412 
00415 #define CFG_FLOAT_CB(name, def, flags, cb) \
00416 
  __CFG_FLOAT(name, def, flags, 0, cb)
00417 
00420 #define CFG_FLOAT_LIST_CB(name, def, flags, cb) \
00421 
  __CFG_FLOAT_LIST(name, def, flags, 0, cb)
00422 
00426 #define CFG_SIMPLE_FLOAT(name, svalue) \
00427 
  __CFG_FLOAT(name, 0, CFGF_NONE, svalue, 0)
00428 
00429 
00430 
00431 
#define __CFG_BOOL(name, def, flags, svalue, cb) \
00432 
  {name,CFGT_BOOL,0,0,flags,0,{0,0,def,0,0},0,svalue,cb,0,0,0}
00433 
#define __CFG_BOOL_LIST(name, def, flags, svalue, cb) \
00434 
  {name,CFGT_BOOL,0,0,flags | CFGF_LIST,0,{0,0,cfg_false,0,def},0,svalue,cb,0,0,0}
00435 
00438 #define CFG_BOOL(name, def, flags) \
00439 
  __CFG_BOOL(name, def, flags, 0, 0)
00440 
00443 #define CFG_BOOL_LIST(name, def, flags) \
00444 
  __CFG_BOOL_LIST(name, def, flags, 0, 0)
00445 
00448 #define CFG_BOOL_CB(name, def, flags, cb) \
00449 
  __CFG_BOOL(name, def, flags, 0, cb)
00450 
00453 #define CFG_BOOL_LIST_CB(name, def, flags, cb) \
00454 
  __CFG_BOOL_LIST(name, def, flags, 0, cb)
00455 
00459 #define CFG_SIMPLE_BOOL(name, svalue) \
00460 
  __CFG_BOOL(name, cfg_false, CFGF_NONE, svalue, 0)
00461 
00462 
00463 
00475 #define CFG_SEC(name, opts, flags) \
00476 
  {name,CFGT_SEC,0,0,flags,opts,{0,0,cfg_false,0,0},0,0,0,0,0,0}
00477 
00478 
00479 
00486 #define CFG_FUNC(name, func) \
00487 
  {name,CFGT_FUNC,0,0,CFGF_NONE,0,{0,0,cfg_false,0,0},func,0,0,0,0,0}
00488 
00489 
00490 
#define __CFG_PTR(name, def, flags, svalue, parsecb, freecb) \
00491 
  {name,CFGT_PTR,0,0,flags,0,{0,0,cfg_false,0,def},0,svalue,parsecb,0,0,freecb}
00492 
#define __CFG_PTR_LIST(name, def, flags, svalue, parsecb, freecb) \
00493 
  {name,CFGT_PTR,0,0,flags | CFGF_LIST,0,{0,0,cfg_false,0,def},0,svalue,parsecb,0,0,freecb}
00494 
00507 #define CFG_PTR_CB(name, def, flags, parsecb, freecb) \
00508 
  __CFG_PTR(name, def, flags, 0, parsecb, freecb)
00509 
00512 #define CFG_PTR_LIST_CB(name, def, flags, parsecb, freecb) \
00513 
  __CFG_PTR(name, def, flags | CFGF_LIST, 0, parsecb, freecb)
00514 
00515 
00516 
00517 
00518 
00522 #define CFG_END() \
00523 
   {0,CFGT_NONE,0,0,CFGF_NONE,0,{0,0,cfg_false,0,0},0,0,0,0,0,0}
00524 
00525 
00526 
00543 DLLIMPORT cfg_t * __export cfg_init(cfg_opt_t *opts, cfg_flag_t flags);
00544 
00558 DLLIMPORT 
int __export cfg_parse(cfg_t *cfg, 
const char *filename);
00559 
00570 DLLIMPORT 
int __export cfg_parse_fp(cfg_t *cfg, FILE *fp);
00571 
00580 DLLIMPORT 
int __export cfg_parse_buf(cfg_t *cfg, 
const char *buf);
00581 
00587 DLLIMPORT 
void __export cfg_free_value(cfg_opt_t *opt);
00588 
00592 DLLIMPORT 
void __export cfg_free(cfg_t *cfg);
00593 
00597 DLLIMPORT 
cfg_errfunc_t __export cfg_set_error_function(cfg_t *cfg,
00598                                                         cfg_errfunc_t errfunc);
00599 
00603 DLLIMPORT 
void __export cfg_error(cfg_t *cfg, 
const char *fmt, ...);
00604 
00610 DLLIMPORT 
signed long cfg_opt_getnint(cfg_opt_t *opt, 
unsigned int index);
00611 
00618 DLLIMPORT 
long int __export cfg_getnint(cfg_t *cfg, 
const char *name,
00619                                         
unsigned int index);
00620 
00630 DLLIMPORT 
long int __export cfg_getint(cfg_t *cfg, 
const char *name);
00631 
00637 DLLIMPORT 
double cfg_opt_getnfloat(cfg_opt_t *opt, 
unsigned int index);
00638 
00645 DLLIMPORT 
double __export cfg_getnfloat(cfg_t *cfg, 
const char *name,
00646                                         
unsigned int index);
00647 
00656 DLLIMPORT 
double __export cfg_getfloat(cfg_t *cfg, 
const char *name);
00657 
00663 DLLIMPORT 
char *cfg_opt_getnstr(cfg_opt_t *opt, 
unsigned int index);
00664 
00671 DLLIMPORT 
char * __export cfg_getnstr(cfg_t *cfg, 
const char *name,
00672                                       
unsigned int index);
00673 
00682 DLLIMPORT 
char * __export cfg_getstr(cfg_t *cfg, 
const char *name);
00683 
00689 DLLIMPORT 
cfg_bool_t cfg_opt_getnbool(cfg_opt_t *opt, 
unsigned int index);
00690     
00698 DLLIMPORT 
cfg_bool_t __export cfg_getnbool(cfg_t *cfg, 
const char *name,
00699                                            
unsigned int index);
00700 
00709 DLLIMPORT 
cfg_bool_t __export cfg_getbool(cfg_t *cfg, 
const char *name);
00710 
00711 
00712 DLLIMPORT 
void *cfg_opt_getnptr(cfg_opt_t *opt, 
unsigned int index);
00713 DLLIMPORT 
void *cfg_getnptr(cfg_t *cfg, 
const char *name, 
unsigned int indx);
00714 
00723 DLLIMPORT 
void *cfg_getptr(cfg_t *cfg, 
const char *name);
00724 
00725 
00731 DLLIMPORT cfg_t *cfg_opt_getnsec(cfg_opt_t *opt, 
unsigned int index);
00732 
00741 DLLIMPORT cfg_t * __export cfg_getnsec(cfg_t *cfg, 
const char *name,
00742                                        
unsigned int index);
00743 
00751 DLLIMPORT cfg_t *cfg_opt_gettsec(cfg_opt_t *opt, 
const char *title);
00752 
00762 DLLIMPORT cfg_t * __export cfg_gettsec(cfg_t *cfg, 
const char *name,
00763                                        
const char *title);
00764 
00775 DLLIMPORT cfg_t * __export cfg_getsec(cfg_t *cfg, 
const char *name);
00776 
00782 DLLIMPORT 
unsigned int cfg_opt_size(cfg_opt_t *opt);
00783 
00796 DLLIMPORT 
unsigned int __export cfg_size(cfg_t *cfg, 
const char *name);
00797 
00804 DLLIMPORT 
const char * __export cfg_title(cfg_t *cfg);
00805 
00812 DLLIMPORT 
const char *cfg_name(cfg_t *cfg);
00813 
00820 DLLIMPORT 
const char *cfg_opt_name(cfg_opt_t *opt);
00821 
00827 DLLIMPORT 
int __export cfg_include(cfg_t *cfg, cfg_opt_t *opt, 
int argc,
00828                                    
const char **argv);
00829 
00836 DLLIMPORT 
char * __export cfg_tilde_expand(
const char *filename);
00837 
00845 DLLIMPORT 
int __export cfg_parse_boolean(
const char *s);
00846 
00855 DLLIMPORT cfg_opt_t * __export cfg_getopt(cfg_t *cfg, 
const char *name);
00856 
00865 DLLIMPORT 
void __export cfg_opt_setnint(cfg_opt_t *opt,
00866                                         
long int value, 
unsigned int index);
00867 
00875 DLLIMPORT 
void __export cfg_setint(cfg_t *cfg, 
const char *name,
00876                                    
long int value);
00877 
00887 DLLIMPORT 
void __export cfg_setnint(cfg_t *cfg, 
const char *name,
00888                                     
long int value, 
unsigned int index);
00889 
00898 DLLIMPORT 
void __export cfg_opt_setnfloat(cfg_opt_t *opt,
00899                                           
double value, 
unsigned int index);
00900 
00908 DLLIMPORT 
void __export cfg_setfloat(cfg_t *cfg, 
const char *name,
00909                                      
double value);
00910 
00920 DLLIMPORT 
void __export cfg_setnfloat(cfg_t *cfg, 
const char *name,
00921                                       
double value, 
unsigned int index);
00922 
00931 DLLIMPORT 
void __export cfg_opt_setnbool(cfg_opt_t *opt,
00932                                          cfg_bool_t value, 
unsigned int index);
00933 
00941 DLLIMPORT 
void __export cfg_setbool(cfg_t *cfg, 
const char *name,
00942                                     cfg_bool_t value);
00943 
00953 DLLIMPORT 
void __export cfg_setnbool(cfg_t *cfg, 
const char *name,
00954                                      cfg_bool_t value, 
unsigned int index);
00955 
00965 DLLIMPORT 
void __export cfg_opt_setnstr(cfg_opt_t *opt,
00966                                         
const char *value, 
unsigned int index);
00967 
00976 DLLIMPORT 
void __export cfg_setstr(cfg_t *cfg, 
const char *name,
00977                                    
const char *value);
00978 
00989 DLLIMPORT 
void __export cfg_setnstr(cfg_t *cfg, 
const char *name,
00990                                     
const char *value, 
unsigned int index);
00991 
01002 DLLIMPORT 
void __export cfg_setlist(cfg_t *cfg, 
const char *name,
01003                                     
unsigned int nvalues, ...);
01004 
01005 
01016 DLLIMPORT 
void __export cfg_addlist(cfg_t *cfg, 
const char *name,
01017                                     
unsigned int nvalues, ...);
01018 
01031 DLLIMPORT 
void cfg_opt_nprint_var(cfg_opt_t *opt, 
unsigned int index,
01032                                   FILE *fp);
01033 
01038 DLLIMPORT 
void cfg_opt_print_indent(cfg_opt_t *opt, FILE *fp, 
int indent);
01039 
01050 DLLIMPORT 
void cfg_opt_print(cfg_opt_t *opt, FILE *fp);
01051 
01056 DLLIMPORT 
void cfg_print_indent(cfg_t *cfg, FILE *fp, 
int indent);
01057 
01071 DLLIMPORT 
void cfg_print(cfg_t *cfg, FILE *fp);
01072 
01080 DLLIMPORT 
cfg_print_func_t cfg_opt_set_print_func(cfg_opt_t *opt,
01081                                                   cfg_print_func_t pf);
01082 
01091 DLLIMPORT 
cfg_print_func_t cfg_set_print_func(cfg_t *cfg, 
const char *name,
01092                                               cfg_print_func_t pf);
01093 
01102 DLLIMPORT 
cfg_validate_callback_t cfg_set_validate_func(cfg_t *cfg,
01103                                                         
const char *name,
01104                                                         cfg_validate_callback_t vf);
01105 
01106 
#ifdef __cplusplus
01107 
}
01108 
#endif
01109 
01110 
#endif
01111