diff options
Diffstat (limited to '')
-rw-r--r-- | doc/libconfig.info | 2182 |
1 files changed, 2182 insertions, 0 deletions
diff --git a/doc/libconfig.info b/doc/libconfig.info new file mode 100644 index 0000000..51dbfc6 --- /dev/null +++ b/doc/libconfig.info @@ -0,0 +1,2182 @@ +This is libconfig.info, produced by makeinfo version 4.11 from +libconfig.texi. + +INFO-DIR-SECTION Software libraries +START-INFO-DIR-ENTRY +* libconfig: (libconfig). A Library For Processing Structured Configuration Files +END-INFO-DIR-ENTRY + + +File: libconfig.info, Node: Top, Next: Introduction, Up: (dir) + +libconfig +********* + +* Menu: + +* Introduction:: +* Configuration Files:: +* The C API:: +* The C++ API:: +* Configuration File Grammar:: +* License:: +* Function Index:: +* Type Index:: +* Concept Index:: + + +File: libconfig.info, Node: Introduction, Next: Configuration Files, Prev: Top, Up: Top + +* Menu: + +* Why Another Configuration File Library?:: +* Using the Library from a C Program:: +* Using the Library from a C++ Program:: +* Multithreading Issues:: +* Internationalization Issues:: +* Compiling Using pkg-config:: + +1 Introduction +************** + +Libconfig is a library for reading, manipulating, and writing +structured configuration files. The library features a fully reentrant +parser and includes bindings for both the C and C++ programming +languages. + + The library runs on modern POSIX-compilant systems, such as Linux, +Solaris, and Mac OS X (Darwin), as well as on Microsoft Windows 2000/XP +and later (with either Microsoft Visual Studio 2005 or later, or the +GNU toolchain via the MinGW environment). + + +File: libconfig.info, Node: Why Another Configuration File Library?, Next: Using the Library from a C Program, Up: Introduction + +1.1 Why Another Configuration File Library? +=========================================== + +There are several open-source configuration file libraries available as +of this writing. This library was written because each of those +libraries falls short in one or more ways. The main features of +libconfig that set it apart from the other libraries are: + + * A fully reentrant parser. Independent configurations can be parsed + in concurrent threads at the same time. + + * Both C and C++ bindings, as well as hooks to allow for the + creation of wrappers in other languages. + + * A simple, structured configuration file format that is more + readable and compact than XML and more flexible than the obsolete + but prevalent Windows "INI" file format. + + * A low-footprint implementation (just 38K for the C library and 66K + for the C++ library) that is suitable for memory-constrained + systems. + + * Proper documentation. + + + +File: libconfig.info, Node: Using the Library from a C Program, Next: Using the Library from a C++ Program, Prev: Why Another Configuration File Library?, Up: Introduction + +1.2 Using the Library from a C Program +====================================== + +To use the library from C code, include the following preprocessor +directive in your source files: + + + #include <libconfig.h> + + + To link with the library, specify `-lconfig' as an argument to the +linker. + + +File: libconfig.info, Node: Using the Library from a C++ Program, Next: Multithreading Issues, Prev: Using the Library from a C Program, Up: Introduction + +1.3 Using the Library from a C++ Program +======================================== + +To use the library from C++, include the following preprocessor +directive in your source files: + + + #include <libconfig.h++> + + + Or, alternatively: + + + #include <libconfig.hh> + + + The C++ API classes are defined in the namespace `libconfig', hence +the following statement may optionally be used: + + + using namespace libconfig; + + + To link with the library, specify `-lconfig++' as an argument to the +linker. + + +File: libconfig.info, Node: Multithreading Issues, Next: Internationalization Issues, Prev: Using the Library from a C++ Program, Up: Introduction + +1.4 Multithreading Issues +========================= + +Libconfig is fully "reentrant"; the functions in the library do not +make use of global variables and do not maintain state between +successive calls. Therefore two independent configurations may be safely +manipulated concurrently by two distinct threads. + + Libconfig is not "thread-safe". The library is not aware of the +presence of threads and knows nothing about the host system's threading +model. Therefore, if an instance of a configuration is to be accessed +from multiple threads, it must be suitably protected by synchronization +mechanisms like read-write locks or mutexes; the standard rules for +safe multithreaded access to shared data must be observed. + + Libconfig is not "async-safe". Calls should not be made into the +library from signal handlers, because some of the C library routines +that it uses may not be async-safe. + + Libconfig is not guaranteed to be "cancel-safe". Since it is not +aware of the host system's threading model, the library does not +contain any thread cancellation points. In most cases this will not be +an issue for multithreaded programs. However, be aware that some of the +routines in the library (namely those that read/write configurations +from/to files or streams) perform I/O using C library routines which +may potentially block; whether or not these C library routines are +cancel-safe depends on the host system. + + +File: libconfig.info, Node: Internationalization Issues, Next: Compiling Using pkg-config, Prev: Multithreading Issues, Up: Introduction + +1.5 Internationalization Issues +=============================== + +Libconfig does not natively support Unicode configuration files, but +string values may contain Unicode text encoded in UTF-8; such strings +will be treated as ordinary 8-bit ASCII text by the library. It is the +responsibility of the calling program to perform the necessary +conversions to/from wide (wchar_t) strings using the wide string +conversion functions such as mbsrtowcs() and wcsrtombs() or the iconv() +function of the libiconv library. + + The textual representation of a floating point value varies by +locale. However, the libconfig grammar specifies that floating point +values are represented using a period (`.') as the radix symbol; this +is consistent with the grammar of most programming languages. When a +configuration is read in or written out, libconfig temporarily changes +the LC_NUMERIC category of the locale of the calling thread to the "C" +locale to ensure consistent handling of floating point values +regardless of the locale(s) in use by the calling program. + + Note that the MinGW environment does not (as of this writing) provide +functions for changing the locale of the calling thread. Therefore, +when using libconfig in that environment, the calling program is +responsible for changing the LC_NUMERIC category of the locale to the +"C" locale before reading or writing a configuration. + + +File: libconfig.info, Node: Compiling Using pkg-config, Prev: Internationalization Issues, Up: Introduction + +1.6 Compiling Using pkg-config +============================== + +On UNIX systems you can use the pkg-config utility (version 0.20 or +later) to automatically select the appropriate compiler and linker +switches for libconfig. Ensure that the environment variable +`PKG_CONFIG_PATH' contains the absolute path to the `lib/pkgconfig' +subdirectory of the libconfig installation. Then, you can compile and +link C programs with libconfig as follows: + + gcc `pkg-config --cflags libconfig` myprogram.c -o myprogram \ + `pkg-config --libs libconfig` + + + And similarly, for C++ programs: + + g++ `pkg-config --cflags libconfig++` myprogram.cpp -o myprogram \ + `pkg-config --libs libconfig++` + + + Note the backticks in the above examples. + + +File: libconfig.info, Node: Configuration Files, Next: The C API, Prev: Introduction, Up: Top + +* Menu: + +* Settings:: +* Groups:: +* Arrays:: +* Lists:: +* Integer Values:: +* 64-bit Integer Values:: +* Floating Point Values:: +* Boolean Values:: +* String Values:: +* Comments:: + +2 Configuration Files +********************* + +Libconfig supports structured, hierarchical configurations. These +configurations can be read from and written to files and manipulated in +memory. + + A "configuration" consists of a group of "settings", which associate +names with values. A "value" can be one of the following: + + * A "scalar value": integer, 64-bit integer, floating-point number, + boolean, or string + + * An "array", which is a sequence of scalar values, all of which + must have the same type + + * A "group", which is a collection of settings + + * A "list", which is a sequence of values of any type, including + other lists + + Consider the following configuration file for a hypothetical GUI +application, which illustrates all of the elements of the configuration +file grammar. + + + # Example application configuration file + + version = "1.0"; + + application: + { + window: + { + title = "My Application"; + size = { w = 640; h = 480; }; + pos = { x = 350; y = 250; }; + }; + + list = ( ( "abc", 123, true ), 1.234, ( /* an empty list */) ); + + books = ( { title = "Treasure Island"; + author = "Robert Louis Stevenson"; + price = 29.95; + qty = 5; }, + { title = "Snow Crash"; + author = "Neal Stephenson"; + price = 9.99; + qty = 8; } ); + + misc: + { + pi = 3.141592654; + bigint = 9223372036854775807L; + columns = [ "Last Name", "First Name", "MI" ]; + bitmask = 0x1FC3; + }; + }; + + + Settings can be uniquely identified within the configuration by a +"path". The path is a dot-separated sequence of names, beginning at a +top-level group and ending at the setting itself. Each name in the path +is the name of a setting; if the setting has no name because it is an +element in a list or array, an integer index in square brackets can be +used as the name. + + For example, in our hypothetical configuration file, the path to the +`x' setting is `application.window.pos.x'; the path to the `version' +setting is simply `version'; and the path to the `title' setting of the +second book in the `books' list is `application.books.[1].title'. + + The datatype of a value is determined from the format of the value +itself. If the value is enclosed in double quotes, it is treated as a +string. If it looks like an integer or floating point number, it is +treated as such. If it is one of the values `TRUE', `true', `FALSE', or +`false' (or any other mixed-case version of those tokens, e.g., `True' +or `FaLsE'), it is treated as a boolean. If it consists of a +comma-separated list of values enclosed in square brackets, it is +treated as an array. And if it consists of a comma-separated list of +values enclosed in parentheses, it is treated as a list. Any value +which does not meet any of these criteria is considered invalid and +results in a parse error. + + All names are case-sensitive. They may consist only of alphanumeric +characters, dashes (`-'), underscores (`_'), and asterisks (`*'), and +must begin with a letter or asterisk. No other characters are allowed. + + In C and C++, integer, 64-bit integer, floating point, and string +values are mapped to the types `long', `long long', `double', and +`const char *', respectively. The boolean type is mapped to `int' in C +and `bool' in C++. + + The following sections describe the elements of the configuration +file grammar in additional detail. + + +File: libconfig.info, Node: Settings, Next: Groups, Up: Configuration Files + +2.1 Settings +============ + +A setting has the form: + + name = value ; + + or: + + name : value ; + + The trailing semicolon is required. Whitespace is not significant. + + The value may be a scalar value, an array, a group, or a list. + + +File: libconfig.info, Node: Groups, Next: Arrays, Prev: Settings, Up: Configuration Files + +2.2 Groups +========== + +A group has the form: + + { settings ... } + + Groups can contain any number of settings, but each setting must have +a unique name within the group. + + +File: libconfig.info, Node: Arrays, Next: Lists, Prev: Groups, Up: Configuration Files + +2.3 Arrays +========== + +An array has the form: + + [ value, value ... ] + + An array may have zero or more elements, but the elements must all be +scalar values of the same type. + + +File: libconfig.info, Node: Lists, Next: Integer Values, Prev: Arrays, Up: Configuration Files + +2.4 Lists +========= + +A list has the form: + + ( value, value ... ) + + A list may have zero or more elements, each of which can be a scalar +value, an array, a group, or another list. + + +File: libconfig.info, Node: Integer Values, Next: 64-bit Integer Values, Prev: Lists, Up: Configuration Files + +2.5 Integer Values +================== + +Integers can be represented in one of two ways: as a series of one or +more decimal digits (`0' - `9'), with an optional leading sign +character (`+' or `-'); or as a hexadecimal value consisting of the +characters `0x' followed by a series of one or more hexadecimal digits +(`0' - `9', `A' - `F', `a' - `f'). + + +File: libconfig.info, Node: 64-bit Integer Values, Next: Floating Point Values, Prev: Integer Values, Up: Configuration Files + +2.6 64-bit Integer Values +========================= + +Long long (64-bit) integers are represented identically to integers, +except that an 'L' character is appended to indicate a 64-bit value. +For example, `0L' indicates a 64-bit integer value 0. + + +File: libconfig.info, Node: Floating Point Values, Next: Boolean Values, Prev: 64-bit Integer Values, Up: Configuration Files + +2.7 Floating Point Values +========================= + +Floating point values consist of a series of one or more digits, one +decimal point, an optional leading sign character (`+' or `-'), and an +optional exponent. An exponent consists of the letter `E' or `e', an +optional sign character, and a series of one or more digits. + + +File: libconfig.info, Node: Boolean Values, Next: String Values, Prev: Floating Point Values, Up: Configuration Files + +2.8 Boolean Values +================== + +Boolean values may have one of the following values: `true', `false', +or any mixed-case variation thereof. + + +File: libconfig.info, Node: String Values, Next: Comments, Prev: Boolean Values, Up: Configuration Files + +2.9 String Values +================= + +String values consist of arbitrary text delimited by double quotes. +Literal double quotes can be escaped by preceding them with a +backslash: `\"'. The escape sequences `\\', `\f', `\n', `\r', and `\t' +are also recognized, and have the usual meaning. No other escape +sequences are currently supported. + + Adjacent strings are automatically concatenated, as in C/C++ source +code. This is useful for formatting very long strings as sequences of +shorter strings. For example, the following constructs are equivalent: + + * `"The quick brown fox jumped over the lazy dog."' + + * `"The quick brown fox"' + `" jumped over the lazy dog."' + + * `"The quick" /* comment */ " brown fox " // another comment' + `"jumped over the lazy dog."' + + + +File: libconfig.info, Node: Comments, Prev: String Values, Up: Configuration Files + +2.10 Comments +============= + +Three types of comments are allowed within a configuration: + + * Script-style comments. All text beginning with a `#' character to + the end of the line is ignored. + + * C-style comments. All text, including line breaks, between a + starting `/*' sequence and an ending `*/' sequence is ignored. + + * C++-style comments. All text beginning with a `//' sequence to the + end of the line is ignored. + + + As expected, comment delimiters appearing within quoted strings are +treated as literal text. + + Comments are ignored when the configuration is read in, so they are +not treated as part of the configuration. Therefore if the +configuration is written back out to a stream, any comments that were +present in the original configuration will be lost. + + +File: libconfig.info, Node: The C API, Next: The C++ API, Prev: Configuration Files, Up: Top + +3 The C API +*********** + +This chapter describes the C library API. The type config_t represents +a configuration, and the type config_setting_t represents a +configuration setting. + + The boolean values `CONFIG_TRUE' and `CONFIG_FALSE' are macros +defined as `(1)' and `(0)', respectively. + + -- Function: void config_init (config_t * CONFIG) + -- Function: void config_destroy (config_t * CONFIG) + These functions initialize and destroy the configuration object + CONFIG. + + `config_init()' initializes CONFIG as a new, empty configuration. + + `config_destroy()' destroys the configuration CONFIG, deallocating + all memory associated with the configuration, but not including + the config_t structure itself. + + + -- Function: int config_read (config_t * CONFIG, FILE * STREAM) + This function reads and parses a configuration from the given + STREAM into the configuration object CONFIG. It returns + `CONFIG_TRUE' on success, or `CONFIG_FALSE' on failure; the + `config_error_text()' and `config_error_line()' functions, + described below, can be used to obtain information about the error. + + + -- Function: int config_read_file (config_t * CONFIG, + const char * FILENAME) + This function reads and parses a configuration from the file named + FILENAME into the configuration object CONFIG. It returns + `CONFIG_TRUE' on success, or `CONFIG_FALSE' on failure; the + `config_error_text()' and `config_error_line()' functions, + described below, can be used to obtain information about the error. + + + -- Function: void config_write (const config_t * CONFIG, FILE * STREAM) + This function writes the configuration CONFIG to the given STREAM. + + + -- Function: int config_write_file (config_t * CONFIG, + const char * FILENAME) + This function writes the configuration CONFIG to the file named + FILENAME. It returns `CONFIG_TRUE' on success, or `CONFIG_FALSE' + on failure. + + + -- Function: const char * config_error_text (const config_t * CONFIG) + -- Function: int config_error_line (const config_t * CONFIG) + These functions, which are implemented as macros, return the text + and line number of the parse error, if one occurred during a call + to `config_read()' or `config_read_file()'. Storage for the string + returned by `config_error_text()' is managed by the library and + released automatically when the configuration is destroyed; the + string must not be freed by the caller. + + + -- Function: void config_set_auto_convert (config_t *CONFIG, int FLAG) + -- Function: int config_get_auto_convert (const config_t *CONFIG) + `config_set_auto_convert()' enables number auto-conversion for the + configuration CONFIG if FLAG is non-zero, and disables it + otherwise. When this feature is enabled, an attempt to retrieve a + floating point setting's value into an integer (or vice versa), or + store an integer to a floating point setting's value (or vice + versa) will cause the library to silently perform the necessary + conversion (possibly leading to loss of data), rather than + reporting failure. By default this feature is disabled. + + `config_get_auto_convert()' returns `CONFIG_TRUE' if number + auto-conversion is currently enabled for CONFIG; otherwise it + returns `CONFIG_FALSE'. + + + -- Function: int config_lookup_int (const config_t * CONFIG, + const char * PATH, long * VALUE) + -- Function: int config_lookup_int64 (const config_t * CONFIG, + const char * PATH, long long * VALUE) + -- Function: int config_lookup_float (const config_t * CONFIG, + const char * PATH, double * VALUE) + -- Function: int config_lookup_bool (const config_t * CONFIG, + const char * PATH, int * VALUE) + -- Function: int config_lookup_string (const config_t * CONFIG, + const char * PATH, const char ** VALUE) + These functions look up the value of the setting in the + configuration CONFIG specified by the path PATH. They store the + value of the setting at VALUE and return `CONFIG_TRUE' on success. + If the setting was not found or if the type of the value did not + match the type requested, they leave the data pointed to by VALUE + unmodified and return `CONFIG_FALSE'. + + Storage for the string returned by `config_lookup_string()' is + managed by the library and released automatically when the setting + is destroyed or when the setting's value is changed; the string + must not be freed by the caller. + + + -- Function: config_setting_t * config_lookup + (const config_t * CONFIG, const char * PATH) + This function locates the setting in the configuration CONFIG + specified by the path PATH. It returns a pointer to the + `config_setting_t' structure on success, or `NULL' if the setting + was not found. + + + -- Function: long config_setting_get_int + (const config_setting_t * SETTING) + -- Function: long long config_setting_get_int64 + (const config_setting_t * SETTING) + -- Function: double config_setting_get_float + (const config_setting_t * SETTING) + -- Function: int config_setting_get_bool + (const config_setting_t * SETTING) + -- Function: const char * config_setting_get_string + (const config_setting_t * SETTING) + These functions return the value of the given SETTING. If the type + of the setting does not match the type requested, a 0 or `NULL' + value is returned. Storage for the string returned by + `config_setting_get_string()' is managed by the library and + released automatically when the setting is destroyed or when the + setting's value is changed; the string must not be freed by the + caller. + + + -- Function: int config_setting_set_int (config_setting_t * SETTING, + long VALUE) + -- Function: int config_setting_set_int64 (config_setting_t * SETTING, + long long VALUE) + -- Function: int config_setting_set_float (config_setting_t * SETTING, + double VALUE) + -- Function: int config_setting_set_bool (config_setting_t * SETTING, + int VALUE) + -- Function: int config_setting_set_string + (config_setting_t * SETTING, const char * VALUE) + These functions set the value of the given SETTING to VALUE. On + success, they return `CONFIG_TRUE'. If the setting does not match + the type of the value, they return `CONFIG_FALSE'. + `config_setting_set_string()' makes a copy of the passed string + VALUE, so it may be subsequently freed or modified by the caller + without affecting the value of the setting. + + + -- Function: int config_setting_lookup_int + (const config_setting_t * SETTING, const char * NAME, + long * VALUE) + -- Function: int config_setting_lookup_int64 + (const config_setting_t * SETTING, const char * NAME, + long long * VALUE) + -- Function: int config_setting_lookup_float + (const config_setting_t * SETTING, const char * NAME, + double * VALUE) + -- Function: int config_setting_lookup_bool + (const config_setting_t * SETTING, const char * NAME, + int * VALUE) + -- Function: int config_setting_lookup_string + (const config_setting_t * SETTING, const char * NAME, + const char ** VALUE) + These functions look up the value of the child setting named NAME + of the setting SETTING. They store the value at VALUE and return + `CONFIG_TRUE' on success. If the setting was not found or if the + type of the value did not match the type requested, they leave the + data pointed to by VALUE unmodified and return `CONFIG_FALSE'. + + Storage for the string returned by + `config_setting_lookup_string()' is managed by the library and + released automatically when the setting is destroyed or when the + setting's value is changed; the string must not be freed by the + caller. + + + -- Function: short config_setting_get_format + (config_setting_t * SETTING) + -- Function: int config_setting_set_format + (config_setting_t * SETTING, short FORMAT) + These functions get and set the external format for the setting + SETTING. + + The FORMAT must be one of the constants `CONFIG_FORMAT_DEFAULT' or + `CONFIG_FORMAT_HEX'. All settings support the + `CONFIG_FORMAT_DEFAULT' format. The `CONFIG_FORMAT_HEX' format + specifies hexadecimal formatting for integer values, and hence + only applies to settings of type `CONFIG_TYPE_INT' and + `CONFIG_TYPE_INT64'. If FORMAT is invalid for the given setting, + it is ignored. + + `config_setting_set_format()' returns `CONFIG_TRUE' on success and + `CONFIG_FALSE' on failure. + + + -- Function: config_setting_t * config_setting_get_member + (config_setting_t * SETTING, const char * NAME) + This function fetches the child setting named NAME from the group + SETTING. It returns the requested setting on success, or `NULL' if + the setting was not found or if SETTING is not a group. + + + -- Function: config_setting_t * config_setting_get_elem + (const config_setting_t * SETTING, unsigned int IDX) + This function fetches the element at the given index IDX in the + setting SETTING, which must be an array, list, or group. It + returns the requested setting on success, or `NULL' if IDX is out + of range or if SETTING is not an array, list, or group. + + + -- Function: long config_setting_get_int_elem + (const config_setting_t * SETTING, int IDX) + -- Function: long long config_setting_get_int64_elem + (const config_setting_t * SETTING, int IDX) + -- Function: double config_setting_get_float_elem + (const config_setting_t * SETTING, int IDX) + -- Function: int config_setting_get_bool_elem + (const config_setting_t * SETTING, int IDX) + -- Function: const char * config_setting_get_string_elem + (const config_setting_t * SETTING, int IDX) + These functions return the value at the specified index IDX in the + setting SETTING. If the setting is not an array or list, or if the + type of the element does not match the type requested, or if IDX + is out of range, they return 0 or `NULL'. Storage for the string + returned by `config_setting_get_string_elem()' is managed by the + library and released automatically when the setting is destroyed + or when its value is changed; the string must not be freed by the + caller. + + -- Function: config_setting_t * config_setting_set_int_elem + (config_setting_t * SETTING, int IDX, long VALUE) + -- Function: config_setting_t * config_setting_set_int64_elem + (config_setting_t * SETTING, int IDX, long long VALUE) + -- Function: config_setting_t * config_setting_set_float_elem + (config_setting_t * SETTING, int IDX, double VALUE) + -- Function: config_setting_t * config_setting_set_bool_elem + (config_setting_t * SETTING, int IDX, int VALUE) + -- Function: config_setting_t * config_setting_set_string_elem + (config_setting_t * SETTING, int IDX, const char * VALUE) + These functions set the value at the specified index IDX in the + setting SETTING to VALUE. If IDX is negative, a new element is + added to the end of the array or list. On success, these functions + return a pointer to the setting representing the element. If the + setting is not an array or list, or if the setting is an array and + the type of the array does not match the type of the value, or if + IDX is out of range, they return `NULL'. + `config_setting_set_string_elem()' makes a copy of the passed + string VALUE, so it may be subsequently freed or modified by the + caller without affecting the value of the setting. + + -- Function: config_setting_t * config_setting_add + (config_setting_t * PARENT, const char * NAME, int TYPE) + This function adds a new child setting or element to the setting + PARENT, which must be a group, array, or list. If PARENT is an + array or list, the NAME parameter is ignored and may be `NULL'. + + The function returns the new setting on success, or `NULL' if + PARENT is not a group, array, or list; or if there is already a + child setting of PARENT named NAME; or if TYPE is invalid. + + -- Function: int config_setting_remove (config_setting_t * PARENT, + const char * NAME) + This function removes and destroys the setting named NAME from the + parent setting PARENT, which must be a group. Any child settings + of the setting are recursively destroyed as well. + + The function returns `CONFIG_TRUE' on success. If PARENT is not a + group, or if it has no setting with the given name, it returns + `CONFIG_FALSE'. + + + -- Function: int config_setting_remove_elem + (config_setting_t * PARENT, unsigned int IDX) + This function removes the child setting at the given index IDX from + the setting PARENT, which must be a group, list, or array. Any + child settings of the removed setting are recursively destroyed as + well. + + The function returns `CONFIG_TRUE' on success. If PARENT is not a + group, list, or array, or if IDX is out of range, it returns + `CONFIG_FALSE'. + + + -- Function: config_setting_t * config_root_setting + (const config_t * CONFIG) + This function returns the root setting for the configuration + CONFIG. The root setting is a group. + + + -- Function: const char * config_setting_name + (const config_setting_t * SETTING) + This function returns the name of the given SETTING, or `NULL' if + the setting has no name. Storage for the returned string is + managed by the library and released automatically when the setting + is destroyed; the string must not be freed by the caller. + + + -- Function: config_setting_t * config_setting_parent + (const config_setting_t * SETTING) + This function returns the parent setting of the given SETTING, or + `NULL' if SETTING is the root setting. + + + -- Function: int config_setting_is_root + (const config_setting_t * SETTING) + This function returns `CONFIG_TRUE' if the given SETTING is the + root setting, and `CONFIG_FALSE' otherwise. + + + -- Function: int config_setting_index + (const config_setting_t * SETTING) + This function returns the index of the given SETTING within its + parent setting. If SETTING is the root setting, this function + returns -1. + + + -- Function: int config_setting_length + (const config_setting_t * SETTING) + This function returns the number of settings in a group, or the + number of elements in a list or array. For other types of + settings, it returns 0. + + + -- Function: int config_setting_type (const config_setting_t * SETTING) + This function returns the type of the given SETTING. The return + value is one of the constants `CONFIG_TYPE_INT', + `CONFIG_TYPE_INT64', `CONFIG_TYPE_FLOAT', `CONFIG_TYPE_STRING', + `CONFIG_TYPE_BOOL', `CONFIG_TYPE_ARRAY', `CONFIG_TYPE_LIST', or + `CONFIG_TYPE_GROUP'. + + + -- Function: int config_setting_is_group + (const config_setting_t * SETTING) + -- Function: int config_setting_is_array + (const config_setting_t * SETTING) + -- Function: int config_setting_is_list + (const config_setting_t * SETTING) + These convenience functions, which are implemented as macros, test + if the setting SETTING is of a given type. They return + `CONFIG_TRUE' or `CONFIG_FALSE'. + + + -- Function: int config_setting_is_aggregate + (const config_setting_t * SETTING) + -- Function: int config_setting_is_scalar + (const config_setting_t * SETTING) + -- Function: int config_setting_is_number + (const config_setting_t * SETTING) + These convenience functions, which are implemented as macros, test + if the setting SETTING is of an aggregate type (a group, array, or + list), of a scalar type (integer, 64-bit integer, floating point, + boolean, or string), and of a number (integer, 64-bit integer, or + floating point), respectively. They return `CONFIG_TRUE' or + `CONFIG_FALSE'. + + + -- Function: unsigned int config_setting_source_line + (const config_setting_t * SETTING) + This function returns the line number of the configuration file or + stream at which the setting SETTING was parsed. This information + is useful for reporting application-level errors. If the setting + was not read from a file or stream, or if the line number is + otherwise unavailable, the function returns 0. + + + -- Function: void config_setting_set_hook (config_setting_t * SETTING, + void * HOOK) + -- Function: void * config_setting_get_hook + (const config_setting_t * SETTING) + These functions make it possible to attach arbitrary data to each + setting structure, for instance a "wrapper" or "peer" object + written in another programming language. The destructor function, + if one has been supplied via a call to `config_set_destructor()', + will be called by the library to dispose of this data when the + setting itself is destroyed. There is no default destructor. + + + -- Function: void config_set_destructor (config_t * CONFIG, + void (* DESTRUCTOR)(void *)) + This function assigns the destructor function DESTRUCTOR for the + configuration CONFIG. This function accepts a single `void *' + argument and has no return value. See `config_setting_set_hook()' + above for more information. + + + +File: libconfig.info, Node: The C++ API, Next: Configuration File Grammar, Prev: The C API, Up: Top + +4 The C++ API +************* + +This chapter describes the C++ library API. The class `Config' +represents a configuration, and the class `Setting' represents a +configuration setting. Note that by design, neither of these classes +provides a public copy constructor or assignment operator. Therefore, +instances of these classes may only be passed between functions via +references or pointers. + + The library defines a group of exceptions, all of which extend the +common base exception `ConfigException'. + + A `SettingTypeException' is thrown when the type of a setting's +value does not match the type requested. + + A `SettingNotFoundException' is thrown when a setting is not found. + + A `SettingNameException' is thrown when an attempt is made to add a +new setting with a non-unique or invalid name. + + A `ParseException' is thrown when a parse error occurs while reading +a configuration from a stream. + + A `FileIOException' is thrown when an I/O error occurs while +reading/writing a configuration from/to a file. + + `SettingTypeException', `SettingNotFoundException', and +`SettingNameException' all extend the common base exception +`SettingException', which provides the following method: + + -- Method on SettingException: const char * getPath () + Returns the path to the setting associated with the exception, or + `NULL' if there is no applicable path. + + + The remainder of this chapter describes the methods for manipulating +configurations and configuration settings. + + -- Method on Config: Config () + -- Method on Config: ~Config () + These methods create and destroy `Config' objects. + + + -- Method on Config: void read (FILE * STREAM) + -- Method on Config: void write (FILE * STREAM) + The `read()' method reads and parses a configuration from the given + STREAM. A `ParseException' is thrown if a parse error occurs. + + The `write()' method writes the configuration to the given STREAM. + + + -- Method on Config: void readFile (const char * FILENAME) + -- Method on Config: void writeFile (const char * FILENAME) + The `readFile()' method reads and parses a configuration from the + file named FILENAME. A `ParseException' is thrown if a parse error + occurs. A `FileIOException' is thrown if the file cannot be read. + + The `writeFile()' method writes the configuration to the file + named FILENAME. A `FileIOException' is thrown if the file cannot + be written. + + + -- Method on ParseException: const char * getError () + -- Method on ParseException: int getLine () + If a call to `readFile()' or `read()' resulted in a + `ParseException', these methods can be called on the exception + object to obtain the text and line number of the parse error. + Storage for the string returned by `getError()' is managed by the + library; the string must not be freed by the caller. + + + -- Method on Config: void setAutoConvert (bool FLAG) + -- Method on Config: bool getAutoConvert () + `setAutoConvert()' enables number auto-conversion for the + configuration if FLAG is `true', and disables it otherwise. When + this feature is enabled, an attempt to assign a floating point + setting to an integer (or vice versa), or assign an integer to a + floating point setting (or vice versa) will cause the library to + silently perform the necessary conversion (possibly leading to + loss of data), rather than throwing a `SettingTypeException'. By + default this feature is disabled. + + `getAutoConvert()' returns `true' if number auto-conversion is + currently enabled for the configuration; otherwise it returns + `false'. + + + -- Method on Config: Setting & getRoot () + This method returns the root setting for the configuration, which + is a group. + + + -- Method on Config: Setting & lookup (const std::string &PATH) + -- Method on Config: Setting & lookup (const char * PATH) + These methods locate the setting specified by the path PATH. If + the requested setting is not found, a `SettingNotFoundException' is + thrown. + + + -- Method on Config: bool exists (const std::string &PATH) + -- Method on Config: bool exists (const char *PATH) + These methods test if a setting with the given PATH exists in the + configuration. They return `true' if the setting exists, and + `false' otherwise. These methods do not throw exceptions. + + + -- Method on Config: bool lookupValue (const char *PATH, bool &VALUE) + -- Method on Config: bool lookupValue (const std::string &PATH, + bool &VALUE) + -- Method on Config: bool lookupValue (const char *PATH, int &VALUE) + -- Method on Config: bool lookupValue (const std::string &PATH, + int &VALUE) + -- Method on Config: bool lookupValue (const char *PATH, + unsigned int &VALUE) + -- Method on Config: bool lookupValue (const std::string &PATH, + unsigned int &VALUE) + -- Method on Config: bool lookupValue (const char *PATH, long &VALUE) + -- Method on Config: bool lookupValue (const std::string &PATH, + long &VALUE) + -- Method on Config: bool lookupValue (const char *PATH, + long long &VALUE) + -- Method on Config: bool lookupValue (const std::string &PATH, + long long &VALUE) + -- Method on Config: bool lookupValue (const char *PATH, + unsigned long &VALUE) + -- Method on Config: bool lookupValue (const std::string &PATH, + unsigned long &VALUE) + -- Method on Config: bool lookupValue (const char *PATH, float &VALUE) + -- Method on Config: bool lookupValue (const std::string &PATH, + float &VALUE) + -- Method on Config: bool lookupValue (const char *PATH, double &VALUE) + -- Method on Config: bool lookupValue (const std::string &PATH, + double &VALUE) + -- Method on Config: bool lookupValue (const char *PATH, + const char *&VALUE) + -- Method on Config: bool lookupValue (const std::string &PATH, + const char *&VALUE) + -- Method on Config: bool lookupValue (const char *PATH, + std::string &VALUE) + -- Method on Config: bool lookupValue (const std::string &PATH, + std::string &VALUE) + These are convenience methods for looking up the value of a setting + with the given PATH. If the setting is found and is of an + appropriate type, the value is stored in VALUE and the method + returns `true'. Otherwise, VALUE is left unmodified and the method + returns `false'. These methods do not throw exceptions. + + Storage for const char * values is managed by the library and + released automatically when the setting is destroyed or when its + value is changed; the string must not be freed by the caller. For + safety and convenience, always assigning string values to a + `std::string' is suggested. + + Since these methods have boolean return values and do not throw + exceptions, they can be used within boolean logic expressions. The + following example presents a concise way to look up three values + at once and perform error handling if any of them are not found or + are of the wrong type: + + + int var1; + double var2; + const char *var3; + + if(config.lookupValue("values.var1", var1) + && config.lookupValue("values.var2", var2) + && config.lookupValue("values.var3", var3)) + { + // use var1, var2, var3 + } + else + { + // error handling here + } + + This approach also takes advantage of the short-circuit evaluation + rules of C++, e.g., if the first lookup fails (returning `false'), + the remaining lookups are skipped entirely. + + + -- Method on Setting: operator bool() + -- Method on Setting: operator int() + -- Method on Setting: operator unsigned int() + -- Method on Setting: operator long() + -- Method on Setting: operator unsigned long() + -- Method on Setting: operator long long() + -- Method on Setting: operator unsigned long long() + -- Method on Setting: operator float() + -- Method on Setting: operator double() + -- Method on Setting: operator const char *() + -- Method on Setting: operator std::string() + These cast operators allow a `Setting' object to be assigned to a + variable of type bool if it is of type `TypeBoolean'; int, + unsigned int, long, or unsigned long if it is of type `TypeInt'; + `long long' or `unsigned long long' if it is of type `TypeInt64', + float or double if it is of type `TypeFloat'; or const char * or + std::string if it is of type `TypeString'. + + Storage for const char * return values is managed by the library + and released automatically when the setting is destroyed or when + its value is changed; the string must not be freed by the caller. + For safety and convenience, always assigning string return values + to a `std::string' is suggested. + + The following examples demonstrate this usage: + + long width = config.lookup("application.window.size.w"); + + bool splashScreen = config.lookup("application.splash_screen"); + + std::string title = config.lookup("application.window.title"); + + Note that certain conversions can lead to loss of precision or + clipping of values, e.g., assigning a negative value to an unsigned + int (in which case the value will be treated as 0), or a + double-precision value to a float. The library does not treat + these lossy conversions as errors. + + Perhaps surprisingly, the following code in particular will cause a + compiler error: + + std::string title; + . + . + . + title = config.lookup("application.window.title"); + + This is because the assignment operator of `std::string' is being + invoked with a `Setting &' as an argument. The compiler is unable + to make an implicit conversion because both the `const char *' and + the `std::string' cast operators of `Setting' are equally + appropriate. This is not a bug in libconfig; providing only the + `const char *' cast operator would resolve this particular + ambiguity, but would cause assignments to `std::string' like the + one in the previous example to produce a compiler error. (To + understand why, see section 11.4.1 of The C++ Programming + Language.) + + The solution to this problem is to use an explicit conversion that + avoids the construction of an intermediate `std::string' object, + as follows: + + std::string title; + . + . + . + title = (const char *)config.lookup("application.window.title"); + + If the assignment is invalid due to a type mismatch, a + `SettingTypeException' is thrown. + + + -- Method on Setting: Setting & operator= (bool VALUE) + -- Method on Setting: Setting & operator= (int VALUE) + -- Method on Setting: Setting & operator= (long VALUE) + -- Method on Setting: Setting & operator= (const long long &VALUE) + -- Method on Setting: Setting & operator= (float VALUE) + -- Method on Setting: Setting & operator= (const double &VALUE) + -- Method on Setting: Setting & operator= (const char *VALUE) + -- Method on Setting: Setting & operator= (const std::string &VALUE) + These assignment operators allow values of type bool, int, long, + long long, float, double, const char *, and std::string to be + assigned to a setting. In the case of strings, the library makes a + copy of the passed string VALUE, so it may be subsequently freed + or modified by the caller without affecting the value of the + setting. + + If the assignment is invalid due to a type mismatch, a + `SettingTypeException' is thrown. + + + -- Method on Setting: Setting & operator[] (int IDX) + -- Method on Setting: Setting & operator[] (const std::string &NAME) + -- Method on Setting: Setting & operator[] (const char *NAME) + A `Setting' object may be subscripted with an integer index IDX if + it is an array or list, or with either a string NAME or an integer + index IDX if it is a group. For example, the following code would + produce the string `Last Name' when applied to the example + configuration in *note Configuration Files::. + + Setting& setting = config.lookup("application.misc"); + const char *s = setting["columns"][0]; + + If the setting is not an array, list, or group, a + `SettingTypeException' is thrown. If the subscript (IDX or NAME) + does not refer to a valid element, a `SettingNotFoundException' is + thrown. + + Iterating over a group's child settings with an integer index will + return the settings in the same order that they appear in the + configuration. + + + -- Method on Setting: bool lookupValue (const char *NAME, bool &VALUE) + -- Method on Setting: bool lookupValue (const std::string &NAME, + bool &VALUE) + -- Method on Setting: bool lookupValue (const char *NAME, int &VALUE) + -- Method on Setting: bool lookupValue (const std::string &NAME, + int &VALUE) + -- Method on Setting: bool lookupValue (const char *NAME, + unsigned int &VALUE) + -- Method on Setting: bool lookupValue (const std::string &NAME, + unsigned int &VALUE) + -- Method on Setting: bool lookupValue (const char *NAME, + long long &VALUE) + -- Method on Setting: bool lookupValue (const std::string &NAME, + long long &VALUE) + -- Method on Setting: bool lookupValue (const char *NAME, + unsigned long long &VALUE) + -- Method on Setting: bool lookupValue (const std::string &NAME, + unsigned long long &VALUE) + -- Method on Setting: bool lookupValue (const char *NAME, long &VALUE) + -- Method on Setting: bool lookupValue (const std::string &NAME, + long &VALUE) + -- Method on Setting: bool lookupValue (const char *NAME, + unsigned long &VALUE) + -- Method on Setting: bool lookupValue (const std::string &NAME, + unsigned long &VALUE) + -- Method on Setting: bool lookupValue (const char *NAME, float &VALUE) + -- Method on Setting: bool lookupValue (const std::string &NAME, + float &VALUE) + -- Method on Setting: bool lookupValue (const char *NAME, + double &VALUE) + -- Method on Setting: bool lookupValue (const std::string &NAME, + double &VALUE) + -- Method on Setting: bool lookupValue (const char *NAME, + const char *&VALUE) + -- Method on Setting: bool lookupValue (const std::string &NAME, + const char *&VALUE) + -- Method on Setting: bool lookupValue (const char *NAME, + std::string &VALUE) + -- Method on Setting: bool lookupValue (const std::string &NAME, + std::string &VALUE) + These are convenience methods for looking up the value of a child + setting with the given NAME. If the setting is found and is of an + appropriate type, the value is stored in VALUE and the method + returns `true'. Otherwise, VALUE is left unmodified and the method + returns `false'. These methods do not throw exceptions. + + Storage for const char * values is managed by the library and + released automatically when the setting is destroyed or when its + value is changed; the string must not be freed by the caller. For + safety and convenience, always assigning string values to a + `std::string' is suggested. + + Since these methods have boolean return values and do not throw + exceptions, they can be used within boolean logic expressions. The + following example presents a concise way to look up three values + at once and perform error handling if any of them are not found or + are of the wrong type: + + + int var1; + double var2; + const char *var3; + + if(setting.lookupValue("var1", var1) + && setting.lookupValue("var2", var2) + && setting.lookupValue("var3", var3)) + { + // use var1, var2, var3 + } + else + { + // error handling here + } + + This approach also takes advantage of the short-circuit evaluation + rules of C++, e.g., if the first lookup fails (returning `false'), + the remaining lookups are skipped entirely. + + + -- Method on Setting: Setting & add (const std::string &NAME, + Setting::Type TYPE) + -- Method on Setting: Setting & add (const char *NAME, + Setting::Type TYPE) + These methods add a new child setting with the given NAME and TYPE + to the setting, which must be a group. They return a reference to + the new setting. If the setting already has a child setting with + the given name, or if the name is invalid, a + `SettingNameException' is thrown. If the setting is not a group, a + `SettingTypeException' is thrown. + + Once a setting has been created, neither its name nor type can be + changed. + + + -- Method on Setting: Setting & add (Setting::Type TYPE) + This method adds a new element to the setting, which must be of + type `TypeArray' or `TypeList'. If the setting is an array which + currently has zero elements, the TYPE parameter (which must be + `TypeInt', `TypeInt64', `TypeFloat', `TypeBool', or `TypeString') + determines the type for the array; otherwise it must match the + type of the existing elements in the array. + + The method returns the new setting on success. If TYPE is a scalar + type, the new setting will have a default value of 0, 0.0, + `false', or `NULL', depending on the type. + + The method throws a `SettingTypeException' if the setting is not + an array or list, or if TYPE is invalid. + + + -- Method on Setting: void remove (const std::string &NAME) + -- Method on Setting: void remove (const char *NAME) + These methods remove the child setting with the given NAME from + the setting, which must be a group. Any child settings of the + removed setting are recursively destroyed as well. + + If the setting is not a group, a `SettingTypeException' is thrown. + If the setting does not have a child setting with the given name, + a `SettingNotFoundException' is thrown. + + + -- Method on Setting: void remove (unsigned int IDX) + This method removes the child setting at the given index IDX from + the setting, which must be a group, list, or array. Any child + settings of the removed setting are recursively destroyed as well. + + If the setting is not a group, list, or array, a + `SettingTypeException' is thrown. If IDX is out of range, a + `SettingNotFoundException' is thrown. + + + -- Method on Setting: const char * getName () + This method returns the name of the setting, or `NULL' if the + setting has no name. Storage for the returned string is managed by + the library and released automatically when the setting is + destroyed; the string must not be freed by the caller. For safety + and convenience, consider assigning the return value to a + `std::string'. + + + -- Method on Setting: std::string getPath () + This method returns the complete dot-separated path to the + setting. Settings which do not have a name (list and array + elements) are represented by their index in square brackets. + + + -- Method on Setting: Setting & getParent () + This method returns the parent setting of the setting. If the + setting is the root setting, a `SettingNotFoundException' is + thrown. + + + -- Method on Setting: bool isRoot () + This method returns `true' if the setting is the root setting, and + `false' otherwise. + + + -- Method on Setting: int getIndex () + This method returns the index of the setting within its parent + setting. When applied to the root setting, this method returns -1. + + + -- Method on Setting: Setting::Type getType () + This method returns the type of the setting. The `Setting::Type' + enumeration consists of the following constants: `TypeInt', + `TypeInt64', `TypeFloat', `TypeString', `TypeBoolean', + `TypeArray', `TypeList', and `TypeGroup'. + + + -- Method on Setting: Setting::Format getFormat () + -- Method on Setting: void setFormat (Setting::Format FORMAT) + These methods get and set the external format for the setting. + + The SETTING::FORMAT enumeration consists of the following + constants: `FormatDefault' and `FormatHex'. All settings support + the `FormatDefault' format. The `FormatHex' format specifies + hexadecimal formatting for integer values, and hence only applies + to settings of type `TypeInt' and `TypeInt64'. If FORMAT is + invalid for the given setting, it is ignored. + + + -- Method on Setting: bool exists (const std::string &NAME) + -- Method on Setting: bool exists (const char *NAME) + These methods test if the setting has a child setting with the + given NAME. They return `true' if the setting exists, and `false' + otherwise. These methods do not throw exceptions. + + + -- Method on Setting: int getLength () + This method returns the number of settings in a group, or the + number of elements in a list or array. For other types of + settings, it returns 0. + + + -- Method on Setting: bool isGroup () + -- Method on Setting: bool isArray () + -- Method on Setting: bool isList () + These convenience methods test if a setting is of a given type. + + + -- Method on Setting: bool isAggregate () + -- Method on Setting: bool isScalar () + -- Method on Setting: bool isNumber () + These convenience methods test if a setting is of an aggregate + type (a group, array, or list), of a scalar type (integer, 64-bit + integer, floating point, boolean, or string), and of a number + (integer, 64-bit integer, or floating point), respectively. + + + -- Method on Setting: unsigned int getSourceLine () + This method returns the line number of the configuration file or + stream at which the setting was parsed. This information is useful + for reporting application-level errors. If the setting was not + read from a file or stream, or if the line number is otherwise + unavailable, the method returns 0. + + + +File: libconfig.info, Node: Configuration File Grammar, Next: License, Prev: The C++ API, Up: Top + +5 Configuration File Grammar +**************************** + +Below is the BNF grammar for configuration files. Comments are not part +of the grammar, and hence are not included here. + + + configuration = setting-list | empty + + empty = + + setting-list = setting | setting-list setting + + setting = name (":" | "=") value ";" + + value = scalar-value | array | list | group + + value-list = value | value-list "," value + + scalar-value = boolean | integer | integer64 | hex | hex64 | float + | string + + scalar-value-list = scalar-value | scalar-value-list "," scalar-value + + array = "[" (scalar-value-list | empty) "]" + + list = "(" (value-list | empty) ")" + + group = "{" (setting-list | empty) "}" + + + + Terminals are defined below as regular expressions: + +`boolean' `([Tt][Rr][Uu][Ee])|([Ff][Aa][Ll][Ss][Ee])' +`string' `\"([^\"\\]|\\.)*\"' +`name' `[A-Za-z\*][-A-Za-z0-9_\*]*' +`integer' `[-+]?[0-9]+' +`integer64' `[-+]?[0-9]+L(L)?' +`hex' `0[Xx][0-9A-Fa-f]+' +`hex64' `0[Xx][0-9A-Fa-f]+L(L)?' +`float' `([-+]?([0-9]*)?\.[0-9]*([eE][-+]?[0-9]+)?)|([-+]([0-9]+)(\.[0-9]*)?[eE][-+]?[0-9]+)' + + +File: libconfig.info, Node: License, Next: Function Index, Prev: Configuration File Grammar, Up: Top + +Appendix A License +****************** + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + + Copyright (C) 1991, 1999 Free Software Foundation, Inc., 59 Temple +Place, Suite 330, Boston, MA 02111-1307 USA + + Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + + [This is the first released version of the Lesser GPL. It also +counts as the successor of the GNU Library Public License, version 2, +hence the version number 2.1.] + + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software-to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages-typically libraries-of the Free +Software Foundation and other authors who decide to use it. You can use +it too, but we suggest you first think carefully about whether this +license or the ordinary General Public License is the better strategy to +use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do these +things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know that +what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and is +quite different from the ordinary General Public License. We use this +license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the entire +combination fits its criteria of freedom. The Lesser General Public +License permits more lax criteria for linking other code with the +library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General Public +License. It also provides other free software developers Less of an +advantage over competing non-free programs. These disadvantages are the +reason we use the ordinary General Public License for many libraries. +However, the Lesser license provides advantages in certain special +circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it +becomes a de-facto standard. To achieve this, non-free programs must +be allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of free +software. For example, permission to use the GNU C Library in non-free +programs enables many more people to use the whole GNU operating system, +as well as its variant, the GNU/Linux operating system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is linked +with the Library has the freedom and the wherewithal to run that program +using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + + 0. This License Agreement applies to any software library or other + program which contains a notice placed by the copyright holder or + other authorized party saying it may be distributed under the + terms of this Lesser General Public License (also called "this + License"). Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data + prepared so as to be conveniently linked with application programs + (which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work + which has been distributed under these terms. A "work based on + the Library" means either the Library or any derivative work under + copyright law: that is to say, a work containing the Library or a + portion of it, either verbatim or with modifications and/or + translated straightforwardly into another language. (Hereinafter, + translation is included without limitation in the term + "modification".) + + "Source code" for a work means the preferred form of the work for + making modifications to it. For a library, complete source code + means all the source code for all modules it contains, plus any + associated interface definition files, plus the scripts used to + control compilation and installation of the library. + + Activities other than copying, distribution and modification are + not covered by this License; they are outside its scope. The act + of running a program using the Library is not restricted, and + output from such a program is covered only if its contents + constitute a work based on the Library (independent of the use of + the Library in a tool for writing it). Whether that is true + depends on what the Library does and what the program that uses + the Library does. + + + 1. You may copy and distribute verbatim copies of the Library's + complete source code as you receive it, in any medium, provided + that you conspicuously and appropriately publish on each copy an + appropriate copyright notice and disclaimer of warranty; keep + intact all the notices that refer to this License and to the + absence of any warranty; and distribute a copy of this License + along with the Library. + + You may charge a fee for the physical act of transferring a copy, + and you may at your option offer warranty protection in exchange + for a fee. + + + 2. You may modify your copy or copies of the Library or any portion + of it, thus forming a work based on the Library, and copy and + distribute such modifications or work under the terms of Section 1 + above, provided that you also meet all of these conditions: + + a. The modified work must itself be a software library. + + + b. You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + + c. You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + + d. If a facility in the modified Library refers to a function or + a table of data to be supplied by an application program that + uses the facility, other than as an argument passed when the + facility is invoked, then you must make a good faith effort + to ensure that, in the event an application does not supply + such function or table, the facility still operates, and + performs whatever part of its purpose remains meaningful. + + (For example, a function in a library to compute square roots + has a purpose that is entirely well-defined independent of + the application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function + must be optional: if the application does not supply it, the + square root function must still compute square roots.) + + + These requirements apply to the modified work as a whole. If + identifiable sections of that work are not derived from the + Library, and can be reasonably considered independent and separate + works in themselves, then this License, and its terms, do not + apply to those sections when you distribute them as separate + works. But when you distribute the same sections as part of a + whole which is a work based on the Library, the distribution of + the whole must be on the terms of this License, whose permissions + for other licensees extend to the entire whole, and thus to each + and every part regardless of who wrote it. + + Thus, it is not the intent of this section to claim rights or + contest your rights to work written entirely by you; rather, the + intent is to exercise the right to control the distribution of + derivative or collective works based on the Library. + + In addition, mere aggregation of another work not based on the + Library with the Library (or with a work based on the Library) on + a volume of a storage or distribution medium does not bring the + other work under the scope of this License. + + + 3. You may opt to apply the terms of the ordinary GNU General Public + License instead of this License to a given copy of the Library. + To do this, you must alter all the notices that refer to this + License, so that they refer to the ordinary GNU General Public + License, version 2, instead of to this License. (If a newer + version than version 2 of the ordinary GNU General Public License + has appeared, then you can specify that version instead if you + wish.) Do not make any other change in these notices. + + Once this change is made in a given copy, it is irreversible for + that copy, so the ordinary GNU General Public License applies to + all subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of the + Library into a program that is not a library. + + + 4. You may copy and distribute the Library (or a portion or + derivative of it, under Section 2) in object code or executable + form under the terms of Sections 1 and 2 above provided that you + accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software + interchange. + + If distribution of object code is made by offering access to copy + from a designated place, then offering equivalent access to copy + the source code from the same place satisfies the requirement to + distribute the source code, even though third parties are not + compelled to copy the source along with the object code. + + + 5. A program that contains no derivative of any portion of the + Library, but is designed to work with the Library by being + compiled or linked with it, is called a "work that uses the + Library". Such a work, in isolation, is not a derivative work of + the Library, and therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library + creates an executable that is a derivative of the Library (because + it contains portions of the Library), rather than a "work that + uses the library". The executable is therefore covered by this + License. Section 6 states terms for distribution of such + executables. + + When a "work that uses the Library" uses material from a header + file that is part of the Library, the object code for the work may + be a derivative work of the Library even though the source code is + not. Whether this is true is especially significant if the work + can be linked without the Library, or if the work is itself a + library. The threshold for this to be true is not precisely + defined by law. + + If such an object file uses only numerical parameters, data + structure layouts and accessors, and small macros and small inline + functions (ten lines or less in length), then the use of the + object file is unrestricted, regardless of whether it is legally a + derivative work. (Executables containing this object code plus + portions of the Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may + distribute the object code for the work under the terms of Section + 6. Any executables containing that work also fall under Section + 6, whether or not they are linked directly with the Library itself. + + + 6. As an exception to the Sections above, you may also combine or + link a "work that uses the Library" with the Library to produce a + work containing portions of the Library, and distribute that work + under terms of your choice, provided that the terms permit + modification of the work for the customer's own use and reverse + engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the + Library is used in it and that the Library and its use are covered + by this License. You must supply a copy of this License. If the + work during execution displays copyright notices, you must include + the copyright notice for the Library among them, as well as a + reference directing the user to the copy of this License. Also, + you must do one of these things: + + + a. Accompany the work with the complete corresponding + machine-readable source code for the Library including + whatever changes were used in the work (which must be + distributed under Sections 1 and 2 above); and, if the work + is an executable linked with the Library, with the complete + machine-readable "work that uses the Library", as object code + and/or source code, so that the user can modify the Library + and then relink to produce a modified executable containing + the modified Library. (It is understood that the user who + changes the contents of definitions files in the Library will + not necessarily be able to recompile the application to use + the modified definitions.) + + + b. Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run + time a copy of the library already present on the user's + computer system, rather than copying library functions into + the executable, and (2) will operate properly with a modified + version of the library, if the user installs one, as long as + the modified version is interface-compatible with the version + that the work was made with. + + + c. Accompany the work with a written offer, valid for at least + three years, to give the same user the materials specified in + Subsection 6a, above, for a charge no more than the cost of + performing this distribution. + + + d. If distribution of the work is made by offering access to + copy from a designated place, offer equivalent access to copy + the above specified materials from the same place. + + + e. Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + + For an executable, the required form of the "work that uses the + Library" must include any data and utility programs needed for + reproducing the executable from it. However, as a special + exception, the materials to be distributed need not include + anything that is normally distributed (in either source or binary + form) with the major components (compiler, kernel, and so on) of + the operating system on which the executable runs, unless that + component itself accompanies the executable. + + It may happen that this requirement contradicts the license + restrictions of other proprietary libraries that do not normally + accompany the operating system. Such a contradiction means you + cannot use both them and the Library together in an executable + that you distribute. + + + 7. You may place library facilities that are a work based on the + Library side-by-side in a single library together with other + library facilities not covered by this License, and distribute + such a combined library, provided that the separate distribution + of the work based on the Library and of the other library + facilities is otherwise permitted, and provided that you do these + two things: + + + a. Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + + b. Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and + explaining where to find the accompanying uncombined form of + the same work. + + + + 8. You may not copy, modify, sublicense, link with, or distribute the + Library except as expressly provided under this License. Any + attempt otherwise to copy, modify, sublicense, link with, or + distribute the Library is void, and will automatically terminate + your rights under this License. However, parties who have + received copies, or rights, from you under this License will not + have their licenses terminated so long as such parties remain in + full compliance. + + + 9. You are not required to accept this License, since you have not + signed it. However, nothing else grants you permission to modify + or distribute the Library or its derivative works. These actions + are prohibited by law if you do not accept this License. + Therefore, by modifying or distributing the Library (or any work + based on the Library), you indicate your acceptance of this + License to do so, and all its terms and conditions for copying, + distributing or modifying the Library or works based on it. + + + 10. Each time you redistribute the Library (or any work based on the + Library), the recipient automatically receives a license from the + original licensor to copy, distribute, link with or modify the + Library subject to these terms and conditions. You may not impose + any further restrictions on the recipients' exercise of the rights + granted herein. You are not responsible for enforcing compliance + by third parties with this License. + + + 11. If, as a consequence of a court judgment or allegation of patent + infringement or for any other reason (not limited to patent + issues), conditions are imposed on you (whether by court order, + agreement or otherwise) that contradict the conditions of this + License, they do not excuse you from the conditions of this + License. If you cannot distribute so as to satisfy simultaneously + your obligations under this License and any other pertinent + obligations, then as a consequence you may not distribute the + Library at all. For example, if a patent license would not permit + royalty-free redistribution of the Library by all those who + receive copies directly or indirectly through you, then the only + way you could satisfy both it and this License would be to refrain + entirely from distribution of the Library. + + If any portion of this section is held invalid or unenforceable + under any particular circumstance, the balance of the section is + intended to apply, and the section as a whole is intended to apply + in other circumstances. + + It is not the purpose of this section to induce you to infringe any + patents or other property right claims or to contest validity of + any such claims; this section has the sole purpose of protecting + the integrity of the free software distribution system which is + implemented by public license practices. Many people have made + generous contributions to the wide range of software distributed + through that system in reliance on consistent application of that + system; it is up to the author/donor to decide if he or she is + willing to distribute software through any other system and a + licensee cannot impose that choice. + + This section is intended to make thoroughly clear what is believed + to be a consequence of the rest of this License. + + + 12. If the distribution and/or use of the Library is restricted in + certain countries either by patents or by copyrighted interfaces, + the original copyright holder who places the Library under this + License may add an explicit geographical distribution limitation + excluding those countries, so that distribution is permitted only + in or among countries not thus excluded. In such case, this + License incorporates the limitation as if written in the body of + this License. + + + 13. The Free Software Foundation may publish revised and/or new + versions of the Lesser General Public License from time to time. + Such new versions will be similar in spirit to the present + version, but may differ in detail to address new problems or + concerns. + + Each version is given a distinguishing version number. If the + Library specifies a version number of this License which applies + to it and "any later version", you have the option of following + the terms and conditions either of that version or of any later + version published by the Free Software Foundation. If the Library + does not specify a license version number, you may choose any + version ever published by the Free Software Foundation. + + + 14. If you wish to incorporate parts of the Library into other free + programs whose distribution conditions are incompatible with + these, write to the author to ask for permission. For software + which is copyrighted by the Free Software Foundation, write to the + Free Software Foundation; we sometimes make exceptions for this. + Our decision will be guided by the two goals of preserving the + free status of all derivatives of our free software and of + promoting the sharing and reuse of software generally. + + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO + WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE + LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT + HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT + WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT + NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE + QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE + LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY + SERVICING, REPAIR OR CORRECTION. + + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN + WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY + MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE + LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, + INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR + INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF + DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU + OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY + OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of +the ordinary General Public License). + + To apply these terms, attach the following notices to the library. +It is safest to attach them to the start of each source file to most +effectively convey the exclusion of warranty; and each file should have +at least the "copyright" line and a pointer to where the full notice is +found. + + +<one line to give the library's name and a brief idea of what it does.> +Copyright (C) <year> <name of author> + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Also add information on how to contact you by electronic and paper +mail. + + You should also get your employer (if you work as a programmer) or +your school, if any, to sign a "copyright disclaimer" for the library, +if necessary. Here is a sample; alter the names: + + +Yoyodyne, Inc., hereby disclaims all copyright interest in the +library `Frob' (a library for tweaking knobs) written by James Random Hacker. + +<signature of Ty Coon>, 1 April 1990 +Ty Coon, President of Vice + + That's all there is to it! + + +File: libconfig.info, Node: Function Index, Next: Type Index, Prev: License, Up: Top + +Function Index +************** + + +* Menu: + +* add on Setting: The C++ API. (line 378) +* Config on Config: The C++ API. (line 43) +* config_destroy: The C API. (line 15) +* config_error_line: The C API. (line 55) +* config_error_text: The C API. (line 54) +* config_get_auto_convert: The C API. (line 65) +* config_init: The C API. (line 14) +* config_lookup: The C API. (line 104) +* config_lookup_bool: The C API. (line 87) +* config_lookup_float: The C API. (line 85) +* config_lookup_int: The C API. (line 81) +* config_lookup_int64: The C API. (line 83) +* config_lookup_string: The C API. (line 89) +* config_read: The C API. (line 26) +* config_read_file: The C API. (line 35) +* config_root_setting: The C API. (line 284) +* config_set_auto_convert: The C API. (line 64) +* config_set_destructor: The C API. (line 378) +* config_setting_add: The C API. (line 251) +* config_setting_get_bool: The C API. (line 118) +* config_setting_get_bool_elem: The C API. (line 217) +* config_setting_get_elem: The C API. (line 203) +* config_setting_get_float: The C API. (line 116) +* config_setting_get_float_elem: The C API. (line 215) +* config_setting_get_format: The C API. (line 177) +* config_setting_get_hook: The C API. (line 368) +* config_setting_get_int: The C API. (line 112) +* config_setting_get_int64: The C API. (line 114) +* config_setting_get_int64_elem: The C API. (line 213) +* config_setting_get_int_elem: The C API. (line 211) +* config_setting_get_member: The C API. (line 196) +* config_setting_get_string: The C API. (line 120) +* config_setting_get_string_elem: The C API. (line 219) +* config_setting_index: The C API. (line 310) +* config_setting_is_aggregate: The C API. (line 343) +* config_setting_is_array: The C API. (line 334) +* config_setting_is_group: The C API. (line 332) +* config_setting_is_list: The C API. (line 336) +* config_setting_is_number: The C API. (line 347) +* config_setting_is_root: The C API. (line 304) +* config_setting_is_scalar: The C API. (line 345) +* config_setting_length: The C API. (line 317) +* config_setting_lookup_bool: The C API. (line 159) +* config_setting_lookup_float: The C API. (line 156) +* config_setting_lookup_int: The C API. (line 150) +* config_setting_lookup_int64: The C API. (line 153) +* config_setting_lookup_string: The C API. (line 162) +* config_setting_name: The C API. (line 290) +* config_setting_parent: The C API. (line 298) +* config_setting_remove: The C API. (line 261) +* config_setting_remove_elem: The C API. (line 272) +* config_setting_set_bool: The C API. (line 137) +* config_setting_set_bool_elem: The C API. (line 236) +* config_setting_set_float: The C API. (line 135) +* config_setting_set_float_elem: The C API. (line 234) +* config_setting_set_format: The C API. (line 179) +* config_setting_set_hook: The C API. (line 366) +* config_setting_set_int: The C API. (line 131) +* config_setting_set_int64: The C API. (line 133) +* config_setting_set_int64_elem: The C API. (line 232) +* config_setting_set_int_elem: The C API. (line 230) +* config_setting_set_string: The C API. (line 139) +* config_setting_set_string_elem: The C API. (line 238) +* config_setting_source_line: The C API. (line 357) +* config_setting_type: The C API. (line 323) +* config_write: The C API. (line 43) +* config_write_file: The C API. (line 48) +* exists on Config: The C++ API. (line 104) +* exists on Setting: The C++ API. (line 479) +* getAutoConvert on Config: The C++ API. (line 77) +* getError on ParseException: The C++ API. (line 67) +* getFormat on Setting: The C++ API. (line 467) +* getIndex on Setting: The C++ API. (line 455) +* getLength on Setting: The C++ API. (line 486) +* getLine on ParseException: The C++ API. (line 68) +* getName on Setting: The C++ API. (line 429) +* getParent on Setting: The C++ API. (line 444) +* getPath on Setting: The C++ API. (line 438) +* getPath on SettingException: The C++ API. (line 35) +* getRoot on Config: The C++ API. (line 92) +* getSourceLine on Setting: The C++ API. (line 507) +* getType on Setting: The C++ API. (line 460) +* isAggregate on Setting: The C++ API. (line 498) +* isArray on Setting: The C++ API. (line 493) +* isGroup on Setting: The C++ API. (line 492) +* isList on Setting: The C++ API. (line 494) +* isNumber on Setting: The C++ API. (line 500) +* isRoot on Setting: The C++ API. (line 450) +* isScalar on Setting: The C++ API. (line 499) +* lookup on Config: The C++ API. (line 97) +* lookupValue on Config: The C++ API. (line 111) +* lookupValue on Setting: The C++ API. (line 298) +* operator bool() on Setting: The C++ API. (line 185) +* operator const char *() on Setting: The C++ API. (line 194) +* operator double() on Setting: The C++ API. (line 193) +* operator float() on Setting: The C++ API. (line 192) +* operator int() on Setting: The C++ API. (line 186) +* operator long long() on Setting: The C++ API. (line 190) +* operator long() on Setting: The C++ API. (line 188) +* operator std::string() on Setting: The C++ API. (line 195) +* operator unsigned int() on Setting: The C++ API. (line 187) +* operator unsigned long long() on Setting: The C++ API. (line 191) +* operator unsigned long() on Setting: The C++ API. (line 189) +* operator= on Setting: The C++ API. (line 257) +* operator[] on Setting: The C++ API. (line 276) +* read on Config: The C++ API. (line 48) +* readFile on Config: The C++ API. (line 56) +* remove on Setting: The C++ API. (line 408) +* setAutoConvert on Config: The C++ API. (line 76) +* setFormat on Setting: The C++ API. (line 468) +* write on Config: The C++ API. (line 49) +* writeFile on Config: The C++ API. (line 57) +* ~Config on Config: The C++ API. (line 44) + + +File: libconfig.info, Node: Type Index, Next: Concept Index, Prev: Function Index, Up: Top + +Type Index +********** + + +* Menu: + +* Config: The C++ API. (line 6) +* config_setting_t: The C API. (line 6) +* config_t: The C API. (line 6) +* ConfigException: The C++ API. (line 13) +* FileIOException: The C++ API. (line 27) +* ParseException: The C++ API. (line 24) +* Setting: The C++ API. (line 6) +* Setting::Format: The C++ API. (line 470) +* Setting::Type: The C++ API. (line 460) +* SettingException: The C++ API. (line 30) +* SettingFormat: The C API. (line 182) +* SettingNameException: The C++ API. (line 21) +* SettingNotFoundException: The C++ API. (line 19) +* SettingTypeException: The C++ API. (line 16) + + +File: libconfig.info, Node: Concept Index, Prev: Type Index, Up: Top + +Concept Index +************* + + +* Menu: + +* aggregate value: The C API. (line 347) +* array: Configuration Files. (line 23) +* comment: Comments. (line 6) +* configuration: Configuration Files. (line 23) +* format: The C API. (line 182) +* group: Configuration Files. (line 23) +* list: Configuration Files. (line 23) +* locale: Internationalization Issues. + (line 14) +* path: Configuration Files. (line 76) +* scalar value: Configuration Files. (line 23) +* setting: Configuration Files. (line 23) +* Unicode: Internationalization Issues. + (line 6) +* UTF-8: Internationalization Issues. + (line 6) +* value: Configuration Files. (line 23) + + + +Tag Table: +Node: Top245 +Node: Introduction511 +Node: Why Another Configuration File Library?1323 +Node: Using the Library from a C Program2399 +Node: Using the Library from a C++ Program2867 +Node: Multithreading Issues3532 +Node: Internationalization Issues5099 +Node: Compiling Using pkg-config6622 +Node: Configuration Files7484 +Node: Settings11311 +Node: Groups11629 +Node: Arrays11903 +Node: Lists12175 +Node: Integer Values12461 +Node: 64-bit Integer Values12925 +Node: Floating Point Values13304 +Node: Boolean Values13761 +Node: String Values14033 +Node: Comments14922 +Node: The C API15802 +Node: The C++ API33339 +Node: Configuration File Grammar55291 +Node: License56588 +Node: Function Index84682 +Node: Type Index93076 +Node: Concept Index94241 + +End Tag Table |