2453 lines
94 KiB
Plaintext
2453 lines
94 KiB
Plaintext
|
\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
|