Annotation of embedaddon/confuse/src/confuse.h, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (c) 2002,2003,2007 Martin Hedenfalk <martin@bzero.se>
        !             3:  *
        !             4:  * Permission to use, copy, modify, and distribute this software for any
        !             5:  * purpose with or without fee is hereby granted, provided that the above
        !             6:  * copyright notice and this permission notice appear in all copies.
        !             7:  *
        !             8:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
        !             9:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
        !            10:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
        !            11:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        !            12:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
        !            13:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
        !            14:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            15:  */
        !            16: 
        !            17: /** A configuration file parser library.
        !            18:  * @file confuse.h
        !            19:  *
        !            20:  */
        !            21: 
        !            22: /**
        !            23:  * \mainpage libConfuse Documentation
        !            24:  *
        !            25:  * \section intro
        !            26:  *
        !            27:  * Copyright &copy; 2002-2003 Martin Hedenfalk &lt;martin@bzero.se&gt;
        !            28:  *
        !            29:  * The latest versions of this manual and the libConfuse software are
        !            30:  * available at http://www.nongnu.org/confuse/
        !            31:  *
        !            32:  *
        !            33:  * <em>If you can't convince, confuse.</em>
        !            34:  */
        !            35: 
        !            36: #ifndef _cfg_h_
        !            37: #define _cfg_h_
        !            38: 
        !            39: #ifdef __cplusplus
        !            40: extern "C" {
        !            41: #endif
        !            42: 
        !            43: #include <stdio.h>
        !            44: #include <stdarg.h>
        !            45: 
        !            46: #if defined(_WIN32) && !defined(__GNUC__)
        !            47: # ifdef HAVE__FILENO
        !            48: #  define fileno _fileno
        !            49: # endif
        !            50: # include <io.h>
        !            51: # ifdef HAVE__ISATTY
        !            52: #  define isatty _isatty
        !            53: # endif
        !            54: # ifdef BUILDING_DLL
        !            55: #  define DLLIMPORT __declspec (dllexport)
        !            56: # else /* ! BUILDING_DLL */
        !            57: #  define DLLIMPORT __declspec (dllimport)
        !            58: # endif /* BUILDING_DLL */
        !            59: #else /* ! _WIN32 || __GNUC__ */
        !            60: # define DLLIMPORT
        !            61: #endif /* _WIN32 */
        !            62: 
        !            63: #ifndef __BORLANDC__
        !            64: # define __export
        !            65: #endif
        !            66: 
        !            67: /** Fundamental option types */
        !            68: enum cfg_type_t {
        !            69:     CFGT_NONE,
        !            70:     CFGT_INT,     /**< integer */
        !            71:     CFGT_FLOAT,   /**< floating point number */
        !            72:     CFGT_STR,     /**< string */
        !            73:     CFGT_BOOL,    /**< boolean value */
        !            74:     CFGT_SEC,     /**< section */
        !            75:     CFGT_FUNC,    /**< function */
        !            76:     CFGT_PTR      /**< pointer to user-defined value */
        !            77: };
        !            78: typedef enum cfg_type_t cfg_type_t;
        !            79: 
        !            80: /** Flags. */
        !            81: #define CFGF_NONE 0
        !            82: #define CFGF_MULTI 1       /**< option may be specified multiple times (only applies to sections) */
        !            83: #define CFGF_LIST 2        /**< option is a list */
        !            84: #define CFGF_NOCASE 4      /**< configuration file is case insensitive */
        !            85: #define CFGF_TITLE 8       /**< option has a title (only applies to sections) */
        !            86: #define CFGF_NODEFAULT 16  /**< option has no default value */
        !            87: #define CFGF_NO_TITLE_DUPES 32  /**< multiple section titles must be unique
        !            88:                                   (duplicates raises an error, only applies to
        !            89:                                   sections) */
        !            90: 
        !            91: #define CFGF_RESET 64
        !            92: #define CFGF_DEFINIT 128
        !            93: 
        !            94: /** Return codes from cfg_parse(). */
        !            95: #define CFG_SUCCESS 0
        !            96: #define CFG_FILE_ERROR -1
        !            97: #define CFG_PARSE_ERROR 1
        !            98: 
        !            99: typedef union cfg_value_t cfg_value_t;
        !           100: typedef struct cfg_opt_t cfg_opt_t;
        !           101: typedef struct cfg_t cfg_t;
        !           102: typedef struct cfg_defvalue_t cfg_defvalue_t;
        !           103: typedef int cfg_flag_t;
        !           104: 
        !           105: /** Function prototype used by CFGT_FUNC options.
        !           106:  *
        !           107:  * This is a callback function, registered with the CFG_FUNC
        !           108:  * initializer. Each time libConfuse finds a function, the registered
        !           109:  * callback function is called (parameters are passed as strings, any
        !           110:  * conversion to other types should be made in the callback
        !           111:  * function). libConfuse does not support any storage of the data
        !           112:  * found; these are passed as parameters to the callback, and it's the
        !           113:  * responsibility of the callback function to do whatever it should do
        !           114:  * with the data.
        !           115:  *
        !           116:  * @param cfg The configuration file context.
        !           117:  * @param opt The option.
        !           118:  * @param argc Number of arguments passed. The callback function is
        !           119:  * responsible for checking that the correct number of arguments are
        !           120:  * passed.
        !           121:  * @param argv Arguments as an array of character strings.
        !           122:  *
        !           123:  * @return On success, 0 should be returned. All other values
        !           124:  * indicates an error, and the parsing is aborted. The callback
        !           125:  * function should notify the error itself, for example by calling
        !           126:  * cfg_error().
        !           127:  *
        !           128:  * @see CFG_FUNC
        !           129:  */
        !           130: typedef int (*cfg_func_t)(cfg_t *cfg, cfg_opt_t *opt,
        !           131:                           int argc, const char **argv);
        !           132: 
        !           133: /** Function prototype used by the cfg_print_ functions.
        !           134:  *
        !           135:  * This callback function is used to print option values. For options
        !           136:  * with a value parsing callback, this is often required, especially
        !           137:  * if a string is mapped to an integer by the callback. This print
        !           138:  * callback must then map the integer back to the appropriate string.
        !           139:  *
        !           140:  * Except for functions, the print callback function should only print
        !           141:  * the value of the option, not the name and the equal sign (that is
        !           142:  * handled by the cfg_opt_print function). For function options
        !           143:  * however, the name and the parenthesis must be printed by this
        !           144:  * function. The value to print can be accessed with the cfg_opt_get
        !           145:  * functions.
        !           146:  *
        !           147:  * @param opt The option structure (eg, as returned from cfg_getopt())
        !           148:  * @param index Index of the value to get. Zero based.
        !           149:  * @param fp File stream to print to, use stdout to print to the screen.
        !           150:  *
        !           151:  * @see cfg_print, cfg_set_print_func
        !           152:  */
        !           153: typedef void (*cfg_print_func_t)(cfg_opt_t *opt, unsigned int index, FILE *fp);
        !           154:     
        !           155: /** Value parsing callback prototype
        !           156:  *
        !           157:  * This is a callback function (different from the one registered with the
        !           158:  * CFG_FUNC initializer) used to parse a value. This can be used to override
        !           159:  * the internal parsing of a value.
        !           160:  *
        !           161:  * Suppose you want an integer option that only can have certain values, for
        !           162:  * example 1, 2 and 3, and these should be written in the configuration file as
        !           163:  * "yes", "no" and "maybe". The callback function would be called with the
        !           164:  * found value ("yes", "no" or "maybe") as a string, and the result should be
        !           165:  * stored in the result parameter.
        !           166:  *
        !           167:  * @param cfg The configuration file context.
        !           168:  * @param opt The option.
        !           169:  * @param value The value found in the configuration file.
        !           170:  * @param result Pointer to storage for the result, cast to a void pointer.
        !           171:  *
        !           172:  * @return On success, 0 should be returned. All other values indicates an
        !           173:  * error, and the parsing is aborted. The callback function should notify the
        !           174:  * error itself, for example by calling cfg_error().
        !           175:  */
        !           176: typedef int (*cfg_callback_t)(cfg_t *cfg, cfg_opt_t *opt,
        !           177:                               const char *value, void *result);
        !           178: 
        !           179: /** Validating callback prototype
        !           180:  *
        !           181:  * This callback function is called after an option has been parsed and set.
        !           182:  * The function is called for both fundamental values (strings, integers etc)
        !           183:  * as well as lists and sections. This can for example be used to validate that
        !           184:  * all required options in a section has been set to sane values.
        !           185:  *
        !           186:  * @return On success, 0 should be returned. All other values indicates an
        !           187:  * error, and the parsing is aborted. The callback function should notify the
        !           188:  * error itself, for example by calling cfg_error().
        !           189:  *
        !           190:  * @see cfg_set_validate_func
        !           191:  */
        !           192: typedef int (*cfg_validate_callback_t)(cfg_t *cfg, cfg_opt_t *opt);
        !           193: 
        !           194: /** User-defined memory release function for CFG_PTR values
        !           195:  *
        !           196:  * This callback is used to free memory allocated in a value parsing callback
        !           197:  * function. Especially useful for CFG_PTR options, since libConfuse will not
        !           198:  * itself release such values. If the values are simply allocated with a
        !           199:  * malloc(3), one can use the standard free(3) function here.
        !           200:  *
        !           201:  */
        !           202: typedef void (*cfg_free_func_t)(void *value);
        !           203: 
        !           204: /** Boolean values. */
        !           205: typedef enum {cfg_false, cfg_true} cfg_bool_t;
        !           206: 
        !           207: /** Error reporting function. */
        !           208: typedef void (*cfg_errfunc_t)(cfg_t *cfg, const char *fmt, va_list ap);
        !           209: 
        !           210: /** Data structure holding information about a "section". Sections can
        !           211:  * be nested. A section has a list of options (strings, numbers,
        !           212:  * booleans or other sections) grouped together.
        !           213:  */
        !           214: struct cfg_t {
        !           215:     cfg_flag_t flags;       /**< Any flags passed to cfg_init() */
        !           216:     char *name;             /**< The name of this section, the root
        !           217:                              * section returned from cfg_init() is
        !           218:                              * always named "root" */
        !           219:     cfg_opt_t *opts;        /**< Array of options */
        !           220:     char *title;            /**< Optional title for this section, only
        !           221:                              * set if CFGF_TITLE flag is set */
        !           222:     char *filename;         /**< Name of the file being parsed */
        !           223:     int line;               /**< Line number in the config file */
        !           224:     cfg_errfunc_t errfunc;  /**< This function (if set with
        !           225:                              * cfg_set_error_function) is called for
        !           226:                              * any error message. */
        !           227: };
        !           228: 
        !           229: /** Data structure holding the value of a fundamental option value.
        !           230:  */
        !           231: union cfg_value_t {
        !           232:     long int number;        /**< integer value */
        !           233:     double fpnumber;        /**< floating point value */
        !           234:     cfg_bool_t boolean;     /**< boolean value */
        !           235:     char *string;           /**< string value */
        !           236:     cfg_t *section;         /**< section value */
        !           237:     void *ptr;              /**< user-defined value */
        !           238: };
        !           239: 
        !           240: /** Data structure holding the default value given by the
        !           241:  *  initialization macros.
        !           242:  */
        !           243: struct cfg_defvalue_t {
        !           244:     long int number;        /**< default integer value */
        !           245:     double fpnumber;        /**< default floating point value */
        !           246:     cfg_bool_t boolean;     /**< default boolean value */
        !           247:     char *string;           /**< default string value */
        !           248:     char *parsed;           /**< default value that is parsed by
        !           249:                              * libConfuse, used for lists and
        !           250:                              * functions */
        !           251: };
        !           252: 
        !           253: /** Data structure holding information about an option. The value(s)
        !           254:  * are stored as an array of fundamental values (strings, numbers,
        !           255:  * etc).
        !           256:  */
        !           257: struct cfg_opt_t {
        !           258:     char *name;             /**< The name of the option */
        !           259:     cfg_type_t type;        /**< Type of option */
        !           260:     unsigned int nvalues;   /**< Number of values parsed */
        !           261:     cfg_value_t **values;   /**< Array of found values */
        !           262:     cfg_flag_t flags;       /**< Flags */
        !           263:     cfg_opt_t *subopts;     /**< Suboptions (only applies to sections) */
        !           264:     cfg_defvalue_t def;     /**< Default value */
        !           265:     cfg_func_t func;        /**< Function callback for CFGT_FUNC options */
        !           266:     void *simple_value;     /**< Pointer to user-specified variable to
        !           267:                              * store simple values (created with the
        !           268:                              * CFG_SIMPLE_* initializers) */
        !           269:     cfg_callback_t parsecb; /**< Value parsing callback function */
        !           270:     cfg_validate_callback_t validcb; /**< Value validating callback function */
        !           271:     cfg_print_func_t pf;    /**< print callback function */
        !           272:     cfg_free_func_t freecb; /***< user-defined memory release function */
        !           273: };
        !           274: 
        !           275: extern const char __export confuse_copyright[];
        !           276: extern const char __export confuse_version[];
        !           277: extern const char __export confuse_author[];
        !           278: 
        !           279: #define __CFG_STR(name, def, flags, svalue, cb) \
        !           280:   {name,CFGT_STR,0,0,flags,0,{0,0,cfg_false,def,0},0,svalue,cb,0,0,0}
        !           281: #define __CFG_STR_LIST(name, def, flags, svalue, cb) \
        !           282:   {name,CFGT_STR,0,0,flags | CFGF_LIST,0,{0,0,cfg_false,0,def},0,svalue,cb,0,0,0}
        !           283: 
        !           284: /** Initialize a string option
        !           285:  */
        !           286: #define CFG_STR(name, def, flags) \
        !           287:   __CFG_STR(name, def, flags, 0, 0)
        !           288: 
        !           289: /** Initialize a string list option
        !           290:  */
        !           291: #define CFG_STR_LIST(name, def, flags) \
        !           292:   __CFG_STR_LIST(name, def, flags, 0, 0)
        !           293: 
        !           294: /** Initialize a string option with a value parsing callback
        !           295:  */
        !           296: #define CFG_STR_CB(name, def, flags, cb) \
        !           297:   __CFG_STR(name, def, flags, 0, cb)
        !           298: 
        !           299: /** Initialize a string list option with a value parsing callback
        !           300:  */
        !           301: #define CFG_STR_LIST_CB(name, def, flags, cb) \
        !           302:   __CFG_STR_LIST(name, def, flags, 0, cb)
        !           303: 
        !           304: /** Initialize a "simple" string option.
        !           305:  *
        !           306:  * "Simple" options (in lack of a better expression) does not support
        !           307:  * lists of values or multiple sections. LibConfuse will store the
        !           308:  * value of a simple option in the user-defined location specified by
        !           309:  * the value parameter in the initializer. Simple options are not
        !           310:  * stored in the cfg_t context, only a pointer. Sections can not be
        !           311:  * initialized as a "simple" option.
        !           312:  *
        !           313:  * As of version 2.2, libConfuse can now return the values of simple
        !           314:  * options with the cfg_get functions. This allows using the new
        !           315:  * cfg_print function with simple options.
        !           316:  *
        !           317:  * libConfuse doesn't support handling default values for "simple"
        !           318:  * options. They are assumed to be set by the calling application
        !           319:  * before cfg_parse is called.
        !           320:  *
        !           321:  * @param name name of the option
        !           322:  * @param svalue pointer to a character pointer (a char **). This value
        !           323:  * must be initalized either to NULL or to a malloc()'ed string. You
        !           324:  * can't use
        !           325:  * <pre>
        !           326:  * char *user = "joe";
        !           327:  * ...
        !           328:  * cfg_opt_t opts[] = {
        !           329:  *     CFG_SIMPLE_STR("user", &user),
        !           330:  * ...
        !           331:  * </pre>
        !           332:  * since libConfuse will try to free the static string "joe" (which is
        !           333:  * an error) when a "user" option is found. Rather, use the following
        !           334:  * code snippet:
        !           335:  * <pre>
        !           336:  * char *user = strdup("joe");
        !           337:  * ...
        !           338:  * cfg_opt_t opts[] = {
        !           339:  *      CFG_SIMPLE_STR("user", &user),
        !           340:  * ...
        !           341:  * </pre>
        !           342:  * Alternatively, the default value can be set after the opts struct
        !           343:  * is defined, as in:
        !           344:  * <pre>
        !           345:  * char *user = 0;
        !           346:  * ...
        !           347:  * cfg_opt_t opts[] = {
        !           348:  *      CFG_SIMPLE_STR("user", &user),
        !           349:  * ...
        !           350:  * user = strdup("joe");
        !           351:  * cfg = cfg_init(opts, 0);
        !           352:  * cfg_parse(cfg, filename);
        !           353:  * </pre>
        !           354:  *
        !           355:  */
        !           356: #define CFG_SIMPLE_STR(name, svalue) \
        !           357:   __CFG_STR(name, 0, CFGF_NONE, svalue, 0)
        !           358: 
        !           359: 
        !           360: #define __CFG_INT(name, def, flags, svalue, cb) \
        !           361:   {name,CFGT_INT,0,0,flags,0,{def,0,cfg_false,0,0},0,svalue,cb,0,0,0}
        !           362: #define __CFG_INT_LIST(name, def, flags, svalue, cb) \
        !           363:   {name,CFGT_INT,0,0,flags | CFGF_LIST,0,{0,0,cfg_false,0,def},0,svalue,cb,0,0,0}
        !           364: 
        !           365: /** Initialize an integer option
        !           366:  */
        !           367: #define CFG_INT(name, def, flags) \
        !           368:   __CFG_INT(name, def, flags, 0, 0)
        !           369: 
        !           370: /** Initialize an integer list option
        !           371:  */
        !           372: #define CFG_INT_LIST(name, def, flags) \
        !           373:   __CFG_INT_LIST(name, def, flags, 0, 0)
        !           374: 
        !           375: /** Initialize an integer option with a value parsing callback
        !           376:  */
        !           377: #define CFG_INT_CB(name, def, flags, cb) \
        !           378:   __CFG_INT(name, def, flags, 0, cb)
        !           379: 
        !           380: /** Initialize an integer list option with a value parsing callback
        !           381:  */
        !           382: #define CFG_INT_LIST_CB(name, def, flags, cb) \
        !           383:   __CFG_INT_LIST(name, def, flags, 0, cb)
        !           384: 
        !           385: /** Initialize a "simple" integer option (see documentation for
        !           386:  * CFG_SIMPLE_STR for more information).
        !           387:  */
        !           388: #define CFG_SIMPLE_INT(name, svalue) \
        !           389:   __CFG_INT(name, 0, CFGF_NONE, svalue, 0)
        !           390: 
        !           391: 
        !           392: 
        !           393: #define __CFG_FLOAT(name, def, flags, svalue, cb) \
        !           394:   {name,CFGT_FLOAT,0,0,flags,0,{0,def,cfg_false,0,0},0,svalue,cb,0,0,0}
        !           395: #define __CFG_FLOAT_LIST(name, def, flags, svalue, cb) \
        !           396:   {name,CFGT_FLOAT,0,0,flags | CFGF_LIST,0,{0,0,cfg_false,0,def},0,svalue,cb,0,0,0}
        !           397: 
        !           398: /** Initialize a floating point option
        !           399:  */
        !           400: #define CFG_FLOAT(name, def, flags) \
        !           401:   __CFG_FLOAT(name, def, flags, 0, 0)
        !           402: 
        !           403: /** Initialize a floating point list option
        !           404:  */
        !           405: #define CFG_FLOAT_LIST(name, def, flags) \
        !           406:   __CFG_FLOAT_LIST(name, def, flags, 0, 0)
        !           407: 
        !           408: /** Initialize a floating point option with a value parsing callback
        !           409:  */
        !           410: #define CFG_FLOAT_CB(name, def, flags, cb) \
        !           411:   __CFG_FLOAT(name, def, flags, 0, cb)
        !           412: 
        !           413: /** Initialize a floating point list option with a value parsing callback
        !           414:  */
        !           415: #define CFG_FLOAT_LIST_CB(name, def, flags, cb) \
        !           416:   __CFG_FLOAT_LIST(name, def, flags, 0, cb)
        !           417: 
        !           418: /** Initialize a "simple" floating point option (see documentation for
        !           419:  * CFG_SIMPLE_STR for more information).
        !           420:  */
        !           421: #define CFG_SIMPLE_FLOAT(name, svalue) \
        !           422:   __CFG_FLOAT(name, 0, CFGF_NONE, svalue, 0)
        !           423: 
        !           424: 
        !           425: 
        !           426: #define __CFG_BOOL(name, def, flags, svalue, cb) \
        !           427:   {name,CFGT_BOOL,0,0,flags,0,{0,0,def,0,0},0,svalue,cb,0,0,0}
        !           428: #define __CFG_BOOL_LIST(name, def, flags, svalue, cb) \
        !           429:   {name,CFGT_BOOL,0,0,flags | CFGF_LIST,0,{0,0,cfg_false,0,def},0,svalue,cb,0,0,0}
        !           430: 
        !           431: /** Initialize a boolean option
        !           432:  */
        !           433: #define CFG_BOOL(name, def, flags) \
        !           434:   __CFG_BOOL(name, def, flags, 0, 0)
        !           435: 
        !           436: /** Initialize a boolean list option
        !           437:  */
        !           438: #define CFG_BOOL_LIST(name, def, flags) \
        !           439:   __CFG_BOOL_LIST(name, def, flags, 0, 0)
        !           440: 
        !           441: /** Initialize a boolean option with a value parsing callback
        !           442:  */
        !           443: #define CFG_BOOL_CB(name, def, flags, cb) \
        !           444:   __CFG_BOOL(name, def, flags, 0, cb)
        !           445: 
        !           446: /** Initialize a boolean list option with a value parsing callback
        !           447:  */
        !           448: #define CFG_BOOL_LIST_CB(name, def, flags, cb) \
        !           449:   __CFG_BOOL_LIST(name, def, flags, 0, cb)
        !           450: 
        !           451: /** Initialize a "simple" boolean option (see documentation for
        !           452:  * CFG_SIMPLE_STR for more information).
        !           453:  */
        !           454: #define CFG_SIMPLE_BOOL(name, svalue) \
        !           455:   __CFG_BOOL(name, cfg_false, CFGF_NONE, svalue, 0)
        !           456: 
        !           457: 
        !           458: 
        !           459: /** Initialize a section
        !           460:  *
        !           461:  * @param name The name of the option
        !           462:  * @param opts Array of options that are valid within this section
        !           463: 
        !           464:  * @param flags Flags, specify CFGF_MULTI if it should be possible to
        !           465:  * have multiples of the same section, and CFGF_TITLE if the
        !           466:  * section(s) must have a title (which can be used in the
        !           467:  * cfg_gettsec() function)
        !           468:  *
        !           469:  */
        !           470: #define CFG_SEC(name, opts, flags) \
        !           471:   {name,CFGT_SEC,0,0,flags,opts,{0,0,cfg_false,0,0},0,0,0,0,0,0}
        !           472: 
        !           473: 
        !           474: 
        !           475: /** Initialize a function
        !           476:  * @param name The name of the option
        !           477:  * @param func The callback function.
        !           478:  *
        !           479:  * @see cfg_func_t
        !           480:  */
        !           481: #define CFG_FUNC(name, func) \
        !           482:   {name,CFGT_FUNC,0,0,CFGF_NONE,0,{0,0,cfg_false,0,0},func,0,0,0,0,0}
        !           483: 
        !           484: 
        !           485: #define __CFG_PTR(name, def, flags, svalue, parsecb, freecb) \
        !           486:   {name,CFGT_PTR,0,0,flags,0,{0,0,cfg_false,0,def},0,svalue,parsecb,0,0,freecb}
        !           487: #define __CFG_PTR_LIST(name, def, flags, svalue, parsecb, freecb) \
        !           488:   {name,CFGT_PTR,0,0,flags | CFGF_LIST,0,{0,0,cfg_false,0,def},0,svalue,parsecb,0,0,freecb}
        !           489: 
        !           490: /** Initialize a user-defined option
        !           491:  *
        !           492:  * CFG_PTR options can only be used together with a value parsing callback.
        !           493:  * 
        !           494:  * @param name The name of the option
        !           495:  * @param def Default value
        !           496:  * @param flags Flags
        !           497:  * @param parsecb Value parsing callback
        !           498:  * @param freecb Memory release function
        !           499:  *
        !           500:  * @see cfg_callback_t, cfg_free_func_t
        !           501:  */
        !           502: #define CFG_PTR_CB(name, def, flags, parsecb, freecb) \
        !           503:   __CFG_PTR(name, def, flags, 0, parsecb, freecb)
        !           504: 
        !           505: /** Initialize a list of user-defined options
        !           506:  */
        !           507: #define CFG_PTR_LIST_CB(name, def, flags, parsecb, freecb) \
        !           508:   __CFG_PTR(name, def, flags | CFGF_LIST, 0, parsecb, freecb)
        !           509: 
        !           510: /*#define CFG_SIMPLE_PTR(name, svalue, cb) \
        !           511:   __CFG_PTR(name, 0, 0, svalue, cb)*/
        !           512: 
        !           513: 
        !           514: /** Terminate list of options. This must be the last initializer in
        !           515:  * the option list.
        !           516:  */
        !           517: #define CFG_END() \
        !           518:    {0,CFGT_NONE,0,0,CFGF_NONE,0,{0,0,cfg_false,0,0},0,0,0,0,0,0}
        !           519: 
        !           520: 
        !           521: 
        !           522: /** Create and initialize a cfg_t structure. This should be the first function
        !           523:  * called when setting up the parsing of a configuration file. The options
        !           524:  * passed in the first parameter is initialized using the CFG_* initializers.
        !           525:  * The last option in the option array must be CFG_END(), unless you like
        !           526:  * segmentation faults.
        !           527:  *
        !           528:  * The options must no longer be defined in the same scope as where the cfg_xxx
        !           529:  * functions are used (since version 2.3). 
        !           530:  *
        !           531:  * @param opts An arrary of options
        !           532:  * @param flags One or more flags (bitwise or'ed together). Currently only
        !           533:  * CFGF_NOCASE is available. Use 0 if no flags are needed.
        !           534:  *
        !           535:  * @return A configuration context structure. This pointer is passed
        !           536:  * to almost all other functions as the first parameter.
        !           537:  */
        !           538: DLLIMPORT cfg_t * __export cfg_init(cfg_opt_t *opts, cfg_flag_t flags);
        !           539: 
        !           540: /** Parse a configuration file. Tilde expansion is performed on the
        !           541:  * filename before it is opened. After a configuration file has been
        !           542:  * initialized (with cfg_init()) and parsed (with cfg_parse()), the
        !           543:  * values can be read with the cfg_getXXX functions.
        !           544:  *
        !           545:  * @param cfg The configuration file context as returned from cfg_init().
        !           546:  * @param filename The name of the file to parse.
        !           547:  *
        !           548:  * @return On success, CFG_SUCCESS is returned. If the file couldn't
        !           549:  * be opened for reading, CFG_FILE_ERROR is returned. On all other
        !           550:  * errors, CFG_PARSE_ERROR is returned and cfg_error() was called with
        !           551:  * a descriptive error message.
        !           552:  */
        !           553: DLLIMPORT int __export cfg_parse(cfg_t *cfg, const char *filename);
        !           554: 
        !           555: /** Same as cfg_parse() above, but takes an already opened file as
        !           556:  * argument. Reading begins at the current position. After parsing,
        !           557:  * the position is not reset. The caller is responsible for closing
        !           558:  * the file.
        !           559:  *
        !           560:  * @param cfg The configuration file context as returned from cfg_init().
        !           561:  * @param fp An open file stream.
        !           562:  *
        !           563:  * @see cfg_parse()
        !           564:  */
        !           565: DLLIMPORT int __export cfg_parse_fp(cfg_t *cfg, FILE *fp);
        !           566: 
        !           567: /** Same as cfg_parse() above, but takes a character buffer as
        !           568:  * argument.
        !           569:  *
        !           570:  * @param cfg The configuration file context as returned from cfg_init().
        !           571:  * @param buf A zero-terminated string with configuration directives.
        !           572:  *
        !           573:  * @see cfg_parse()
        !           574:  */
        !           575: DLLIMPORT int __export cfg_parse_buf(cfg_t *cfg, const char *buf);
        !           576: 
        !           577: /** Free the memory allocated for the values of a given option. Only
        !           578:  * the values are freed, not the option itself (it is freed by cfg_free()).
        !           579:  *
        !           580:  * @see cfg_free()
        !           581:  */
        !           582: DLLIMPORT void __export cfg_free_value(cfg_opt_t *opt);
        !           583: 
        !           584: /** Free a cfg_t context. All memory allocated by the cfg_t context
        !           585:  * structure are freed, and can't be used in any further cfg_* calls.
        !           586:  */
        !           587: DLLIMPORT void __export cfg_free(cfg_t *cfg);
        !           588: 
        !           589: /** Install a user-defined error reporting function.
        !           590:  * @return The old error reporting function is returned.
        !           591:  */
        !           592: DLLIMPORT cfg_errfunc_t __export cfg_set_error_function(cfg_t *cfg,
        !           593:                                                         cfg_errfunc_t errfunc);
        !           594: 
        !           595: /** Show a parser error. Any user-defined error reporting function is called.
        !           596:  * @see cfg_set_error_function
        !           597:  */
        !           598: DLLIMPORT void __export cfg_error(cfg_t *cfg, const char *fmt, ...);
        !           599: 
        !           600: /** Returns the value of an integer option, given a cfg_opt_t pointer.
        !           601:  * @param opt The option structure (eg, as returned from cfg_getopt())
        !           602:  * @param index Index of the value to get. Zero based.
        !           603:  * @see cfg_getnint
        !           604:  */
        !           605: DLLIMPORT signed long __export cfg_opt_getnint(cfg_opt_t *opt, unsigned int index);
        !           606: 
        !           607: /** Indexed version of cfg_getint(), used for lists.
        !           608:  * @param cfg The configuration file context.
        !           609:  * @param name The name of the option.
        !           610:  * @param index Index of the value to get. Zero based.
        !           611:  * @see cfg_getint
        !           612:  */
        !           613: DLLIMPORT long int __export cfg_getnint(cfg_t *cfg, const char *name,
        !           614:                                         unsigned int index);
        !           615: 
        !           616: /** Returns the value of an integer option. This is the same as
        !           617:  * calling cfg_getnint with index 0.
        !           618:  * @param cfg The configuration file context.
        !           619:  * @param name The name of the option.
        !           620:  * @return The requested value is returned. If the option was not set
        !           621:  * in the configuration file, the default value given in the
        !           622:  * corresponding cfg_opt_t structure is returned. It is an error to
        !           623:  * try to get an option that isn't declared.
        !           624:  */
        !           625: DLLIMPORT long int __export cfg_getint(cfg_t *cfg, const char *name);
        !           626: 
        !           627: /** Returns the value of a floating point option, given a cfg_opt_t pointer.
        !           628:  * @param opt The option structure (eg, as returned from cfg_getopt())
        !           629:  * @param index Index of the value to get. Zero based.
        !           630:  * @see cfg_getnfloat
        !           631:  */
        !           632: DLLIMPORT double __export cfg_opt_getnfloat(cfg_opt_t *opt, unsigned int index);
        !           633: 
        !           634: /** Indexed version of cfg_getfloat(), used for lists.
        !           635:  * @param cfg The configuration file context.
        !           636:  * @param name The name of the option.
        !           637:  * @param index Index of the value to get. Zero based.
        !           638:  * @see cfg_getfloat
        !           639:  */
        !           640: DLLIMPORT double __export cfg_getnfloat(cfg_t *cfg, const char *name,
        !           641:                                         unsigned int index);
        !           642: 
        !           643: /** Returns the value of a floating point option.
        !           644:  * @param cfg The configuration file context.
        !           645:  * @param name The name of the option.
        !           646:  * @return The requested value is returned. If the option was not set
        !           647:  * in the configuration file, the default value given in the
        !           648:  * corresponding cfg_opt_t structure is returned. It is an error to
        !           649:  * try to get an option that isn't declared.
        !           650:  */
        !           651: DLLIMPORT double __export cfg_getfloat(cfg_t *cfg, const char *name);
        !           652: 
        !           653: /** Returns the value of a string option, given a cfg_opt_t pointer.
        !           654:  * @param opt The option structure (eg, as returned from cfg_getopt())
        !           655:  * @param index Index of the value to get. Zero based.
        !           656:  * @see cfg_getnstr
        !           657:  */
        !           658: DLLIMPORT char * __export cfg_opt_getnstr(cfg_opt_t *opt, unsigned int index);
        !           659: 
        !           660: /** Indexed version of cfg_getstr(), used for lists.
        !           661:  * @param cfg The configuration file context.
        !           662:  * @param name The name of the option.
        !           663:  * @param index Index of the value to get. Zero based.
        !           664:  * @see cfg_getstr
        !           665:  */
        !           666: DLLIMPORT char * __export cfg_getnstr(cfg_t *cfg, const char *name,
        !           667:                                       unsigned int index);
        !           668: 
        !           669: /** Returns the value of a string option.
        !           670:  * @param cfg The configuration file context.
        !           671:  * @param name The name of the option.
        !           672:  * @return The requested value is returned. If the option was not set
        !           673:  * in the configuration file, the default value given in the
        !           674:  * corresponding cfg_opt_t structure is returned. It is an error to
        !           675:  * try to get an option that isn't declared.
        !           676:  */
        !           677: DLLIMPORT char * __export cfg_getstr(cfg_t *cfg, const char *name);
        !           678: 
        !           679: /** Returns the value of a boolean option, given a cfg_opt_t pointer.
        !           680:  * @param opt The option structure (eg, as returned from cfg_getopt())
        !           681:  * @param index Index of the value to get. Zero based.
        !           682:  * @see cfg_getnbool
        !           683:  */
        !           684: DLLIMPORT cfg_bool_t __export cfg_opt_getnbool(cfg_opt_t *opt, unsigned int index);
        !           685:     
        !           686: /** Indexed version of cfg_getbool(), used for lists.
        !           687:  *
        !           688:  * @param cfg The configuration file context.
        !           689:  * @param name The name of the option.
        !           690:  * @param index Index of the value to get. Zero based.
        !           691:  * @see cfg_getbool
        !           692:  */
        !           693: DLLIMPORT cfg_bool_t __export cfg_getnbool(cfg_t *cfg, const char *name,
        !           694:                                            unsigned int index);
        !           695: 
        !           696: /** Returns the value of a boolean option.
        !           697:  * @param cfg The configuration file context.
        !           698:  * @param name The name of the option.
        !           699:  * @return The requested value is returned. If the option was not set
        !           700:  * in the configuration file, the default value given in the
        !           701:  * corresponding cfg_opt_t structure is returned. It is an error to
        !           702:  * try to get an option that isn't declared.
        !           703:  */
        !           704: DLLIMPORT cfg_bool_t __export cfg_getbool(cfg_t *cfg, const char *name);
        !           705: 
        !           706: 
        !           707: DLLIMPORT void * __export cfg_opt_getnptr(cfg_opt_t *opt, unsigned int index);
        !           708: DLLIMPORT void * __export cfg_getnptr(cfg_t *cfg, const char *name, unsigned int indx);
        !           709: 
        !           710: /** Returns the value of a user-defined option (void pointer).
        !           711:  * @param cfg The configuration file context.
        !           712:  * @param name The name of the option.
        !           713:  * @return The requested value is returned. If the option was not set
        !           714:  * in the configuration file, the default value given in the
        !           715:  * corresponding cfg_opt_t structure is returned. It is an error to
        !           716:  * try to get an option that isn't declared.
        !           717:  */
        !           718: DLLIMPORT void * __export cfg_getptr(cfg_t *cfg, const char *name);
        !           719: 
        !           720: 
        !           721: /** Returns the value of a section option, given a cfg_opt_t pointer.
        !           722:  * @param opt The option structure (eg, as returned from cfg_getopt())
        !           723:  * @param index Index of the value to get. Zero based.
        !           724:  * @see cfg_getnsec
        !           725:  */
        !           726: DLLIMPORT cfg_t * __export cfg_opt_getnsec(cfg_opt_t *opt, unsigned int index);
        !           727: 
        !           728: /** Indexed version of cfg_getsec(), used for sections with the
        !           729:  * CFGF_MULTI flag set.
        !           730:  *
        !           731:  * @param cfg The configuration file context.
        !           732:  * @param name The name of the option.
        !           733:  * @param index Index of the section to get. Zero based.
        !           734:  * @see cfg_getsec
        !           735:  */
        !           736: DLLIMPORT cfg_t * __export cfg_getnsec(cfg_t *cfg, const char *name,
        !           737:                                        unsigned int index);
        !           738: 
        !           739: /** Returns the value of a section option, given a cfg_opt_t pointer
        !           740:  * and the title.
        !           741:  * @param opt The option structure (eg, as returned from cfg_getopt())
        !           742:  * @param title The title of this section. The CFGF_TITLE flag must
        !           743:  * have been set for this option.
        !           744:  * @see cfg_gettsec
        !           745:  */
        !           746: DLLIMPORT cfg_t * __export cfg_opt_gettsec(cfg_opt_t *opt, const char *title);
        !           747: 
        !           748: /** Return a section given the title, used for section with the
        !           749:  * CFGF_TITLE flag set.
        !           750:  *
        !           751:  * @param cfg The configuration file context.
        !           752:  * @param name The name of the option.
        !           753:  * @param title The title of this section. The CFGF_TITLE flag must
        !           754:  * have been set for this option.
        !           755:  * @see cfg_getsec
        !           756:  */
        !           757: DLLIMPORT cfg_t * __export cfg_gettsec(cfg_t *cfg, const char *name,
        !           758:                                        const char *title);
        !           759: 
        !           760: /** Returns the value of a section option. The returned value is
        !           761:  * another cfg_t structure that can be used in following calls to
        !           762:  * cfg_getint, cfg_getstr or other get-functions.
        !           763:  * @param cfg The configuration file context.
        !           764:  * @param name The name of the option.
        !           765:  * @return The requested section is returned. If no section is found
        !           766:  * with that name, 0 is returned. There can only be default values for
        !           767:  * section without the CFGF_MULTI flag set. It is an error to try to
        !           768:  * get a section that isn't declared.
        !           769:  */
        !           770: DLLIMPORT cfg_t * __export cfg_getsec(cfg_t *cfg, const char *name);
        !           771: 
        !           772: /** Return the number of values this option has. If no default value
        !           773:  * is given for the option and no value was found in the config file,
        !           774:  * 0 will be returned (ie, the option value is not set at all).
        !           775:  * @param opt The option structure (eg, as returned from cfg_getopt())
        !           776:  */
        !           777: DLLIMPORT unsigned int __export cfg_opt_size(cfg_opt_t *opt);
        !           778: 
        !           779: /** Return the number of values this option has. If no default value
        !           780:  * is given for the option and no value was found in the config file,
        !           781:  * 0 will be returned (ie, the option value is not set at all).
        !           782:  *
        !           783:  * Note that there is no way to *not* specify a default value for integers,
        !           784:  * floats and booleans. Ie, they always have default values (since 0 or NULL is
        !           785:  * a valid integer/float/boolean value). Only strings and lists may have no
        !           786:  * default value.
        !           787:  *
        !           788:  * @param cfg The configuration file context.
        !           789:  * @param name The name of the option.
        !           790:  */
        !           791: DLLIMPORT unsigned int __export cfg_size(cfg_t *cfg, const char *name);
        !           792: 
        !           793: /** Return the title of a section.
        !           794:  *
        !           795:  * @param cfg The configuration file context.
        !           796:  * @return Returns the title, or 0 if there is no title. This string
        !           797:  * should not be modified.
        !           798:  */
        !           799: DLLIMPORT const char * __export cfg_title(cfg_t *cfg);
        !           800: 
        !           801: /** Return the name of a section.
        !           802:  *
        !           803:  * @param cfg The configuration file context.
        !           804:  * @return Returns the title, or 0 if there is no title. This string
        !           805:  * should not be modified.
        !           806:  */
        !           807: DLLIMPORT const char * __export cfg_name(cfg_t *cfg);
        !           808: 
        !           809: /** Return the name of an option.
        !           810:  *
        !           811:  * @param opt The option structure (eg, as returned from cfg_getopt())
        !           812:  * @return Returns the title, or 0 if there is no title. This string
        !           813:  * should not be modified.
        !           814:  */
        !           815: DLLIMPORT const char * __export cfg_opt_name(cfg_opt_t *opt);
        !           816: 
        !           817: /** Predefined include-function. This function can be used in the
        !           818:  * options passed to cfg_init() to specify a function for including
        !           819:  * other configuration files in the parsing. For example:
        !           820:  * CFG_FUNC("include", &cfg_include)
        !           821:  */
        !           822: DLLIMPORT int __export cfg_include(cfg_t *cfg, cfg_opt_t *opt, int argc,
        !           823:                                    const char **argv);
        !           824: 
        !           825: /** Does tilde expansion (~ -> $HOME) on the filename.
        !           826:  * @return The expanded filename is returned. If a ~user was not
        !           827:  * found, the original filename is returned. In any case, a
        !           828:  * dynamically allocated string is returned, which should be free()'d
        !           829:  * by the caller.
        !           830:  */
        !           831: DLLIMPORT char * __export cfg_tilde_expand(const char *filename);
        !           832: 
        !           833: /** Parse a boolean option string. Accepted "true" values are "true",
        !           834:  * "on" and "yes", and accepted "false" values are "false", "off" and
        !           835:  * "no".
        !           836:  *
        !           837:  * @return Returns 1 or 0 (true/false) if the string was parsed
        !           838:  * correctly, or -1 if an error occurred.
        !           839:  */
        !           840: DLLIMPORT int __export cfg_parse_boolean(const char *s);
        !           841: 
        !           842: /** Return an option given it's name.
        !           843:  *
        !           844:  * @param cfg The configuration file context.
        !           845:  * @param name The name of the option.
        !           846:  *
        !           847:  * @return Returns a pointer to the option. If the option isn't declared,
        !           848:  * libConfuse will print an error message and return 0.
        !           849:  */
        !           850: DLLIMPORT cfg_opt_t * __export cfg_getopt(cfg_t *cfg, const char *name);
        !           851: 
        !           852: /** Set an option (create an instance of an option).
        !           853:  *
        !           854:  * @param cfg The configuration file context.
        !           855:  * @param opt The option definition.
        !           856:  * @param value The initial value for the option.
        !           857:  *
        !           858:  * @return Returns a pointer to the value object.
        !           859:  */
        !           860: DLLIMPORT cfg_value_t *cfg_setopt(cfg_t *cfg, cfg_opt_t *opt, char *value);
        !           861: 
        !           862: /** Set a value of an integer option.
        !           863:  *
        !           864:  * @param opt The option structure (eg, as returned from cfg_getopt())
        !           865:  * @param value The value to set.
        !           866:  * @param index The index in the option value array that should be
        !           867:  * modified. It is an error to set values with indices larger than 0
        !           868:  * for options without the CFGF_LIST flag set.
        !           869:  */
        !           870: DLLIMPORT void __export cfg_opt_setnint(cfg_opt_t *opt,
        !           871:                                         long int value, unsigned int index);
        !           872: 
        !           873: /** Set the value of an integer option given its name.
        !           874:  *
        !           875:  * @param cfg The configuration file context.
        !           876:  * @param name The name of the option.
        !           877:  * @param value The value to set. If the option is a list (the CFGF_LIST flag
        !           878:  * is set), only the first value (with index 0) is set.
        !           879:  */
        !           880: DLLIMPORT void __export cfg_setint(cfg_t *cfg, const char *name,
        !           881:                                    long int value);
        !           882: 
        !           883: /** Set a value of an integer option given its name and index.
        !           884:  *
        !           885:  * @param cfg The configuration file context.
        !           886:  * @param name The name of the option.
        !           887:  * @param value The value to set.
        !           888:  * @param index The index in the option value array that should be
        !           889:  * modified. It is an error to set values with indices larger than 0
        !           890:  * for options without the CFGF_LIST flag set.
        !           891:  */
        !           892: DLLIMPORT void __export cfg_setnint(cfg_t *cfg, const char *name,
        !           893:                                     long int value, unsigned int index);
        !           894: 
        !           895: /** Set a value of a floating point option.
        !           896:  *
        !           897:  * @param opt The option structure (eg, as returned from cfg_getopt())
        !           898:  * @param value The value to set.
        !           899:  * @param index The index in the option value array that should be
        !           900:  * modified. It is an error to set values with indices larger than 0
        !           901:  * for options without the CFGF_LIST flag set.
        !           902:  */
        !           903: DLLIMPORT void __export cfg_opt_setnfloat(cfg_opt_t *opt,
        !           904:                                           double value, unsigned int index);
        !           905: 
        !           906: /** Set the value of a floating point option given its name.
        !           907:  *
        !           908:  * @param cfg The configuration file context.
        !           909:  * @param name The name of the option.
        !           910:  * @param value The value to set. If the option is a list (the CFGF_LIST flag
        !           911:  * is set), only the first value (with index 0) is set.
        !           912:  */
        !           913: DLLIMPORT void __export cfg_setfloat(cfg_t *cfg, const char *name,
        !           914:                                      double value);
        !           915: 
        !           916: /** Set a value of a floating point option given its name and index.
        !           917:  *
        !           918:  * @param cfg The configuration file context.
        !           919:  * @param name The name of the option.
        !           920:  * @param value The value to set.
        !           921:  * @param index The index in the option value array that should be
        !           922:  * modified. It is an error to set values with indices larger than 0
        !           923:  * for options without the CFGF_LIST flag set.
        !           924:  */
        !           925: DLLIMPORT void __export cfg_setnfloat(cfg_t *cfg, const char *name,
        !           926:                                       double value, unsigned int index);
        !           927: 
        !           928: /** Set a value of a boolean option.
        !           929:  *
        !           930:  * @param opt The option structure (eg, as returned from cfg_getopt())
        !           931:  * @param value The value to set.
        !           932:  * @param index The index in the option value array that should be
        !           933:  * modified. It is an error to set values with indices larger than 0
        !           934:  * for options without the CFGF_LIST flag set.
        !           935:  */
        !           936: DLLIMPORT void __export cfg_opt_setnbool(cfg_opt_t *opt,
        !           937:                                          cfg_bool_t value, unsigned int index);
        !           938: 
        !           939: /** Set the value of a boolean option given its name.
        !           940:  *
        !           941:  * @param cfg The configuration file context.
        !           942:  * @param name The name of the option.
        !           943:  * @param value The value to set. If the option is a list (the CFGF_LIST flag
        !           944:  * is set), only the first value (with index 0) is set.
        !           945:  */
        !           946: DLLIMPORT void __export cfg_setbool(cfg_t *cfg, const char *name,
        !           947:                                     cfg_bool_t value);
        !           948: 
        !           949: /** Set a value of a boolean option given its name and index.
        !           950:  *
        !           951:  * @param cfg The configuration file context.
        !           952:  * @param name The name of the option.
        !           953:  * @param value The value to set.
        !           954:  * @param index The index in the option value array that should be
        !           955:  * modified. It is an error to set values with indices larger than 0
        !           956:  * for options without the CFGF_LIST flag set.
        !           957:  */
        !           958: DLLIMPORT void __export cfg_setnbool(cfg_t *cfg, const char *name,
        !           959:                                      cfg_bool_t value, unsigned int index);
        !           960: 
        !           961: /** Set a value of a string option.
        !           962:  *
        !           963:  * @param opt The option structure (eg, as returned from cfg_getopt())
        !           964:  * @param value The value to set. Memory for the string is allocated
        !           965:  * and the value is copied. Any previous string value is freed.
        !           966:  * @param index The index in the option value array that should be
        !           967:  * modified. It is an error to set values with indices larger than 0
        !           968:  * for options without the CFGF_LIST flag set.
        !           969:  */
        !           970: DLLIMPORT void __export cfg_opt_setnstr(cfg_opt_t *opt,
        !           971:                                         const char *value, unsigned int index);
        !           972: 
        !           973: /** Set the value of a string option given its name.
        !           974:  *
        !           975:  * @param cfg The configuration file context.
        !           976:  * @param name The name of the option.
        !           977:  * @param value The value to set. Memory for the string is allocated and the
        !           978:  * value is copied. Any previous string value is freed. If the option is a list
        !           979:  * (the CFGF_LIST flag is set), only the first value (with index 0) is set.
        !           980:  */
        !           981: DLLIMPORT void __export cfg_setstr(cfg_t *cfg, const char *name,
        !           982:                                    const char *value);
        !           983: 
        !           984: /** Set a value of a boolean option given its name and index.
        !           985:  *
        !           986:  * @param cfg The configuration file context.
        !           987:  * @param name The name of the option.
        !           988:  * @param value The value to set. Memory for the string is allocated
        !           989:  * and the value is copied. Any privious string value is freed.
        !           990:  * @param index The index in the option value array that should be
        !           991:  * modified. It is an error to set values with indices larger than 0
        !           992:  * for options without the CFGF_LIST flag set.
        !           993:  */
        !           994: DLLIMPORT void __export cfg_setnstr(cfg_t *cfg, const char *name,
        !           995:                                     const char *value, unsigned int index);
        !           996: 
        !           997: /** Set values for a list option. All existing values are replaced
        !           998:  * with the new ones.
        !           999:  *
        !          1000:  * @param cfg The configuration file context.
        !          1001:  * @param name The name of the option.
        !          1002:  * @param nvalues Number of values to set.
        !          1003:  * @param ... The values to set, the type must match the type of the
        !          1004:  * option and the number of values must be equal to the nvalues
        !          1005:  * parameter.
        !          1006:  */
        !          1007: DLLIMPORT void __export cfg_setlist(cfg_t *cfg, const char *name,
        !          1008:                                     unsigned int nvalues, ...);
        !          1009: 
        !          1010: DLLIMPORT int __export cfg_numopts(cfg_opt_t *opts);
        !          1011: 
        !          1012: /** Add values for a list option. The new values are appended to any
        !          1013:  * current values in the list.
        !          1014:  *
        !          1015:  * @param cfg The configuration file context.
        !          1016:  * @param name The name of the option.
        !          1017:  * @param nvalues Number of values to add.
        !          1018:  * @param ... The values to add, the type must match the type of the
        !          1019:  * option and the number of values must be equal to the nvalues
        !          1020:  * parameter.
        !          1021:  */
        !          1022: DLLIMPORT void __export cfg_addlist(cfg_t *cfg, const char *name,
        !          1023:                                     unsigned int nvalues, ...);
        !          1024: 
        !          1025: /** Default value print function.
        !          1026:  *
        !          1027:  * Print only the value of a given option. Does not handle sections or
        !          1028:  * functions. Use cfg_opt_print to print the whole assignment ("option
        !          1029:  * = value"), or cfg_print to print the whole config file.
        !          1030:  *
        !          1031:  * @param opt The option structure (eg, as returned from cfg_getopt())
        !          1032:  * @param index The index in the option value array that should be printed
        !          1033:  * @param fp File stream to print to.
        !          1034:  *
        !          1035:  * @see cfg_print, cfg_opt_print
        !          1036:  */
        !          1037: DLLIMPORT void __export cfg_opt_nprint_var(cfg_opt_t *opt, unsigned int index,
        !          1038:                                   FILE *fp);
        !          1039: 
        !          1040: /** Print an option and its value to a file.
        !          1041:  * Same as cfg_opt_print, but with the indentation level specified.
        !          1042:  * @see cfg_opt_print
        !          1043:  */
        !          1044: DLLIMPORT void __export cfg_opt_print_indent(cfg_opt_t *opt, FILE *fp, int indent);
        !          1045: 
        !          1046: /** Print an option and its value to a file.
        !          1047:  *
        !          1048:  * If a print callback function is specified for the option, it is
        !          1049:  * used instead of cfg_opt_nprint_var.
        !          1050:  *
        !          1051:  * @param opt The option structure (eg, as returned from cfg_getopt())
        !          1052:  * @param fp File stream to print to.
        !          1053:  *
        !          1054:  * @see cfg_print_func_t
        !          1055:  */
        !          1056: DLLIMPORT void __export cfg_opt_print(cfg_opt_t *opt, FILE *fp);
        !          1057: 
        !          1058: /** Print the options and values to a file.
        !          1059:  * Same as cfg_print, but with the indentation level specified.
        !          1060:  * @see cfg_print
        !          1061:  */
        !          1062: DLLIMPORT void __export cfg_print_indent(cfg_t *cfg, FILE *fp, int indent);
        !          1063: 
        !          1064: /** Print the options and values to a file.
        !          1065:  *
        !          1066:  * Note that options in any included file are expanded and printed
        !          1067:  * directly to the file. Option values given with environment
        !          1068:  * variables in the parsed input are also printed expanded. This means
        !          1069:  * that if you parse a configuration file you can't expect that the
        !          1070:  * output from this function is identical to the initial file.
        !          1071:  *
        !          1072:  * @param cfg The configuration file context.
        !          1073:  * @param fp File stream to print to, use stdout to print to the screen.
        !          1074:  *
        !          1075:  * @see cfg_print_func_t, cfg_set_print_func
        !          1076:  */
        !          1077: DLLIMPORT void __export cfg_print(cfg_t *cfg, FILE *fp);
        !          1078: 
        !          1079: /** Set a print callback function for an option.
        !          1080:  *
        !          1081:  * @param opt The option structure (eg, as returned from cfg_getopt())
        !          1082:  * @param pf The print function callback.
        !          1083:  *
        !          1084:  * @see cfg_print_func_t
        !          1085:  */
        !          1086: DLLIMPORT cfg_print_func_t __export cfg_opt_set_print_func(cfg_opt_t *opt,
        !          1087:                                                   cfg_print_func_t pf);
        !          1088: 
        !          1089: /** Set a print callback function for an option given its name.
        !          1090:  *
        !          1091:  * @param cfg The configuration file context.
        !          1092:  * @param name The name of the option.
        !          1093:  * @param pf The print callback function.
        !          1094:  *
        !          1095:  * @see cfg_print_func_t
        !          1096:  */
        !          1097: DLLIMPORT cfg_print_func_t __export cfg_set_print_func(cfg_t *cfg, const char *name,
        !          1098:                                               cfg_print_func_t pf);
        !          1099: 
        !          1100: /** Register a validating callback function for an option.
        !          1101:  *
        !          1102:  * @param cfg The configuration file context.
        !          1103:  * @param name The name of the option.
        !          1104:  * @param vf The validating callback function.
        !          1105:  *
        !          1106:  * @see cfg_validate_callback_t
        !          1107:  */
        !          1108: DLLIMPORT cfg_validate_callback_t __export cfg_set_validate_func(cfg_t *cfg,
        !          1109:                                                         const char *name,
        !          1110:                                                         cfg_validate_callback_t vf);
        !          1111: 
        !          1112: #ifdef __cplusplus
        !          1113: }
        !          1114: #endif
        !          1115: 
        !          1116: #endif
        !          1117: 
        !          1118: /** @example ftpconf.c
        !          1119:  */
        !          1120: 
        !          1121: /** @example simple.c
        !          1122:  */
        !          1123: 
        !          1124: /** @example reread.c
        !          1125:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>