\input texinfo.tex    @c -*-texinfo-*-
@c
@c %**start of header

@c All text is ignored before the setfilename.
@setfilename libconfig.info
@settitle libconfig

@set edition 1.7.3
@set update-date 20 Jun 2021
@set subtitle-text A Library For Processing Structured Configuration Files
@set author-text Mark A.@: Lindner

@comment %**end of header

@firstparagraphindent insert

@dircategory Software libraries
@direntry
* libconfig: (libconfig).       A Library For Processing Structured Configuration Files
@end direntry


@tex
\global\emergencystretch = .3\hsize
@end tex

@setchapternewpage odd

@titlepage

@title libconfig
@subtitle @value{subtitle-text}
@subtitle Version @value{edition}
@subtitle @value{update-date}

@author @value{author-text}

@page
@vskip 0pt plus 1filll
Copyright @copyright{} 2004-2021  Mark A Lindner

Permission is granted to make and distribute verbatim copies of
this manual provided the copyright notice and this permission notice
are preserved on all copies.

Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided that the entire
resulting derived work is distributed under the terms of a permission
notice identical to this one.

@end titlepage

@c Give the HTML output a title page that somewhat resembles the printed one
@ifhtml
@html
<hr noshade size=6 color="black">
<div align=right>@value{subtitle-text}<br>
Version @value{edition}<br>
@value{update-date}</div>
<br><br><br><br>
<font size=+1>@value{author-text}</font>
<hr size=3 noshade color="black">
<br><br>
@end html
@end ifhtml

@contents

@ifnottex
@node Top
@comment  node-name,  next,  previous,  up
@top libconfig
@end ifnottex

@menu
* Introduction::
* Configuration Files::
* The C API::
* The C++ API::
* Example Programs::
* Other Bindings and Implementations::
* License::
* Configuration File Grammar::
* Function Index::
* Type Index::
* Concept Index::
@end menu

@node Introduction, Configuration Files, Top, Top
@comment  node-name,  next,  previous,  up
@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::
* Version Test Macros::
@end menu
@chapter Introduction

@i{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).

@node Why Another Configuration File Library?, Using the Library from a C Program, , Introduction
@comment  node-name,  next,  previous,  up
@section 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
@i{libconfig} that set it apart from the other libraries are:

@itemize @bullet

@item A fully reentrant parser. Independent configurations can be parsed in concurrent threads at the same time.

@item Both C @i{and} C++ bindings, as well as hooks to allow for the creation of wrappers in other languages.

@item 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.

@item A low-footprint implementation (just 37K for the C library and 76K for
the C++ library) that is suitable for memory-constrained systems.

@item Proper documentation.

@end itemize

@node Using the Library from a C Program, Using the Library from a C++ Program, Why Another Configuration File Library?, Introduction
@comment  node-name,  next,  previous,  up
@section Using the Library from a C Program

To use the library from C code, include the following preprocessor
directive in your source files:

@sp 1
@smallexample
#include <libconfig.h>
@end smallexample
@sp 1

To link with the library, specify @samp{-lconfig} as an argument to the
linker.

@node Using the Library from a C++ Program, Multithreading Issues, Using the Library from a C Program, Introduction
@comment  node-name,  next,  previous,  up
@section Using the Library from a C++ Program

To use the library from C++, include the following preprocessor
directive in your source files:

@sp 1
@smallexample
#include <libconfig.h++>
@end smallexample
@sp 1

Or, alternatively:

@sp 1
@smallexample
#include <libconfig.hh>
@end smallexample
@sp 1
@page
The C++ API classes are defined in the namespace @samp{libconfig}, hence the
following statement may optionally be used:

@sp 1
@smallexample
using namespace libconfig;
@end smallexample
@sp 1

To link with the library, specify @samp{-lconfig++} as an argument to
the linker.

@node Multithreading Issues, Internationalization Issues, Using the Library from a C++ Program, Introduction
@comment  node-name,  next,  previous,  up
@section Multithreading Issues

@i{Libconfig} is fully @dfn{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.

@i{Libconfig} is not @dfn{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.

@i{Libconfig} is not @dfn{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.

@i{Libconfig} is not guaranteed to be @dfn{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.

@node Internationalization Issues, Compiling Using pkg-config, Multithreading Issues, Introduction
@comment  node-name,  next,  previous,  up
@section Internationalization Issues

@cindex Unicode
@cindex UTF-8
@i{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 (@t{wchar_t}) strings using the
wide string conversion functions such as @t{mbsrtowcs()} and
@t{wcsrtombs()} or the @t{iconv()} function of the @i{libiconv}
library.

@cindex locale
The textual representation of a floating point value varies by
locale. However, the @i{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,
@i{libconfig} temporarily changes the @t{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 @i{libconfig} in that environment, the calling program is
responsible for changing the @t{LC_NUMERIC} category of the locale to
the "C" locale before reading or writing a configuration.

@node Compiling Using pkg-config, Version Test Macros, Internationalization Issues, Introduction
@comment  node-name,  next,  previous,  up
@section Compiling Using pkg-config

@cindex pkg-config
On UNIX systems you can use the @i{pkg-config} utility (version 0.20
or later) to automatically select the appropriate compiler and linker
switches for @i{libconfig}. Ensure that the environment variable
@code{PKG_CONFIG_PATH} contains the absolute path to the
@file{lib/pkgconfig} subdirectory of the @i{libconfig} installation. Then,
you can compile and link C programs with @i{libconfig} as follows:

@smallexample
gcc `pkg-config --cflags libconfig` myprogram.c -o myprogram \
    `pkg-config --libs libconfig`
@end smallexample
@sp 1

And similarly, for C++ programs:

@smallexample
g++ `pkg-config --cflags libconfig++` myprogram.cpp -o myprogram \
    `pkg-config --libs libconfig++`
@end smallexample

@sp 1
Note the backticks in the above examples.

When using @b{autoconf}, the @code{PKG_CHECK_MODULES} m4 macro may be used to check for the presence of a given version of @i{libconfig}, and set the appropriate Makefile variables automatically. For example:

@smallexample
PKG_CHECK_MODULES([LIBCONFIGXX], [libconfig++ >= 1.4],,
  AC_MSG_ERROR([libconfig++ 1.4 or newer not found.])
)
@end smallexample

In the above example, if @i{libconfig++} version 1.4 or newer is found,
the Makefile variables @code{LIBCONFIGXX_LIBS} and @code{LIBCONFIGXX_CFLAGS} will be
set to the appropriate compiler and linker flags for compiling with
@i{libconfig}, and if it is not found, the configure script will abort
with an error to that effect.

@node Version Test Macros, , Compiling Using pkg-config, Introduction
@comment  node-name,  next,  previous,  up
@section Version Test Macros

The @file{libconfig.h} header declares the following macros:

@defmac LIBCONFIG_VER_MAJOR
@defmacx LIBCONFIG_VER_MINOR
@defmacx LIBCONFIG_VER_REVISION

These macros represent the major version, minor version, and revision
of the @i{libconfig} library. For example, in @i{libconfig} 1.4 these
are defined as @samp{1}, @samp{4}, and @samp{0}, respectively. These
macros can be used in preprocessor directives to determine which
@i{libconfig} features and/or APIs are present. For example:

@smallexample
#if (((LIBCONFIG_VER_MAJOR == 1) && (LIBCONFIG_VER_MINOR >= 4)) \
     || (LIBCONFIG_VER_MAJOR > 1))
  /* use features present in libconfig 1.4 and later */
#endif
@end smallexample

These macros were introduced in @i{libconfig} 1.4.

@end defmac

Similarly, the @file{libconfig.h++} header declares the following macros:

@defmac LIBCONFIGXX_VER_MAJOR
@defmacx LIBCONFIGXX_VER_MINOR
@defmacx LIBCONFIGXX_VER_REVISION

These macros represent the major version, minor version, and revision
of the @i{libconfig++} library.

@end defmac

@node Configuration Files, The C API, Introduction, Top
@comment  node-name,  next,  previous,  up
@menu
* Settings::
* Groups::
* Arrays::
* Lists::
* Integer Values::
* 64-bit Integer Values::
* Floating Point Values::
* Boolean Values::
* String Values::
* Comments::
* Include Directives::
@end menu
@chapter Configuration Files

@i{Libconfig} supports structured, hierarchical configurations. These
configurations can be read from and written to files and manipulated
in memory.

@cindex setting
@cindex value
@cindex scalar value
@cindex array
@cindex group
@cindex list
@cindex configuration
A @dfn{configuration} consists of a group of @dfn{settings}, which
associate names with values. A @dfn{value} can be one of the
following:

@itemize @bullet
@item A @dfn{scalar value}: integer, 64-bit integer, floating-point number, boolean,
or string
@item An @dfn{array}, which is a sequence of scalar values, all of which must have the same type
@item A @dfn{group}, which is a collection of settings
@item A @dfn{list}, which is a sequence of values of any type, including other lists
@end itemize

Consider the following configuration file for a hypothetical GUI
application, which illustrates all of the elements of the configuration
file grammar.

@sp 1
@cartouche
@smallexample
# 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;	// hex
    umask = 0027;	// octal. Range limited to that of "int"
  @};
@};
@end smallexample
@end cartouche
@sp 1

@cindex path
Settings can be uniquely identified within the configuration by a
@dfn{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
@code{x} setting is @code{application.window.pos.x}; the path to the
@code{version} setting is simply @code{version}; and the path to the
@code{title} setting of the second book in the @code{books} list is
@code{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 @code{TRUE}, @code{true},
@code{FALSE}, or @code{false} (or any other mixed-case version of
those tokens, e.g., @code{True} or @code{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 (@samp{-}), underscores (@samp{_}), and asterisks
(@samp{*}), 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 native types @code{int}, @code{long long},
@code{double}, and @code{const char *}, respectively. The boolean type
is mapped to @code{int} in C and @code{bool} in C++.

The following sections describe the elements of the configuration file
grammar in additional detail.

@node Settings, Groups, , Configuration Files
@comment  node-name,  next,  previous,  up
@section Settings

A setting has the form:

@i{name} @b{=} @i{value} @b{;}

or:

@i{name} @b{:} @i{value} @b{;}

The trailing semicolon is optional. Whitespace is not significant.

The value may be a scalar value, an array, a group, or a list.

@node Groups, Arrays, Settings, Configuration Files
@comment  node-name,  next,  previous,  up
@section Groups

A group has the form:

@b{@{}
   @i{settings ...}
@b{@}}

Groups can contain any number of settings, but each setting must have
a unique name within the group.

@node Arrays, Lists, Groups, Configuration Files
@comment  node-name,  next,  previous,  up
@section Arrays

An array has the form:

@b{[} @i{value}@b{,} @i{value ...} @b{]}

An array may have zero or more elements, but the elements must all be
scalar values of the same type.

The last element in an array may be followed by a comma, which will be ignored.

@node Lists, Integer Values, Arrays, Configuration Files
@comment  node-name,  next,  previous,  up
@section Lists

A list has the form:

@b{(} @i{value}@b{,} @i{value ...} @b{)}

A list may have zero or more elements, each of which can be a scalar
value, an array, a group, or another list.

The last element in a list may be followed by a comma, which will be ignored.

@node Integer Values, 64-bit Integer Values, Lists, Configuration Files
@comment  node-name,  next,  previous,  up
@section Integer Values

Integers can be represented in one of two ways: as a series of one or
more decimal digits (@samp{0} - @samp{9}), with an optional leading
sign character (@samp{+} or @samp{-}); or as a hexadecimal value
consisting of the characters @samp{0x} followed by a series of one or
more hexadecimal digits (@samp{0} - @samp{9}, @samp{A} - @samp{F},
@samp{a} - @samp{f}). Additionally, octal notation integers (that is,
those having a leading zero with non-zero value) are also allowed.

@node 64-bit Integer Values, Floating Point Values, Integer Values, Configuration Files
@comment  node-name,  next,  previous,  up
@section 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, @samp{0L} indicates a 64-bit integer value 0.  As
of version 1.5 of the library, the trailing `L' is optional; if the
integer value exceeds the range of a 32-bit integer, it will
automatically be interpreted as a 64-bit integer.

The @i{integer} and @i{64-bit integer} setting types are interchangeable to the
extent that a conversion between the corresponding native types would not
result in an overflow or underflow. For example, a @i{long long} value can be
written to a setting that has an @i{integer} type, if that value is within the
range of an @i{int}. This rule applies to every API function or method that
reads a value from or writes a value to a setting: if the type conversion would
not result in an overflow or underflow, then the call will succeed, and
otherwise it will fail. This behavior was not well-defined prior to version 1.7
of the library.

@node Floating Point Values, Boolean Values, 64-bit Integer Values, Configuration Files
@comment  node-name,  next,  previous,  up
@section Floating Point Values

Floating point values consist of a series of one or more digits, one
decimal point, an optional leading sign character (@samp{+} or
@samp{-}), and an optional exponent. An exponent consists of the
letter @samp{E} or @samp{e}, an optional sign character, and a series
of one or more digits.

@node Boolean Values, String Values, Floating Point Values, Configuration Files
@comment  node-name,  next,  previous,  up
@section Boolean Values

Boolean values may have one of the following values: @samp{true},
@samp{false}, or any mixed-case variation thereof.

@node String Values, Comments, Boolean Values, Configuration Files
@comment  node-name,  next,  previous,  up
@section String Values

@cindex escape sequence
String values consist of arbitrary text delimited by double
quotes. Literal double quotes can be escaped by preceding them with a
backslash: @samp{\"}. The escape sequences @samp{\\}, @samp{\f},
@samp{\n}, @samp{\r}, and @samp{\t} are also recognized, and have the
usual meaning.

In addition, the @samp{\x} escape sequence is supported; this sequence
must be followed by @i{exactly two} hexadecimal digits, which represent an
8-bit ASCII value. For example, @samp{\xFF} represents the character
with ASCII code 0xFF.

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:

@itemize @bullet
@item
@code{"The quick brown fox jumped over the lazy dog."}

@item
@code{"The quick brown fox"} @*
@code{" jumped over the lazy dog."}

@item
@code{"The quick" /* comment */ " brown fox " // another comment} @*
@code{"jumped over the lazy dog."}

@end itemize
@page
@node Comments, Include Directives, String Values, Configuration Files
@comment  node-name,  next,  previous,  up
@section Comments

@cindex comment
Three types of comments are allowed within a configuration:

@itemize @bullet

@item Script-style comments. All text beginning with a @samp{#} character
to the end of the line is ignored.

@item C-style comments. All text, including line breaks, between a starting
@samp{/*} sequence and an ending @samp{*/} sequence is ignored.

@item C++-style comments. All text beginning with a @samp{//} sequence to the
end of the line is ignored.

@end itemize

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.


@node Include Directives, , Comments, Configuration Files
@comment  node-name,  next,  previous,  up
@section Include Directives

@cindex include directive
A configuration file may ``include'' the contents of other files
using an @i{include directive}. This directive has the effect of
inlining the contents of the named file(s) at the point of inclusion.

An include directive must appear on its own line in the input. It has
the form:

@b{@@include "}@i{path}@b{"}

@cindex include function
The interpretation of @i{path} depends on the currently registered
@i{include function}. The default include function prepends the include
directory, if any, to @i{path}, and then interprets the result as a single,
literal file path. The application may supply its own include function which
does variable substitution, wildcard expansion, or other transformations,
returning a list of zero or more paths to files whose contents should be inlined
at the point of inclusion.

Any backslashes or double quotes in the path must be escaped as
@samp{\\} and @samp{\"}, respectively.

For example, consider the following two configuration files:

@cartouche
@smallexample
# file: quote.cfg
quote = "Criticism may not be agreeable, but it is necessary."
        " It fulfils the same function as pain in the human"
        " body. It calls attention to an unhealthy state of"
        " things.\n"
        "\t--Winston Churchill";
@end smallexample
@end cartouche

@cartouche
@smallexample
# file: test.cfg
info: @{
  name = "Winston Churchill";
  @@include "quote.cfg"
  country = "UK";
@};
@end smallexample
@end cartouche

The resulting configuration will be equivalent to one in which the
contents of the file @samp{quote.cfg} appeared at the point where the
include directive is placed.

Include files may be nested to a maximum of 10 levels; exceeding this
limit results in a parse error.

When the path argument to an @b{@@include} directive is a relative
path, then it will be interpreted as being relative to the include
directory that has been been set by means of
@code{config_set_include_dir()}. If no include directory has been set,
then it will be taken as being relative to the program's current
working directory.

Like comments, include directives are not part of the configuration
file syntax. They are processed before the configuration itself is
parsed. Therefore, they are not preserved when the configuration is
written back out to a stream. There is presently no support for
programmatically inserting include directives into a configuration.

@node The C API, The C++ API, Configuration Files, Top
@comment  node-name,  next,  previous,  up
@chapter The C API

@tindex config_t
@tindex config_setting_t
This chapter describes the C library API. The type @i{config_t}
represents a configuration, and the type @i{config_setting_t} represents
a configuration setting.

The boolean values @code{CONFIG_TRUE} and @code{CONFIG_FALSE} are
macros defined as @code{(1)} and @code{(0)}, respectively.

@deftypefun void config_init (@w{config_t * @var{config}})
@deftypefunx void config_destroy (@w{config_t * @var{config}})

These functions initialize and destroy the configuration object @var{config}.

@code{config_init()} initializes the @i{config_t} structure pointed to by
@var{config} as a new, empty configuration.

@code{config_destroy()} destroys the configuration @var{config},
deallocating all memory associated with the configuration, but does not
attempt to deallocate the @i{config_t} structure itself.

@end deftypefun

@deftypefun void config_clear (@w{config_t * @var{config}})

@b{Since @i{v1.7}}

This function clears the configuration @var{config}. All child settings of the
root setting are recursively destroyed. All other attributes of the configuration
are left unchanged.

@end deftypefun

@deftypefun int config_read (@w{config_t * @var{config}}, @w{FILE * @var{stream}})

This function reads and parses a configuration from the given
@var{stream} into the configuration object @var{config}. It returns
@code{CONFIG_TRUE} on success, or @code{CONFIG_FALSE} on failure; the
@code{config_error_text()}, @code{config_error_file()},
@code{config_error_line()}, and @code{config_error_type()} functions,
described below, can be used to obtain information about the error.

@end deftypefun

@deftypefun int config_read_file (@w{config_t * @var{config}}, @w{const char * @var{filename}})

This function reads and parses a configuration from the file named
@var{filename} into the configuration object @var{config}. It returns
@code{CONFIG_TRUE} on success, or @code{CONFIG_FALSE} on failure; the
@code{config_error_text()} and @code{config_error_line()} functions,
described below, can be used to obtain information about the error.

@end deftypefun

@deftypefun int config_read_string (@w{config_t * @var{config}}, @w{const char * @var{str}})

This function reads and parses a configuration from the string
@var{str} into the configuration object @var{config}. It returns
@code{CONFIG_TRUE} on success, or @code{CONFIG_FALSE} on failure; the
@code{config_error_text()} and @code{config_error_line()} functions,
described below, can be used to obtain information about the error.

@end deftypefun

@deftypefun void config_write (@w{const config_t * @var{config}}, @w{FILE * @var{stream}})

This function writes the configuration @var{config} to the given
@var{stream}.

@end deftypefun

@deftypefun int config_write_file (@w{config_t * @var{config}}, @w{const char * @var{filename}})

This function writes the configuration @var{config} to the file named
@var{filename}. It returns @code{CONFIG_TRUE} on success, or
@code{CONFIG_FALSE} on failure.

@end deftypefun

@deftypefun {const char *} config_error_text (@w{const config_t * @var{config}})
@deftypefunx {const char *} config_error_file (@w{const config_t * @var{config}})
@deftypefunx int config_error_line (@w{const config_t * @var{config}})

These functions, which are implemented as macros, return the text,
filename, and line number of the parse error, if one occurred during a
call to @code{config_read()}, @code{config_read_string()}, or
@code{config_read_file()}. Storage for the strings returned by
@code{config_error_text()} and @code{config_error_file()} are managed
by the library and released automatically when the configuration is
destroyed; these strings must not be freed by the caller. If the error
occurred in text that was read from a string or stream,
@code{config_error_file()} will return NULL.

@end deftypefun

@deftypefun config_error_t config_error_type (@w{const config_t * @var{config}})
@tindex config_error_t
This function, which is implemented as a macro, returns the type of
error that occurred during the last call to one of the read or write
functions. The @var{config_error_t} type is an enumeration with the
following values: @code{CONFIG_ERR_NONE}, @code{CONFIG_ERR_FILE_IO},
@code{CONFIG_ERR_PARSE}. These represent success, a file I/O error,
and a parsing error, respectively.

@end deftypefun

@deftypefun void config_set_include_dir (@w{config_t *@var{config}}, @w{const char *@var{include_dir}})
@deftypefunx {const char *} config_get_include_dir (@w{const config_t *@var{config}})

@code{config_set_include_dir()} specifies the include directory,
@var{include_dir}, relative to which the files specified in
@samp{@@include} directives will be located for the configuration
@var{config}. By default, there is no include directory, and all
include files are expected to be relative to the current working
directory. If @var{include_dir} is @code{NULL}, the default behavior
is reinstated.

For example, if the include directory is set to @file{/usr/local/etc},
the include directive @samp{@@include "configs/extra.cfg"} would include the
file @file{/usr/local/etc/configs/extra.cfg}.

@code{config_get_include_dir()} returns the current include directory for the
configuration @var{config}, or @code{NULL} if none is set.

@end deftypefun

@deftypefun void config_set_include_func (@w{config_include_fn_t @var{func}})

@b{Since @i{v1.7}}

Specifies the include function @var{func} to use when processing
include directives. If @var{func} is @code{NULL}, the default include function,
@code{config_default_include_func()}, will be reinstated.

@tindex config_include_fn_t
The type @i{config_include_fn_t} is a type alias
for a function whose signature is:

@deftypefun @w{const char **} func (@w{config_t *@var{config}}, @w{const char *@var{include_dir}}, @w{const char *@var{path}}, @w{const char **@var{error}})

The function receives the configuration @var{config}, the
configuration's current include directory @var{include_dir}, the
argument to the include directive @var{path}; and a pointer at which
to return an error message @var{error}.

On success, the function should return a @code{NULL}-terminated array
of paths. Any relative paths must be relative to the program's current
working directory. The contents of these files will be inlined at the point
of inclusion, in the order that the paths appear in the
array. Both the array and its elements should be heap allocated; the
library will take ownership of and eventually free the strings in the
array and the array itself.

On failure, the function should return @code{NULL} and set @var{*error} to a
static error string which should be used as the parse error for the
configuration; the library does not take ownership of or free this string.

The default include function, @code{config_default_include_func()},
simply returns a @code{NULL}-terminated array containing either a copy
of @var{path} if it's an absolute path, or a concatenation of
@var{include_dir} and @var{path} if it's a relative path.

@end deftypefun

Application-supplied include functions can perform custom tasks like wildcard
expansion or variable substitution. For example, consider the include directive:

@cartouche
@smallexample
@@include "configs/*.cfg"
@end smallexample
@end cartouche

The include function would be invoked with the path @samp{configs/*.cfg} and
could do wildcard expansion on that path, returning a list of paths to files
with the file extension @samp{.cfg} in the subdirectory @samp{configs}. Each of
these files would then be inlined at the location of the include directive.

Tasks like wildcard expansion and variable substitution are non-trivial to
implement and typically require platform-specific code. In the interests of
keeping the library as compact and platform-independent as possible,
implementations of such include functions are not included.

@end deftypefun

@deftypefun {unsigned short} config_get_float_precision(@w{config_t *@var{config}})
@deftypefunx void config_set_float_precision(@w{config_t *@var{config}}, @w{unsigned short @var{digits}})

@b{Since @i{v1.6}}

These functions get and set the number of decimal digits to output after the
radix character when writing the configuration to a file or stream.

Valid values for @var{digits} range from 0 (no decimals) to about 15
(implementation defined). This parameter has no effect on parsing.

The default float precision is 6.

@end deftypefun

@deftypefun int config_get_options (@w{config_t *@var{config}})
@deftypefunx void config_set_options (@w{config_t *@var{config}}, @w{int @var{options}})

These functions get and set the options for the configuration
@var{config}. The options affect how configurations are read and
written. The following options are defined:

@table @code

@item CONFIG_OPTION_AUTOCONVERT
Turning this option on enables number auto-conversion for
the configuration. 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 option is turned off.

@item CONFIG_OPTION_SEMICOLON_SEPARATORS
This option controls whether a semicolon (`;') is output after each setting
when the configuration is written to a file or stream. (The semicolon
separators are optional in the configuration syntax.) By default this
option is turned on.

@item CONFIG_OPTION_COLON_ASSIGNMENT_FOR_GROUPS
This option controls whether a colon (`:') is output between each
group setting's name and its value when the configuration is written to
a file or stream. If the option is turned off, an equals sign (`=') is
output instead. (These tokens are interchangeable in the configuration
syntax.) By default this option is turned on.

@item CONFIG_OPTION_COLON_ASSIGNMENT_FOR_NON_GROUPS
This option controls whether a colon (`:') is output between each
non-group setting's name and its value when the configuration is written
to a file or stream. If the option is turned off, an equals sign (`=')
is output instead. (These tokens are interchangeable in the configuration
syntax.) By default this option is turned off.

@item CONFIG_OPTION_OPEN_BRACE_ON_SEPARATE_LINE
This option controls whether an open brace (`@{') will be written on its own
line when the configuration is written to a file or stream. If the option is
turned off, the brace will be written at the end of the previous line.
By default this option is turned on.

@item CONFIG_OPTION_ALLOW_SCIENTIFIC_NOTATION
(@b{Since @i{v1.7}})
This option controls whether scientific notation may be used as appropriate
when writing floating point values (corresponding to @code{printf()}
@samp{%g} format) or should never be used (corresponding to @code{printf()}
@samp{%f} format). By default this option is turned off.

@item CONFIG_OPTION_FSYNC
(@b{Since @i{v1.7.1}})
This option controls whether the @code{config_write_file()} function performs
an @i{fsync} operation after writing the configuration and before closing the
file. By default this option is turned off.

@item CONFIG_OPTION_ALLOW_OVERRIDES
(@b{Since @i{v1.7.3}})
This option controls whether duplicate settings override previous settings
with the same name. If this option is turned off, duplicate settings are
rejected. By default this option is turned off.

@end table

@end deftypefun

@deftypefun int config_get_option (@w{config_t *@var{config}}, @w{int @var{option}})
@deftypefunx void config_set_option (@w{config_t *@var{config}}, @w{int @var{option}}, @w{int @var{flag}})

@b{Since @i{v1.7}}

These functions get and set the given @var{option} of the configuration
@var{config}. The option is enabled if @var{flag} is @code{CONFIG_TRUE} and
disabled if it is @code{CONFIG_FALSE}.

See @code{config_set_options()} above for the list of available options.

@end deftypefun


@deftypefun int config_get_auto_convert (@w{const config_t *@var{config}})
@deftypefunx void config_set_auto_convert (@w{config_t *@var{config}}, @w{int @var{flag}})

These functions get and set the @code{CONFIG_OPTION_AUTO_CONVERT}
option. They are obsoleted by the @code{config_set_option()} and
@code{config_get_option()} functions described above.

@end deftypefun

@deftypefun short config_get_default_format (@w{config_t * @var{config}})
@deftypefunx void config_set_default_format (@w{config_t * @var{config}}, @w{short @var{format}})

These functions, which are implemented as macros, get and set the
default external format for settings in the configuration
@var{config}. If a non-default format has not been set for a setting
with @code{config_setting_set_format()}, this configuration-wide
default format will be used instead when that setting is written to a
file or stream.

@end deftypefun

@deftypefun {unsigned short} config_get_tab_width (@w{const config_t * @var{config}})
@deftypefunx void config_set_tab_width (@w{config_t * @var{config}}, @w{unsigned short @var{width}})

These functions, which are implemented as macros, get and set the tab
width for the configuration @var{config}. The tab width affects the
formatting of the configuration when it is written to a file or
stream: each level of nesting is indented by @var{width} spaces, or
by a single tab character if @var{width} is 0. The tab width has no
effect on parsing.

Valid tab widths range from 0 to 15. The default tab width is 2.

@end deftypefun

@deftypefun int config_lookup_int (@w{const config_t * @var{config}}, @w{const char * @var{path}}, @w{int * @var{value}})
@deftypefunx int config_lookup_int64 (@w{const config_t * @var{config}}, @w{const char * @var{path}}, @w{long long * @var{value}})
@deftypefunx int config_lookup_float (@w{const config_t * @var{config}}, @w{const char * @var{path}}, @w{double * @var{value}})
@deftypefunx int config_lookup_bool (@w{const config_t * @var{config}}, @w{const char * @var{path}}, @w{int * @var{value}})
@deftypefunx int config_lookup_string (@w{const config_t * @var{config}}, @w{const char * @var{path}}, @w{const char ** @var{value}})

These functions look up the value of the setting in the configuration
@var{config} specified by the path @var{path}. They store the value of
the setting at @var{value} and return @code{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
@var{value} unmodified and return @code{CONFIG_FALSE}.

Storage for the string returned by @code{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.

@end deftypefun

@deftypefun {config_setting_t *} config_lookup (@w{const config_t * @var{config}}, @w{const char * @var{path}})

This function locates the setting in the configuration @var{config}
specified by the path @var{path}. It returns a pointer to the
@code{config_setting_t} structure on success, or @code{NULL} if the
setting was not found.

@end deftypefun

@deftypefun {config_setting_t *} config_setting_lookup (@w{const config_setting_t * @var{setting}}, @w{const char * @var{path}})

This function locates a setting by a path @var{path} relative to
the setting @var{setting}. It returns a pointer to the
@code{config_setting_t} structure on success, or @code{NULL} if the
setting was not found.

@end deftypefun

@deftypefun int config_setting_get_int (@w{const config_setting_t * @var{setting}})
@deftypefunx {long long} config_setting_get_int64 (@w{const config_setting_t * @var{setting}})
@deftypefunx double config_setting_get_float (@w{const config_setting_t * @var{setting}})
@deftypefunx int config_setting_get_bool (@w{const config_setting_t * @var{setting}})
@deftypefunx {const char *} config_setting_get_string (@w{const config_setting_t * @var{setting}})

These functions return the value of the given @var{setting}. If the
type of the setting does not match the type requested, a 0 or
@code{NULL} value is returned. Storage for the string returned by
@code{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.

@end deftypefun
@deftypefun int config_setting_set_int (@w{config_setting_t * @var{setting}}, @w{int @var{value}})
@deftypefunx int config_setting_set_int64 (@w{config_setting_t * @var{setting}}, @w{long long @var{value}})
@deftypefunx int config_setting_set_float (@w{config_setting_t * @var{setting}}, @w{double @var{value}})
@deftypefunx int config_setting_set_bool (@w{config_setting_t * @var{setting}}, @w{int @var{value}})
@deftypefunx int config_setting_set_string (@w{config_setting_t * @var{setting}}, @w{const char * @var{value}})

These functions set the value of the given @var{setting} to
@var{value}. On success, they return @code{CONFIG_TRUE}. If
the setting does not match the type of the value, they return
@code{CONFIG_FALSE}. @code{config_setting_set_string()} makes a copy
of the passed string @var{value}, so it may be subsequently freed or
modified by the caller without affecting the value of the setting.

@end deftypefun

@deftypefun int config_setting_lookup_int (@w{const config_setting_t * @var{setting}}, @w{const char * @var{name}}, @w{int * @var{value}})
@deftypefunx int config_setting_lookup_int64 (@w{const config_setting_t * @var{setting}}, @w{const char * @var{name}}, @w{long long * @var{value}})
@deftypefunx int config_setting_lookup_float (@w{const config_setting_t * @var{setting}}, @w{const char * @var{name}}, @w{double * @var{value}})
@deftypefunx int config_setting_lookup_bool (@w{const config_setting_t * @var{setting}}, @w{const char * @var{name}}, @w{int * @var{value}})
@deftypefunx int config_setting_lookup_string (@w{const config_setting_t * @var{setting}}, @w{const char * @var{name}}, @w{const char ** @var{value}})

These functions look up the value of the child setting named
@var{name} of the setting @var{setting}. They store the value at
@var{value} and return @code{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 @var{value} unmodified
and return @code{CONFIG_FALSE}.

Storage for the string returned by @code{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.

@end deftypefun

@deftypefun short config_setting_get_format (@w{config_setting_t * @var{setting}})
@deftypefunx int config_setting_set_format (@w{config_setting_t * @var{setting}}, @w{short @var{format}})

These functions get and set the external format for the setting @var{setting}.

@tindex SettingFormat
@cindex format

The @var{format} must be one of the constants
@code{CONFIG_FORMAT_DEFAULT} or @code{CONFIG_FORMAT_HEX}. All settings
support the @code{CONFIG_FORMAT_DEFAULT} format. The
@code{CONFIG_FORMAT_HEX} format specifies hexadecimal formatting for
integer values, and hence only applies to settings of type
@code{CONFIG_TYPE_INT} and @code{CONFIG_TYPE_INT64}.  If @var{format}
is invalid for the given setting, it is ignored.

If a non-default format has not been set for the setting, @code{config_setting_get_format()} returns the default format for the configuration, as set by @code{config_set_default_format()}.

@code{config_setting_set_format()} returns @code{CONFIG_TRUE} on
success and @code{CONFIG_FALSE} on failure.

@end deftypefun


@deftypefun {config_setting_t *} config_setting_get_member (@w{config_setting_t * @var{setting}}, @w{const char * @var{name}})

This function fetches the child setting named @var{name} from the group
@var{setting}. It returns the requested setting on success, or
@code{NULL} if the setting was not found or if @var{setting} is not a
group.

@end deftypefun

@deftypefun {config_setting_t *} config_setting_get_elem (@w{const config_setting_t * @var{setting}}, @w{unsigned int @var{index}})

This function fetches the element at the given index @var{index} in the
setting @var{setting}, which must be an array, list, or group. It returns the
requested setting on success, or @code{NULL} if @var{index} is out of
range or if @var{setting} is not an array, list, or group.

@end deftypefun

@deftypefun int config_setting_get_int_elem (@w{const config_setting_t * @var{setting}}, @w{int @var{index}})
@deftypefunx {long long} config_setting_get_int64_elem (@w{const config_setting_t * @var{setting}}, @w{int @var{index}})
@deftypefunx double config_setting_get_float_elem (@w{const config_setting_t * @var{setting}}, @w{int @var{index}})
@deftypefunx int config_setting_get_bool_elem (@w{const config_setting_t * @var{setting}}, @w{int @var{index}})
@deftypefunx {const char *} config_setting_get_string_elem (@w{const config_setting_t * @var{setting}}, @w{int @var{index}})

These functions return the value at the specified index @var{index} in the
setting @var{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
@var{index} is out of range, they return 0 or @code{NULL}. Storage for
the string returned by @code{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.
@end deftypefun

@deftypefun {config_setting_t *} config_setting_set_int_elem (@w{config_setting_t * @var{setting}}, @w{int @var{index}}, @w{int @var{value}})
@deftypefunx {config_setting_t *} config_setting_set_int64_elem (@w{config_setting_t * @var{setting}}, @w{int @var{index}}, @w{long long @var{value}})
@deftypefunx {config_setting_t *} config_setting_set_float_elem (@w{config_setting_t * @var{setting}}, @w{int @var{index}}, @w{double @var{value}})
@deftypefunx {config_setting_t *} config_setting_set_bool_elem (@w{config_setting_t * @var{setting}}, @w{int @var{index}}, @w{int @var{value}})
@deftypefunx {config_setting_t *} config_setting_set_string_elem (@w{config_setting_t * @var{setting}}, @w{int @var{index}}, @w{const char * @var{value}})

These functions set the value at the specified index @var{index} in the
setting @var{setting} to @var{value}. If @var{index} 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 @var{index} is out of range, they return
@code{NULL}. @code{config_setting_set_string_elem()} makes a copy of
the passed string @var{value}, so it may be subsequently freed or
modified by the caller without affecting the value of the setting.
@end deftypefun

@deftypefun {config_setting_t *} config_setting_add (@w{config_setting_t * @var{parent}}, @w{const char * @var{name}}, @w{int @var{type}})

This function adds a new child setting or element to the setting
@var{parent}, which must be a group, array, or list. If @var{parent}
is an array or list, the @var{name} parameter is ignored and may be
@code{NULL}.

The function returns the new setting on success, or @code{NULL} if
@var{parent} is not a group, array, or list; or if there is already a
child setting of @var{parent} named @var{name}; or if @var{type} is
invalid. If @var{type} is a scalar type, the new setting will have a
default value of 0, 0.0, @code{false}, or @code{NULL}, as appropriate.
@end deftypefun

@deftypefun int config_setting_remove (@w{config_setting_t * @var{parent}}, @w{const char * @var{name}})

This function removes and destroys the setting named @var{name} from
the parent setting @var{parent}, which must be a group. Any child
settings of the setting are recursively destroyed as well.

The @var{name} parameter can also specify a setting @i{path} relative to 
the provided @var{parent}.
(In that case, the setting will be looked up and removed.)

The function returns @code{CONFIG_TRUE} on success. If @var{parent} is
not a group, or if it has no setting with the given name, it returns
@code{CONFIG_FALSE}.

@end deftypefun

@deftypefun int config_setting_remove_elem (@w{config_setting_t * @var{parent}}, @w{unsigned int @var{index}})

This function removes the child setting at the given index @var{index} from
the setting @var{parent}, which must be a group, list, or array. Any
child settings of the removed setting are recursively destroyed as
well.

The function returns @code{CONFIG_TRUE} on success. If @var{parent} is
not a group, list, or array, or if @var{index} is out of range, it returns
@code{CONFIG_FALSE}.

@end deftypefun

@deftypefun {config_setting_t *} config_root_setting (@w{const config_t * @var{config}})

This function, which is implemented as a macro, returns the root setting for the configuration @var{config}. The root setting is a group.

@end deftypefun

@deftypefun {const char *} config_setting_name (@w{const config_setting_t * @var{setting}})

This function returns the name of the given @var{setting}, or
@code{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.

@end deftypefun

@deftypefun {config_setting_t *} config_setting_parent (@w{const config_setting_t * @var{setting}})

This function returns the parent setting of the given @var{setting},
or @code{NULL} if @var{setting} is the root setting.

@end deftypefun

@deftypefun int config_setting_is_root (@w{const config_setting_t * @var{setting}})

This function returns @code{CONFIG_TRUE} if the given @var{setting} is
the root setting, and @code{CONFIG_FALSE} otherwise.

@end deftypefun

@deftypefun int config_setting_index (@w{const config_setting_t * @var{setting}})

This function returns the index of the given @var{setting} within its
parent setting. If @var{setting} is the root setting, this function
returns -1.

@end deftypefun

@deftypefun int config_setting_length (@w{const config_setting_t * @var{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.

@end deftypefun

@deftypefun int config_setting_type (@w{const config_setting_t * @var{setting}})

This function returns the type of the given @var{setting}. The return
value is one of the constants
@code{CONFIG_TYPE_INT}, @code{CONFIG_TYPE_INT64}, @code{CONFIG_TYPE_FLOAT},
@code{CONFIG_TYPE_STRING}, @code{CONFIG_TYPE_BOOL},
@code{CONFIG_TYPE_ARRAY}, @code{CONFIG_TYPE_LIST}, or @code{CONFIG_TYPE_GROUP}.

@end deftypefun

@deftypefun int config_setting_is_group (@w{const config_setting_t * @var{setting}})
@deftypefunx int config_setting_is_array (@w{const config_setting_t * @var{setting}})
@deftypefunx int config_setting_is_list (@w{const config_setting_t * @var{setting}})

These convenience functions, which are implemented as macros, test if
the setting @var{setting} is of a given type. They return
@code{CONFIG_TRUE} or @code{CONFIG_FALSE}.

@end deftypefun

@deftypefun int config_setting_is_aggregate (@w{const config_setting_t * @var{setting}})
@deftypefunx int config_setting_is_scalar (@w{const config_setting_t * @var{setting}})
@deftypefunx int config_setting_is_number (@w{const config_setting_t * @var{setting}})

@cindex aggregate value
These convenience functions, some of which are implemented as macros, test if
the setting @var{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 @code{CONFIG_TRUE} or
@code{CONFIG_FALSE}.

@end deftypefun

@deftypefun {const char *} config_setting_source_file (@w{const config_setting_t * @var{setting}})

This function returns the name of the file from which the setting
@var{setting} was read, or NULL if the setting was not read from a
file. This information is useful for reporting application-level
errors. Storage for the returned string is managed by the library and
released automatically when the configuration is destroyed; the
string must not be freed by the caller.

@end deftypefun

@deftypefun {unsigned int} config_setting_source_line (@w{const config_setting_t * @var{setting}})

This function returns the line number of the configuration file or
stream at which the setting @var{setting} was read, or 0 if no line
number is available. This information is useful for reporting
application-level errors.

@end deftypefun

@deftypefun void config_set_hook (@w{config_t * @var{config}}, @w{void * @var{hook}})
@deftypefunx {void *} config_get_hook (@w{const config_t * @var{config}})

@b{Since @i{v1.7}}

@cindex hook
These functions make it possible to attach arbitrary data to a configuration
structure, for instance a ``wrapper'' or ``peer'' object written in
another programming language.

@end deftypefun

@deftypefun void config_setting_set_hook (@w{config_setting_t * @var{setting}}, @w{void * @var{hook}})
@deftypefunx {void *} config_setting_get_hook (@w{const config_setting_t * @var{setting}})

@cindex hook
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 @code{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.

@end deftypefun

@deftypefun void config_set_destructor (@w{config_t * @var{config}}, @w{void (* @var{destructor})(void *)})

@cindex destructor function
This function assigns the destructor function @var{destructor} for the
configuration @var{config}. This function accepts a single @code{void
*} argument and has no return value. See
@code{config_setting_set_hook()} above for more information.

@end deftypefun

@node The C++ API, Example Programs, The C API, Top
@comment  node-name,  next,  previous,  up
@chapter The C++ API

@tindex Config
@tindex Setting
This chapter describes the C++ library API. The class @code{Config}
represents a configuration, and the class @code{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.

@tindex ConfigException
The library defines a group of exceptions, all of which extend the
common base exception @code{ConfigException}.

@tindex SettingTypeException
A @code{SettingTypeException} is thrown when the type of a setting's
value does not match the type requested.

@deftypemethod SettingTypeException {} SettingTypeException (@w{const Setting &@var{setting}})
@deftypemethodx SettingTypeException {} SettingTypeException (@w{const Setting &@var{setting}}, @w{int @var{index}})
@deftypemethodx SettingTypeException {} SettingTypeException (@w{const Setting &@var{setting}}, @w{const char *@var{name}})

These methods construct @code{SettingTypeException} objects for the given @var{setting} and/or member @var{index} or @var{name}.

@end deftypemethod

@tindex SettingNotFoundException
A @code{SettingNotFoundException} is thrown when a setting is not found.

@deftypemethod SettingNotFoundException {} SettingNotFoundException (@w{const Setting &@var{setting}}, @w{int @var{index}})
@deftypemethodx SettingNotFoundException {} SettingNotFoundException (@w{const Setting &@var{setting}}, @w{const char *@var{name}})
@deftypemethodx SettingNotFoundException {} SettingNotFoundException (@w{const char *@var{path}})

These methods construct @code{SettingTypeException} objects for the given @var{setting} and member @var{index} or @var{name}, or path @var{path}.

@end deftypemethod

@tindex SettingNameException
A @code{SettingNameException} is thrown when an attempt is made to add
a new setting with a non-unique or invalid name.

@deftypemethod SettingNameException {} SettingNameException (@w{const Setting &@var{setting}}, @w{const char *@var{name}})

This method constructs a @code{SettingNameExcpetion} object for the given @var{setting} and member name @var{name}.

@end deftypemethod

@tindex ParseException
A @code{ParseException} is thrown when a parse error occurs while
reading a configuration from a stream.

@deftypemethod ParseException {} ParseException (@w{const char *@var{file}}, @w{int @var{line}}, @w{const char *@var{error}})

This method constructs a @code{ParseException} object with the given filename @var{file}, line number @var{line}, and error message @var{error}.

@end deftypemethod

@tindex FileIOException
A @code{FileIOException} is thrown when an I/O error occurs while
reading/writing a configuration from/to a file.

@tindex SettingException
@code{SettingTypeException}, @code{SettingNotFoundException}, and
@code{SettingNameException} all extend the common base
exception @code{SettingException}, which provides the following method:

@deftypemethod SettingException {const char *} getPath () const

This method returns the path to the setting associated with the exception, or
@code{NULL} if there is no applicable path.

@end deftypemethod

The remainder of this chapter describes the methods for manipulating
configurations and configuration settings.

@deftypemethod Config {} Config ()
@deftypemethodx Config {} ~Config ()

These methods create and destroy @code{Config} objects. 

@end deftypemethod

@deftypemethod Config void clear ()

@b{Since @i{v1.7}}

This method clears the configuration. All child settings of the root
setting are recursively destroyed. All other attributes of the
configuration are left unchanged.

@end deftypemethod

@deftypemethod Config void read (@w{FILE * @var{stream}})
@deftypemethodx Config void write (@w{FILE * @var{stream}}) const

The @code{read()} method reads and parses a configuration from the given
@var{stream}. A @code{ParseException} is thrown if a parse error occurs.

The @code{write()} method writes the configuration to the given @var{stream}.

@end deftypemethod

@deftypemethod Config void readFile (@w{const char * @var{filename}})
@deftypemethodx Config void readFile (@w{const std::string &@var{filename}})

The @code{readFile()} method reads and parses a configuration from the
file named @var{filename}. A @code{ParseException} is thrown if a
parse error occurs. A @code{FileIOException} is thrown if the file
cannot be read.

@end deftypemethod

@deftypemethod Config void writeFile (@w{const char * @var{filename}})
@deftypemethodx Config void writeFile (@w{const std::string &@var{filename}})

The @code{writeFile()} method writes the configuration to the file
named @var{filename}. A @code{FileIOException} is thrown if the file cannot
be written.

@end deftypemethod

@deftypemethod Config void readString (@w{const char * @var{str}})
@deftypemethodx Config void readString (@w{const std::string &@var{str}})

These methods read and parse a configuration from the string
@var{str}. A @code{ParseException} is thrown if a parse error occurs.

@end deftypemethod

@deftypemethod ParseException {const char *} getError () const
@deftypemethodx ParseException {const char *} getFile () const
@deftypemethodx ParseException int getLine () const

If a call to @code{readFile()}, @code{readString()}, or @code{read()}
resulted in a @code{ParseException}, these methods can be called on
the exception object to obtain the text, filename, and line number of
the parse error. Storage for the strings returned by @code{getError()}
and @code{getFile()} are managed by the library; the strings must not
be freed by the caller.

@end deftypemethod

@deftypemethod Config void setIncludeDir (@w{const char *@var{includeDir}})
@deftypemethodx Config {const char *} getIncludeDir () const

The @code{setIncludeDir()} method specifies the include directory,
@var{includeDir}, relative to which the files specified in
@samp{@@include} directives will be located for the configuration. By
default, there is no include directory, and all include files are
expected to be relative to the current working directory. If
@var{includeDir} is @code{NULL}, the default behavior is reinstated.

For example, if the include directory is set to @file{/usr/local/etc},
the include directive @samp{@@include "configs/extra.cfg"} would include the
file @file{/usr/local/etc/configs/extra.cfg}.

@code{getIncludeDir()} returns the current include directory for the
configuration, or @code{NULL} if none is set.

@end deftypemethod

@deftypemethod Config {virtual const char **} evaluateIncludePath (@w{const char * @var{path}}, @w{const char ** @var{error}})

@b{Since @i{v1.7}}

This method is called to evaluate the path of an @code{@@include} directive.
The @var{path} is the literal path argument of the directive. The method may
be overridden in a subclass to perform tasks like wildcard expansion and
variable substitution.

On success, the method should return a @code{NULL}-terminated array of paths.
Any relative paths must be relative to the program's current working directory.
The contents of these files will be inlined at the point of inclusion, in the
order that the paths appear in the array. Both the array and its elements should
be heap allocated; the library will take ownership of and eventually free the
strings in the array and the array itself.

On failure, the function should return @code{NULL} and set @var{*error} to a
static error string which should be used as the parse error for the
configuration; the library does not take ownership of or free this string.

The default implementation simply returns a @code{NULL}-terminated array
containing either a copy of @var{path} if it's an absolute path, or a
concatenation of the include directory and @var{path} if it's a relative path.

For more information see @code{config_set_include_func()} above.

@end deftypemethod

@deftypemethod Config int getOptions () const
@deftypemethodx Config void setOptions (int @var{options})

@tindex Config::Option
These methods get and set the options for the configuration. The
options affect how configurations are read and written. The parameter
@var{options} should be a bitwise-OR of the following @var{Config::Option}
enumeration values:

@table @code

@item Config::OptionAutoConvert
Turning this option on enables number auto-conversion for
the configuration. 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 option is turned off.

@item Config::OptionSemicolonSeparators
This option controls whether a semicolon (`;') is output after each setting
when the configuration is written to a file or stream. (The semicolon
separators are optional in the configuration syntax.) By default this
option is turned on.

@item Config::OptionColonAssignmentForGroups
This option controls whether a colon (`:') is output between each
group setting's name and its value when the configuration is written to
a file or stream. If the option is turned off, an equals sign (`=') is
output instead. (These tokens are interchangeable in the configuration
syntax.) By default this option is turned on.

@item Config::OptionColonAssignmentForNonGroups
This option controls whether a colon (`:') is output between each
non-group setting's name and its value when the configuration is written
to a file or stream. If the option is turned off, an equals sign (`=')
is output instead. (These tokens are interchangeable in the configuration
syntax.) By default this option is turned off.

@item Config::OptionOpenBraceOnSeparateLine
This option controls whether an open brace (`@{') will be written on its own
line when the configuration is written to a file or stream. If the option is
turned off, the brace will be written at the end of the previous line.
By default this option is turned on.

@item Config::OptionAllowScientificNotation
(@b{Since @i{v1.7}})
This option controls whether scientific notation may be used as appropriate
when writing floating point values (corresponding to @code{printf()}
@samp{%g} format) or should never be used (corresponding to @code{printf()}
@samp{%f} format). By default this option is turned off.

@item Config::OptionFsync
(@b{Since @i{v1.7.1}})
This option controls whether the @code{writeFile()} method performs an @i{fsync}
operation after writing the configuration and before closing the file. By
default this option is turned off.

@item Config::OptionAllowOverrides
(@b{Since @i{v1.7.3}})
This option controls whether duplicate settings override previous settings
with the same name. If this option is turned off, duplicate settings are
rejected. By default this option is turned off.

@end table

@end deftypemethod

@deftypemethod Config bool getOption (@w{Config::Option @var{option}}) const
@deftypemethodx Config void setOption (@w{Config::Option @var{option}}, @w{bool @var{flag}})

@b{Since @i{v1.7}}

These methods get and set the option @var{option} for the configuration. The
option is enabled if @var{flag} is @code{true} and disabled if it is
@code{false}.

See @code{setOptions()} above for the list of available options.

@end deftypemethod

@deftypemethod Config bool getAutoConvert () const
@deftypemethodx Config void setAutoConvert (bool @var{flag})

These methods get and set the @code{OptionAutoConvert} option. They
are obsoleted by the @code{setOption()} and @code{getOption()}
methods described above.

@end deftypemethod

@deftypemethod Config Setting::Format getDefaultFormat () const
@deftypemethodx Config void setDefaultFormat (@w{Setting::Format @var{format}})

These methods get and set the default external format for settings in
the configuration. If a non-default format has not been set for a
setting with @code{Setting::setFormat()}, this configuration-wide
default format will be used instead when that setting is written to a
file or stream.

@end deftypemethod

@deftypemethod Config {unsigned short} getTabWidth () const
@deftypemethodx Config void setTabWidth (@w{unsigned short @var{width}})

These methods get and set the tab width for the configuration. The tab
width affects the formatting of the configuration when it is written
to a file or stream: each level of nesting is indented by @var{width}
spaces, or by a single tab character if @var{width} is 0. The tab
width has no effect on parsing.

Valid tab widths range from 0 to 15. The default tab width is 2.

@end deftypemethod

@deftypemethod Config {unsigned short} getFloatPrecision () const
@deftypemethodx Config void setFloatPrecision (@w{unsigned short @var{width}})

These methods get and set the float precision for the configuration.
This parameter influences the formatting of floating point settings in
the configuration when it is written to a file or stream.
Float precision has no effect on parsing.

Valid precisions range from 0 to about 15 (implementation dependent),
though the library will accept and store values up to 255.

@end deftypemethod

@deftypemethod Config {Setting &} getRoot () const

This method returns the root setting for the configuration, which is a group.

@end deftypemethod

@deftypemethod Config {Setting &} lookup (@w{const std::string &@var{path}}) const
@deftypemethodx Config {Setting &} lookup (@w{const char * @var{path}}) const

These methods locate the setting specified by the path @var{path}. If
the requested setting is not found, a @code{SettingNotFoundException} is
thrown.

@end deftypemethod
@deftypemethod Config bool exists (@w{const std::string &@var{path}}) const
@deftypemethodx Config bool exists (@w{const char *@var{path}}) const

These methods test if a setting with the given @var{path} exists in
the configuration. They return @code{true} if the setting exists, and
@code{false} otherwise. These methods do not throw exceptions.

@end deftypemethod

@deftypemethod Config bool lookupValue (@w{const char *@var{path}}, @w{bool &@var{value}}) const
@deftypemethodx Config bool lookupValue (@w{const std::string &@var{path}}, @w{bool &@var{value}}) const

@deftypemethodx Config bool lookupValue (@w{const char *@var{path}}, @w{int &@var{value}}) const
@deftypemethodx Config bool lookupValue (@w{const std::string &@var{path}}, @w{int &@var{value}}) const

@deftypemethodx Config bool lookupValue (@w{const char *@var{path}}, @w{unsigned int &@var{value}}) const
@deftypemethodx Config bool lookupValue (@w{const std::string &@var{path}}, @w{unsigned int &@var{value}}) const

@deftypemethodx Config bool lookupValue (@w{const char *@var{path}}, @w{long long &@var{value}}) const
@deftypemethodx Config bool lookupValue (@w{const std::string &@var{path}}, @w{long long &@var{value}}) const

@deftypemethodx Config bool lookupValue (@w{const char *@var{path}}, @w{float &@var{value}}) const
@deftypemethodx Config bool lookupValue (@w{const std::string &@var{path}}, @w{float &@var{value}}) const

@deftypemethodx Config bool lookupValue (@w{const char *@var{path}}, @w{double &@var{value}}) const
@deftypemethodx Config bool lookupValue (@w{const std::string &@var{path}}, @w{double &@var{value}}) const

@deftypemethodx Config bool lookupValue (@w{const char *@var{path}}, @w{const char *&@var{value}}) const
@deftypemethodx Config bool lookupValue (@w{const std::string &@var{path}}, @w{const char *&@var{value}}) const

@deftypemethodx Config bool lookupValue (@w{const char *@var{path}}, @w{std::string &@var{value}}) const
@deftypemethodx Config bool lookupValue (@w{const std::string &@var{path}}, @w{std::string &@var{value}}) const

These are convenience methods for looking up the value of a setting
with the given @var{path}. If the setting is found and is of an
appropriate type, the value is stored in @var{value} and the method
returns @code{true}. Otherwise, @var{value} is left unmodified and the
method returns @code{false}. These methods do not throw exceptions.

Storage for @w{@i{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 @code{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:

@sp 1
@cartouche
@smallexample
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
@}
@end smallexample
@end cartouche

This approach also takes advantage of the short-circuit evaluation rules
of C++, e.g., if the first lookup fails (returning @code{false}), the
remaining lookups are skipped entirely.

@end deftypemethod

@deftypemethod Setting {} {operator bool ()} const
@deftypemethodx Setting {} {operator int ()} const
@deftypemethodx Setting {} {operator unsigned int ()} const
@deftypemethodx Setting {} {operator long ()} const
@deftypemethodx Setting {} {operator unsigned long ()} const
@deftypemethodx Setting {} {operator long long ()} const
@deftypemethodx Setting {} {operator unsigned long long ()} const
@deftypemethodx Setting {} {operator float ()} const
@deftypemethodx Setting {} {operator double ()} const
@deftypemethodx Setting {} {operator const char * ()} const
@deftypemethodx Setting {} {operator std::string ()} const
@deftypemethodx Setting {const char *} c_str () const

These cast operators allow a @code{Setting} object to be assigned to a
variable of type @i{bool} if it is of type @code{TypeBoolean};
@i{int}, @i{unsigned int}; @code{long long} or @code{unsigned long long} if
it is of type @code{TypeInt64}, @i{float} or @i{double} if it is of type
@code{TypeFloat}; or @w{@i{const char *}} or @i{std::string} if it is
of type @code{TypeString}.

Values of type @code{TypeInt} or @code{TypeInt64} may be assigned to
variables of type @i{long}, or @i{unsigned long}, depending on the
sizes of those types on the host system.

Storage for @w{@i{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 @code{std::string} is suggested.

The following examples demonstrate this usage:

@cartouche
@smallexample
long width = config.lookup("application.window.size.w");

bool splashScreen = config.lookup("application.splash_screen");

std::string title = config.lookup("application.window.title");
@end smallexample
@end cartouche

Note that certain conversions can lead to loss of precision or
clipping of values, e.g., assigning a negative value to an @i{unsigned
int} (in which case the value will be treated as 0), or a
double-precision value to a @i{float}. The library does not treat
these lossy conversions as errors.

Perhaps surprisingly, the following code in particular will cause a
compiler error:

@cartouche
@smallexample
std::string title;
.
.
.
title = config.lookup("application.window.title");
@end smallexample
@end cartouche

This is because the assignment operator of @code{std::string} is being
invoked with a @code{Setting &} as an argument. The compiler is unable
to make an implicit conversion because both the @code{const char *}
and the @code{std::string} cast operators of @code{Setting} are
equally appropriate. This is not a bug in @i{libconfig}; providing
only the @code{const char *} cast operator would resolve this
particular ambiguity, but would cause assignments to
@code{std::string} like the one in the previous example to produce a
compiler error. (To understand why, see section 11.4.1 of @i{The C++
Programming Language}.)

The solution to this problem is to use an explicit conversion that
avoids the construction of an intermediate @code{std::string} object,
as follows:

@cartouche
@smallexample
std::string title;
.
.
.
title = (const char *)config.lookup("application.window.title");
@end smallexample
@end cartouche

Or, alternatively, use the @code{c_str()} method, which has the same effect:

@cartouche
@smallexample
std::string title;
.
.
.
title = config.lookup("application.window.title").c_str();
@end smallexample
@end cartouche

If the assignment is invalid due to a type mismatch, a
@code{SettingTypeException} is thrown.

@end deftypemethod

@deftypemethod Setting {Setting &} operator= (@w{bool @var{value}})
@deftypemethodx Setting {Setting &} operator= (@w{int @var{value}})
@deftypemethodx Setting {Setting &} operator= (@w{long @var{value}})
@deftypemethodx Setting {Setting &} operator= (@w{const long long &@var{value}})
@deftypemethodx Setting {Setting &} operator= (@w{float @var{value}})
@deftypemethodx Setting {Setting &} operator= (@w{const double &@var{value}})
@deftypemethodx Setting {Setting &} operator= (@w{const char *@var{value}})
@deftypemethodx Setting {Setting &} operator= (@w{const std::string &@var{value}})

These assignment operators allow values of type @i{bool}, @i{int},
@i{long}, @i{long long}, @i{float}, @i{double}, @i{const char *}, and
@i{std::string} to be assigned to a setting. In the case of strings,
the library makes a copy of the passed string @var{value}, so it may
be subsequently freed or modified by the caller without affecting the
value of the setting.

The following example code looks up a (presumably) integer setting
and changes its value:

@cartouche
@smallexample
Setting &setting = config.lookup("application.window.size.w");
setting = 1024;
@end smallexample
@end cartouche

If the assignment is invalid due to a type mismatch, a
@code{SettingTypeException} is thrown.

@end deftypemethod

@deftypemethod Setting {Setting &} {operator[]} (@w{int @var{index}}) const
@deftypemethodx Setting {Setting &} {operator[]} (@w{const std::string &@var{name}}) const
@deftypemethodx Setting {Setting &} {operator[]} (@w{const char *@var{name}}) const

A @code{Setting} object may be subscripted with an integer index
@var{index} if it is an array or list, or with either a string
@var{name} or an integer index @var{index} if it is a group. For example,
the following code would produce the string @samp{Last Name} when
applied to the example configuration in @ref{Configuration Files}.

@cartouche
@smallexample
Setting& setting = config.lookup("application.misc");
const char *s = setting["columns"][0];
@end smallexample
@end cartouche

If the setting is not an array, list, or group, a
@code{SettingTypeException} is thrown. If the subscript (@var{index}
or @var{name}) does not refer to a valid element, a
@code{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.

@end deftypemethod

@deftypemethod Setting {Setting &} lookup (@w{const char * @var{path}}) const
@deftypemethodx Setting {Setting &} lookup (@w{const std::string &@var{path}}) const

These methods locate a setting by a path @var{path} relative to
this setting. If requested setting is not found, a
@code{SettingNotFoundException} is thrown.

@end deftypemethod

@deftypemethod Setting bool lookupValue (@w{const char *@var{name}}, @w{bool &@var{value}}) const
@deftypemethodx Setting bool lookupValue (@w{const std::string &@var{name}}, @w{bool &@var{value}}) const

@deftypemethodx Setting bool lookupValue (@w{const char *@var{name}}, @w{int &@var{value}}) const
@deftypemethodx Setting bool lookupValue (@w{const std::string &@var{name}}, @w{int &@var{value}}) const

@deftypemethodx Setting bool lookupValue (@w{const char *@var{name}}, @w{unsigned int &@var{value}}) const
@deftypemethodx Setting bool lookupValue (@w{const std::string &@var{name}}, @w{unsigned int &@var{value}}) const

@deftypemethodx Setting bool lookupValue (@w{const char *@var{name}}, @w{long long &@var{value}}) const
@deftypemethodx Setting bool lookupValue (@w{const std::string &@var{name}}, @w{long long &@var{value}}) const

@deftypemethodx Setting bool lookupValue (@w{const char *@var{name}}, @w{unsigned long long &@var{value}}) const
@deftypemethodx Setting bool lookupValue (@w{const std::string &@var{name}}, @w{unsigned long long &@var{value}}) const

@deftypemethodx Setting bool lookupValue (@w{const char *@var{name}}, @w{float &@var{value}}) const
@deftypemethodx Setting bool lookupValue (@w{const std::string &@var{name}}, @w{float &@var{value}}) const

@deftypemethodx Setting bool lookupValue (@w{const char *@var{name}}, @w{double &@var{value}}) const
@deftypemethodx Setting bool lookupValue (@w{const std::string &@var{name}}, @w{double &@var{value}}) const

@deftypemethodx Setting bool lookupValue (@w{const char *@var{name}}, @w{const char *&@var{value}}) const
@deftypemethodx Setting bool lookupValue (@w{const std::string &@var{name}}, @w{const char *&@var{value}}) const

@deftypemethodx Setting bool lookupValue (@w{const char *@var{name}}, @w{std::string &@var{value}}) const
@deftypemethodx Setting bool lookupValue (@w{const std::string &@var{name}}, @w{std::string &@var{value}}) const

These are convenience methods for looking up the value of a child setting
with the given @var{name}. If the setting is found and is of an
appropriate type, the value is stored in @var{value} and the method
returns @code{true}. Otherwise, @var{value} is left unmodified and the
method returns @code{false}. These methods do not throw exceptions.

Storage for @w{@i{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 @code{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:

@sp 1
@cartouche
@smallexample
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
@}
@end smallexample
@end cartouche

This approach also takes advantage of the short-circuit evaluation
rules of C++, e.g., if the first lookup fails (returning @code{false}), the
remaining lookups are skipped entirely.

@end deftypemethod

@deftypemethod Setting {Setting &} add (@w{const std::string &@var{name}}, @w{Setting::Type @var{type}})
@deftypemethodx Setting {Setting &} add (@w{const char *@var{name}}, @w{Setting::Type @var{type}})

These methods add a new child setting with the given @var{name} and
@var{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
@code{SettingNameException} is thrown. If the setting is not a group,
a @code{SettingTypeException} is thrown.

Once a setting has been created, neither its name nor type can be
changed.

@end deftypemethod

@deftypemethod Setting {Setting &} add (@w{Setting::Type @var{type}})

This method adds a new element to the setting, which must be of type
@code{TypeArray} or @code{TypeList}. If the setting is an array which
currently has zero elements, the @var{type} parameter (which must be
@code{TypeInt}, @code{TypeInt64}, @code{TypeFloat}, @code{TypeBool},
or @code{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 @var{type} is a
scalar type, the new setting will have a default value of 0, 0.0,
@code{false}, or @code{NULL}, as appropriate.

The method throws a @code{SettingTypeException} if the setting is not
an array or list, or if @var{type} is invalid.

@end deftypemethod

@deftypemethod Setting void remove (@w{const std::string &@var{name}})
@deftypemethodx Setting void remove (@w{const char *@var{name}})

These methods remove the child setting with the given @var{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 @code{SettingTypeException} is
thrown.  If the setting does not have a child setting with the given
name, a @code{SettingNotFoundException} is thrown.

@end deftypemethod

@deftypemethod Setting void remove (@w{unsigned int @var{index}})

This method removes the child setting at the given index @var{index} 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
@code{SettingTypeException} is thrown.  If @var{index} is out of range,
a @code{SettingNotFoundException} is thrown.

@end deftypemethod

@deftypemethod Setting {const char *} getName () const

This method returns the name of the setting, or @code{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 @code{std::string}.

@end deftypemethod

@deftypemethod Setting {std::string} getPath () const

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.

@end deftypemethod

@deftypemethod Setting {Setting &} getParent () const

This method returns the parent setting of the setting. If the setting
is the root setting, a @code{SettingNotFoundException} is thrown.

@end deftypemethod

@deftypemethod Setting bool isRoot () const

This method returns @code{true} if the setting is the root setting, and
@code{false} otherwise.

@end deftypemethod

@deftypemethod Setting int getIndex () const

This method returns the index of the setting within its parent
setting. When applied to the root setting, this method returns -1.

@end deftypemethod

@deftypemethod Setting Setting::Type getType () const

@tindex Setting::Type
This method returns the type of the setting. The
@code{Setting::Type} enumeration consists of the following constants:
@code{TypeInt}, @code{TypeInt64}, @code{TypeFloat}, @code{TypeString},
@code{TypeBoolean}, @code{TypeArray}, @code{TypeList}, and
@code{TypeGroup}.

@end deftypemethod

@deftypemethod Setting Setting::Format getFormat () const
@deftypemethodx Setting void setFormat (@w{Setting::Format @var{format}})

These methods get and set the external format for the setting.

@tindex Setting::Format
The @var{Setting::Format} enumeration consists of the following
constants: @code{FormatDefault} and @code{FormatHex}. All settings
support the @code{FormatDefault} format. The @code{FormatHex} format
specifies hexadecimal formatting for integer values, and hence only
applies to settings of type @code{TypeInt} and @code{TypeInt64}. If
@var{format} is invalid for the given setting, it is ignored.

@end deftypemethod

@deftypemethod Setting bool exists (@w{const std::string &@var{name}}) const
@deftypemethodx Setting bool exists (@w{const char *@var{name}}) const

These methods test if the setting has a child setting with the given
@var{name}. They return @code{true} if the setting exists, and
@code{false} otherwise. These methods do not throw exceptions.

@end deftypemethod
@page
@deftypemethod Setting iterator begin ()
@deftypemethodx Setting iterator end ()
@deftypemethodx Setting const_iterator begin ()
@deftypemethodx Setting const_iterator end ()

These methods return STL-style iterators that can be used to enumerate
the child settings of a given setting. If the setting is not an array, list,
or group, they throw a @code{SettingTypeException}.

@end deftypemethod

@deftypemethod Setting int getLength () const

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.

@end deftypemethod

@deftypemethod Setting bool isGroup () const
@deftypemethodx Setting bool isArray () const
@deftypemethodx Setting bool isList () const

These convenience methods test if a setting is of a given type.

@end deftypemethod

@deftypemethod Setting bool isAggregate () const
@deftypemethodx Setting bool isScalar () const
@deftypemethodx Setting bool isNumber () const
@deftypemethodx Setting bool isString () const

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), of a number (integer, 64-bit
integer, or floating point), and of a string respectively.

@end deftypemethod

@deftypemethod Setting {const char *} getSourceFile () const

This method returns the name of the file from which the setting was
read, or NULL if the setting was not read from a file. This
information is useful for reporting application-level errors. Storage
for the returned string is managed by the library and released
automatically when the configuration is destroyed; the string must
not be freed by the caller.

@end deftypemethod

@deftypemethod Setting {unsigned int} getSourceLine () const

This method returns the line number of the configuration file or
stream at which the setting @var{setting} was read, or 0 if no line
number is available. This information is useful for reporting
application-level errors.

@end deftypemethod

@node Example Programs, Other Bindings and Implementations, The C++ API, Top
@comment  node-name,  next,  previous,  up
@chapter Example Programs

Practical example programs that illustrate how to use @i{libconfig}
from both C and C++ are included in the @file{examples} subdirectory
of the distribution. These examples include:

@table @file

@item examples/c/example1.c
An example C program that reads a configuration from an existing file
@file{example.cfg} (also located in @file{examples/c}) and displays
some of its contents.

@item examples/c++/example1.cpp
The C++ equivalent of @file{example1.c}.

@item examples/c/example2.c
An example C program that reads a configuration from an existing file
@file{example.cfg} (also located in @file{examples/c}), adds new
settings to the configuration, and writes the updated configuration to
another file.

@item examples/c++/example2.cpp
The C++ equivalent of @file{example2.c}

@item examples/c/example3.c
An example C program that constructs a new configuration in memory and writes it to a file.

@item examples/c++/example3.cpp
The C++ equivalent of @file{example3.c}

@item examples/c/example4.c
An example C program that uses a custom include function for processing
wildcard includes. Note that this code will not compile on Windows.

@end table

@node Other Bindings and Implementations, License, Example Programs, Top
@comment  node-name,  next,  previous,  up
@chapter Other Bindings and Implementations
@menu
* Bourne Shell::
* D::
* Haskell::
* Java::
* Lisp::
* Perl::
* Python::
* Ruby::
@end menu

Various open-source libraries have been written that provide access to
@i{libconfig}-style configuration files from other programming languages. Some
of these libraries are wrappers which add new language bindings for
@i{libconfig} while others are syntax-compatible reimplementations in other
languages.

Here is a list of some of these implementations.

@node Bourne Shell, D, , Other Bindings and Implementations
@comment  node-name,  next,  previous,  up
@section Bourne Shell

@L{}ukasz A. Grabowski's @i{ls-config} provides a means to read and write
values in @i{libconfig} configuration files from Bourne shell scripts. The
implementation is included in the @i{libconfig} git repository at
@url{https://github.com/hyperrealm/libconfig}, in the @file{contrib/ls-config}
subdirectory.

@node D, Haskell, Bourne Shell, Other Bindings and Implementations
@comment  node-name,  next,  previous,  up
@section D

Remi Thebault's @i{libconfig-d} is a port of @i{libconfig} to the D programming
language. It may be found at @url{https://code.dlang.org/packages/libconfig-d}.

@node Haskell, Java, D, Other Bindings and Implementations
@comment  node-name,  next,  previous,  up
@section Haskell

Matthew Peddie's @i{libconfig} provides Haskell bindings to
@i{libconfig}. It may be found at
@url{https://hackage.haskell.org/package/libconfig-0.3.0.0}.

@node Java, Lisp, Haskell, Other Bindings and Implementations
@comment  node-name,  next,  previous,  up
@section Java

Andrey V. Pleskach has a pure-Java implementation of @i{libconfig}. It may be
found on github at @url{https://github.com/willyborankin/libconfig}.

@node Lisp, Perl, Java, Other Bindings and Implementations
@comment  node-name,  next,  previous,  up
@section Lisp

Oleg Shalaev's @i{cl-libconfig} provides Common Lisp bindings for @i{libconfig}.
It may be found on github at @url{https://github.com/chalaev/cl-libconfig}.

@node Perl, Python, Lisp, Other Bindings and Implementations
@comment  node-name,  next,  previous,  up
@section Perl

The @i{Conf::Libconfig} module provides Perl bindings for @i{libconfig}. It may
be found on CPAN at @url{http://search.cpan.org/~cnangel/Conf-Libconfig-0.05/}
or on github at @url{https://github.com/cnangel/Conf-Libconfig}.

@node Python, Ruby, Perl, Other Bindings and Implementations
@comment  node-name,  next,  previous,  up
@section Python

Heiner Tholen's @i{pylibconfig2} is a Python library that is syntax-compatible
with @i{libconfig}. It may be found at
@url{https://pypi.python.org/pypi/pylibconfig2/0.1.2}.

@sp 1

Christian Aichinger's @i{libconf} is another pure-Python implementation with a
more permissive license. It may be found at
@url{https://pypi.python.org/pypi/libconf} or on github at
@url{https://github.com/Grk0/python-libconf}.

@sp 1

The @i{python-libconfig} wrapper provides Python bindings to @i{libconfig}. It
may be found on github at @url{https://github.com/cnangel/python-libconfig/}.

@node Ruby, , Python, Other Bindings and Implementations
@comment  node-name,  next,  previous,  up
@section Ruby

Christopher Mark Gore's @i{ruby-libconfig} is a Ruby library that provides Ruby
bindings for @i{libconfig}. It may be found at
@url{https://rubygems.org/gems/libconfig} or on github at
@url{https://github.com/cgore/ruby-libconfig}.

@sp 1

There is also another Ruby wrapper, @i{libconfig-ruby}, that is included in
the @i{libconfig} git repository at @url{https://github.com/hyperrealm/libconfig},
in the @file{contrib/libconfig-ruby} subdirectory.

@node License, Configuration File Grammar, Other Bindings and Implementations, Top
@comment  node-name,  next,  previous,  up
@appendix License

@include LGPL.texi

@node Configuration File Grammar, Function Index, License, Top
@comment  node-name,  next,  previous,  up
@appendix Configuration File Grammar

Below is the BNF grammar for configuration files. Comments and include
directives are not part of the grammar, so they are not included here.

@sp 1
@example
<configuration> ::=
      <setting-list>
    | <empty>

<setting-list> ::=
      <setting>
    | <setting-list> <setting>

<setting> ::=
      <name> ( ":" | "=" ) <value> ( ";" | "," | <empty> )

<value> ::=
      <scalar-value>
    | <array>
    | <list>
    | <group>

<value-list> ::=
      <value>
    | <value-list> "," <value>
    | <value-list> ","

<scalar-value> ::=
      <boolean>
    | <integer>
    | <integer64>
    | <hex>
    | <hex64>
    | <float>
    | <string>

<scalar-value-list> ::=
      <scalar-value>
    | <scalar-value-list> "," <scalar-value>
    | <scalar-value-list> ","

<array> ::=
      "[" ( <scalar-value-list> | <empty> ) "]"

<list> ::=
      "(" ( <value-list> | <empty> ) ")"

<group> ::=
      "@{" ( <setting-list> | <empty> ) "@}"

<empty> ::=
@end example

@sp 2
Terminals are defined below as regular expressions:
@sp 1

@multitable @columnfractions .2 .8
@item @code{<boolean>} @tab
@code{([Tt][Rr][Uu][Ee])|([Ff][Aa][Ll][Ss][Ee])}
@item @code{<string>} @tab
@code{\"([^\"\\]|\\.)*\"}
@item @code{<name>} @tab
@code{[A-Za-z\*][-A-Za-z0-9_\*]*}
@item @code{<integer>} @tab
@code{[-+]?[0-9]+}
@item @code{<integer64>} @tab
@code{[-+]?[0-9]+L(L)?}
@item @code{<hex>} @tab
@code{0[Xx][0-9A-Fa-f]+}
@item @code{<hex64>} @tab
@code{0[Xx][0-9A-Fa-f]+(L(L)?)?}
@item @code{<float>} @tab
@code{([-+]?([0-9]*)?\.[0-9]*([eE][-+]?[0-9]+)?)|([-+]([0-9]+)(\.[0-9]*)?[eE][-+]?[0-9]+)}
@end multitable

@sp 1

Note that adjacent strings are automatically concatenated. Non-printable
characters can be represented within strings using a sequence @samp{\xx},
representing the ASCII value as two hex digits.

@node Function Index, Type Index, Configuration File Grammar, Top
@comment  node-name,  next,  previous,  up
@unnumbered Function Index

@printindex fn

@node Type Index, Concept Index, Function Index, Top
@comment  node-name,  next,  previous,  up
@unnumbered Type Index

@printindex tp

@node Concept Index, , Type Index, Top
@comment  node-name,  next,  previous,  up
@unnumbered Concept Index

@printindex cp

@bye
