aboutsummaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
authorJonathan McCrohan <jmccrohan@gmail.com>2011-12-01 23:47:41 +0000
committerJonathan McCrohan <jmccrohan@gmail.com>2011-12-01 23:47:41 +0000
commit1eaceca55c7e62892fd28bfbb5fc03240a48cee3 (patch)
tree7243fcd09c57e06e72b15f0044fd2c77babd7843 /contrib
parentd4b5ddf4bcacd692011f5a597025c38a1262d6ca (diff)
parent429e46051dba814e7d6c74368eb1bba550222cbe (diff)
downloadlibconfig-1eaceca55c7e62892fd28bfbb5fc03240a48cee3.tar.gz
Merge commit 'upstream/1.4.8'
Conflicts: debian/changelog debian/control debian/libconfig++9-dev.install debian/libconfig8.install debian/libconfig9-dev.install debian/rules
Diffstat (limited to '')
-rw-r--r--contrib/README3
-rwxr-xr-xcontrib/cmake/1_configure.sh5
-rwxr-xr-xcontrib/cmake/2_make.sh4
-rw-r--r--contrib/cmake/CMakeCache.txt292
-rw-r--r--contrib/cmake/CMakeFiles/CMakeCCompiler.cmake36
-rw-r--r--contrib/cmake/CMakeFiles/CMakeCXXCompiler.cmake36
-rwxr-xr-xcontrib/cmake/CMakeFiles/CMakeDetermineCompilerABI_C.binbin0 -> 8328 bytes
-rwxr-xr-xcontrib/cmake/CMakeFiles/CMakeDetermineCompilerABI_CXX.binbin0 -> 8466 bytes
-rw-r--r--contrib/cmake/CMakeFiles/CMakeOutput.log89
-rw-r--r--contrib/cmake/CMakeFiles/CMakeSystem.cmake15
-rw-r--r--contrib/cmake/CMakeFiles/CompilerIdC/CMakeCCompilerId.c182
-rwxr-xr-xcontrib/cmake/CMakeFiles/CompilerIdC/a.outbin0 -> 8337 bytes
-rw-r--r--contrib/cmake/CMakeFiles/CompilerIdCXX/CMakeCXXCompilerId.cpp169
-rwxr-xr-xcontrib/cmake/CMakeFiles/CompilerIdCXX/a.outbin0 -> 8466 bytes
-rw-r--r--contrib/cmake/CMakeFiles/cmake.check_cache1
-rw-r--r--contrib/cmake/CMakeLists.txt22
-rw-r--r--contrib/cmake/cmake_work/FindConfig++.cmake23
-rw-r--r--contrib/cmake/cmake_work/FindConfig.cmake23
-rw-r--r--contrib/cmake/cmake_work/cmake_uninstall.cmake.in36
-rw-r--r--contrib/cmake/src/CMakeLists.txt6
-rw-r--r--contrib/cmake/src/main.cpp13
-rw-r--r--contrib/copy_setting.c161
-rw-r--r--contrib/libconfig-ruby/README76
-rw-r--r--contrib/libconfig-ruby/Rakefile17
-rw-r--r--contrib/libconfig-ruby/ext/extconf.rb11
-rw-r--r--contrib/libconfig-ruby/ext/rconfig.c700
26 files changed, 1920 insertions, 0 deletions
diff --git a/contrib/README b/contrib/README
new file mode 100644
index 0000000..7437f0c
--- /dev/null
+++ b/contrib/README
@@ -0,0 +1,3 @@
+These files are not maintained by me; they are user
+contributions. They are not guaranteed to work with this release of
+libconfig.
diff --git a/contrib/cmake/1_configure.sh b/contrib/cmake/1_configure.sh
new file mode 100755
index 0000000..fe678f8
--- /dev/null
+++ b/contrib/cmake/1_configure.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+mkdir release
+cd release
+cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_BUILD_TYPE=Release ..
diff --git a/contrib/cmake/2_make.sh b/contrib/cmake/2_make.sh
new file mode 100755
index 0000000..1717d77
--- /dev/null
+++ b/contrib/cmake/2_make.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+cd release
+make \ No newline at end of file
diff --git a/contrib/cmake/CMakeCache.txt b/contrib/cmake/CMakeCache.txt
new file mode 100644
index 0000000..5f44c4c
--- /dev/null
+++ b/contrib/cmake/CMakeCache.txt
@@ -0,0 +1,292 @@
+# This is the CMakeCache file.
+# For build in directory: /home/markl/download/libconfig_test_app
+# It was generated by CMake: /usr/bin/cmake
+# You can edit this file to change values found and used by cmake.
+# If you do not want to change any of the values, simply exit the editor.
+# If you do want to change a value, simply edit, save, and exit the editor.
+# The syntax for the file is as follows:
+# KEY:TYPE=VALUE
+# KEY is the name of a variable in the cache.
+# TYPE is a hint to GUI's for the type of VALUE, DO NOT EDIT TYPE!.
+# VALUE is the current value for the KEY.
+
+########################
+# EXTERNAL cache entries
+########################
+
+//Path to a program.
+CMAKE_AR:FILEPATH=/usr/bin/ar
+
+//For backwards compatibility, what version of CMake commands and
+// syntax should this version of CMake try to support.
+CMAKE_BACKWARDS_COMPATIBILITY:STRING=2.4
+
+//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or
+// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.
+CMAKE_BUILD_TYPE:STRING=Release
+
+//Enable/Disable color output during build.
+CMAKE_COLOR_MAKEFILE:BOOL=ON
+
+//CXX compiler.
+CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++
+
+//Flags used by the compiler during all build types.
+CMAKE_CXX_FLAGS:STRING=
+
+//Flags used by the compiler during debug builds.
+CMAKE_CXX_FLAGS_DEBUG:STRING=-g
+
+//Flags used by the compiler during release minsize builds.
+CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG
+
+//Flags used by the compiler during release builds (/MD /Ob1 /Oi
+// /Ot /Oy /Gs will produce slightly less optimized but smaller
+// files).
+CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG
+
+//Flags used by the compiler during Release with Debug Info builds.
+CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g
+
+//C compiler.
+CMAKE_C_COMPILER:FILEPATH=/usr/bin/gcc
+
+//Flags used by the compiler during all build types.
+CMAKE_C_FLAGS:STRING=
+
+//Flags used by the compiler during debug builds.
+CMAKE_C_FLAGS_DEBUG:STRING=-g
+
+//Flags used by the compiler during release minsize builds.
+CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG
+
+//Flags used by the compiler during release builds (/MD /Ob1 /Oi
+// /Ot /Oy /Gs will produce slightly less optimized but smaller
+// files).
+CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG
+
+//Flags used by the compiler during Release with Debug Info builds.
+CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g
+
+//Flags used by the linker.
+CMAKE_EXE_LINKER_FLAGS:STRING=
+
+//Flags used by the linker during debug builds.
+CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING=
+
+//Flags used by the linker during release minsize builds.
+CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING=
+
+//Flags used by the linker during release builds.
+CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING=
+
+//Flags used by the linker during Release with Debug Info builds.
+CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING=
+
+//Install path prefix, prepended onto install directories.
+CMAKE_INSTALL_PREFIX:PATH=/usr/local
+
+//Path to a program.
+CMAKE_LINKER:FILEPATH=/usr/bin/ld
+
+//Path to a program.
+CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make
+
+//Flags used by the linker during the creation of modules.
+CMAKE_MODULE_LINKER_FLAGS:STRING=
+
+//Flags used by the linker during debug builds.
+CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING=
+
+//Flags used by the linker during release minsize builds.
+CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING=
+
+//Flags used by the linker during release builds.
+CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING=
+
+//Flags used by the linker during Release with Debug Info builds.
+CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING=
+
+//Path to a program.
+CMAKE_NM:FILEPATH=/usr/bin/nm
+
+//Path to a program.
+CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy
+
+//Path to a program.
+CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump
+
+//Path to a program.
+CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib
+
+//Flags used by the linker during the creation of dll's.
+CMAKE_SHARED_LINKER_FLAGS:STRING=
+
+//Flags used by the linker during debug builds.
+CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING=
+
+//Flags used by the linker during release minsize builds.
+CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING=
+
+//Flags used by the linker during release builds.
+CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING=
+
+//Flags used by the linker during Release with Debug Info builds.
+CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING=
+
+//If set, runtime paths are not added when using shared libraries.
+CMAKE_SKIP_RPATH:BOOL=NO
+
+//Path to a program.
+CMAKE_STRIP:FILEPATH=/usr/bin/strip
+
+//If true, cmake will use relative paths in makefiles and projects.
+CMAKE_USE_RELATIVE_PATHS:BOOL=OFF
+
+//If this value is on, makefiles will be generated without the
+// .SILENT directive, and all commands will be echoed to the console
+// during the make. This is useful for debugging only. With Visual
+// Studio IDE projects all commands are done without /nologo.
+CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE
+
+//Path to a file.
+CONFIG_INCLUDE_DIR:PATH=CONFIG_INCLUDE_DIR-NOTFOUND
+
+//Path to a library.
+CONFIG_LIBRARY:FILEPATH=CONFIG_LIBRARY-NOTFOUND
+
+//Single output directory for building all executables.
+EXECUTABLE_OUTPUT_PATH:PATH=
+
+//Single output directory for building all libraries.
+LIBRARY_OUTPUT_PATH:PATH=
+
+//Value Computed by CMake
+libconfig_test_app_BINARY_DIR:STATIC=/home/markl/download/libconfig_test_app/src
+
+//Value Computed by CMake
+libconfig_test_app_SOURCE_DIR:STATIC=/home/markl/download/libconfig_test_app/src
+
+
+########################
+# INTERNAL cache entries
+########################
+
+//Advanced flag for variable: CMAKE_AR
+CMAKE_AR-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_BUILD_TOOL
+CMAKE_BUILD_TOOL-ADVANCED:INTERNAL=1
+//What is the target build tool cmake is generating for.
+CMAKE_BUILD_TOOL:INTERNAL=/usr/bin/make
+//This is the directory where this CMakeCahe.txt was created
+CMAKE_CACHEFILE_DIR:INTERNAL=/home/markl/download/libconfig_test_app
+//Major version of cmake used to create the current loaded cache
+CMAKE_CACHE_MAJOR_VERSION:INTERNAL=2
+//Minor version of cmake used to create the current loaded cache
+CMAKE_CACHE_MINOR_VERSION:INTERNAL=6
+//Major version of cmake used to create the current loaded cache
+CMAKE_CACHE_RELEASE_VERSION:INTERNAL=patch 4
+//Advanced flag for variable: CMAKE_COLOR_MAKEFILE
+CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1
+//Path to CMake executable.
+CMAKE_COMMAND:INTERNAL=/usr/bin/cmake
+//Path to cpack program executable.
+CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack
+//Path to ctest program executable.
+CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest
+//Advanced flag for variable: CMAKE_CXX_COMPILER
+CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1
+CMAKE_CXX_COMPILER_WORKS:INTERNAL=1
+//Advanced flag for variable: CMAKE_CXX_FLAGS
+CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_CXX_FLAGS_DEBUG
+CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_CXX_FLAGS_MINSIZEREL
+CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_CXX_FLAGS_RELEASE
+CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO
+CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_C_COMPILER
+CMAKE_C_COMPILER-ADVANCED:INTERNAL=1
+CMAKE_C_COMPILER_WORKS:INTERNAL=1
+//Advanced flag for variable: CMAKE_C_FLAGS
+CMAKE_C_FLAGS-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_C_FLAGS_DEBUG
+CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_C_FLAGS_MINSIZEREL
+CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_C_FLAGS_RELEASE
+CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_C_FLAGS_RELWITHDEBINFO
+CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
+//Result of TRY_COMPILE
+CMAKE_DETERMINE_CXX_ABI_COMPILED:INTERNAL=TRUE
+//Result of TRY_COMPILE
+CMAKE_DETERMINE_C_ABI_COMPILED:INTERNAL=TRUE
+//Executable file format
+CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF
+//Advanced flag for variable: CMAKE_EXE_LINKER_FLAGS
+CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG
+CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL
+CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE
+CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO
+CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
+//Name of generator.
+CMAKE_GENERATOR:INTERNAL=Unix Makefiles
+//Start directory with the top level CMakeLists.txt file for this
+// project
+CMAKE_HOME_DIRECTORY:INTERNAL=/home/markl/download/libconfig_test_app
+//Install .so files without execute permission.
+CMAKE_INSTALL_SO_NO_EXE:INTERNAL=1
+//Advanced flag for variable: CMAKE_LINKER
+CMAKE_LINKER-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_MAKE_PROGRAM
+CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_MODULE_LINKER_FLAGS
+CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG
+CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL
+CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE
+CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO
+CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_NM
+CMAKE_NM-ADVANCED:INTERNAL=1
+//number of local generators
+CMAKE_NUMBER_OF_LOCAL_GENERATORS:INTERNAL=2
+//Advanced flag for variable: CMAKE_OBJCOPY
+CMAKE_OBJCOPY-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_OBJDUMP
+CMAKE_OBJDUMP-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_RANLIB
+CMAKE_RANLIB-ADVANCED:INTERNAL=1
+//Path to CMake installation.
+CMAKE_ROOT:INTERNAL=/usr/share/cmake-2.6
+//Advanced flag for variable: CMAKE_SHARED_LINKER_FLAGS
+CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG
+CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL
+CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE
+CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO
+CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_SKIP_RPATH
+CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_STRIP
+CMAKE_STRIP-ADVANCED:INTERNAL=1
+//uname command
+CMAKE_UNAME:INTERNAL=/bin/uname
+//Advanced flag for variable: CMAKE_USE_RELATIVE_PATHS
+CMAKE_USE_RELATIVE_PATHS-ADVANCED:INTERNAL=1
+//Advanced flag for variable: CMAKE_VERBOSE_MAKEFILE
+CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1
+
diff --git a/contrib/cmake/CMakeFiles/CMakeCCompiler.cmake b/contrib/cmake/CMakeFiles/CMakeCCompiler.cmake
new file mode 100644
index 0000000..26afd10
--- /dev/null
+++ b/contrib/cmake/CMakeFiles/CMakeCCompiler.cmake
@@ -0,0 +1,36 @@
+SET(CMAKE_C_COMPILER "/usr/bin/gcc")
+SET(CMAKE_C_COMPILER_ARG1 "")
+SET(CMAKE_C_COMPILER_ID "GNU")
+SET(CMAKE_C_PLATFORM_ID "Linux")
+SET(CMAKE_AR "/usr/bin/ar")
+SET(CMAKE_RANLIB "/usr/bin/ranlib")
+SET(CMAKE_COMPILER_IS_GNUCC 1)
+SET(CMAKE_C_COMPILER_LOADED 1)
+SET(CMAKE_COMPILER_IS_MINGW )
+SET(CMAKE_COMPILER_IS_CYGWIN )
+IF(CMAKE_COMPILER_IS_CYGWIN)
+ SET(CYGWIN 1)
+ SET(UNIX 1)
+ENDIF(CMAKE_COMPILER_IS_CYGWIN)
+
+SET(CMAKE_C_COMPILER_ENV_VAR "CC")
+
+IF(CMAKE_COMPILER_IS_MINGW)
+ SET(MINGW 1)
+ENDIF(CMAKE_COMPILER_IS_MINGW)
+SET(CMAKE_C_COMPILER_ID_RUN 1)
+SET(CMAKE_C_SOURCE_FILE_EXTENSIONS c)
+SET(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC)
+SET(CMAKE_C_LINKER_PREFERENCE 10)
+
+# Save compiler ABI information.
+SET(CMAKE_C_SIZEOF_DATA_PTR "4")
+SET(CMAKE_C_COMPILER_ABI "ELF")
+
+IF(CMAKE_C_SIZEOF_DATA_PTR)
+ SET(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}")
+ENDIF(CMAKE_C_SIZEOF_DATA_PTR)
+
+IF(CMAKE_C_COMPILER_ABI)
+ SET(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}")
+ENDIF(CMAKE_C_COMPILER_ABI)
diff --git a/contrib/cmake/CMakeFiles/CMakeCXXCompiler.cmake b/contrib/cmake/CMakeFiles/CMakeCXXCompiler.cmake
new file mode 100644
index 0000000..62c36c9
--- /dev/null
+++ b/contrib/cmake/CMakeFiles/CMakeCXXCompiler.cmake
@@ -0,0 +1,36 @@
+SET(CMAKE_CXX_COMPILER "/usr/bin/c++")
+SET(CMAKE_CXX_COMPILER_ARG1 "")
+SET(CMAKE_CXX_COMPILER_ID "GNU")
+SET(CMAKE_CXX_PLATFORM_ID "Linux")
+SET(CMAKE_AR "/usr/bin/ar")
+SET(CMAKE_RANLIB "/usr/bin/ranlib")
+SET(CMAKE_COMPILER_IS_GNUCXX 1)
+SET(CMAKE_CXX_COMPILER_LOADED 1)
+SET(CMAKE_COMPILER_IS_MINGW )
+SET(CMAKE_COMPILER_IS_CYGWIN )
+IF(CMAKE_COMPILER_IS_CYGWIN)
+ SET(CYGWIN 1)
+ SET(UNIX 1)
+ENDIF(CMAKE_COMPILER_IS_CYGWIN)
+
+SET(CMAKE_CXX_COMPILER_ENV_VAR "CXX")
+
+IF(CMAKE_COMPILER_IS_MINGW)
+ SET(MINGW 1)
+ENDIF(CMAKE_COMPILER_IS_MINGW)
+SET(CMAKE_CXX_COMPILER_ID_RUN 1)
+SET(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;H;o;O;obj;OBJ;def;DEF;rc;RC)
+SET(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm)
+SET(CMAKE_CXX_LINKER_PREFERENCE 30)
+
+# Save compiler ABI information.
+SET(CMAKE_CXX_SIZEOF_DATA_PTR "4")
+SET(CMAKE_CXX_COMPILER_ABI "ELF")
+
+IF(CMAKE_CXX_SIZEOF_DATA_PTR)
+ SET(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}")
+ENDIF(CMAKE_CXX_SIZEOF_DATA_PTR)
+
+IF(CMAKE_CXX_COMPILER_ABI)
+ SET(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}")
+ENDIF(CMAKE_CXX_COMPILER_ABI)
diff --git a/contrib/cmake/CMakeFiles/CMakeDetermineCompilerABI_C.bin b/contrib/cmake/CMakeFiles/CMakeDetermineCompilerABI_C.bin
new file mode 100755
index 0000000..da7f565
--- /dev/null
+++ b/contrib/cmake/CMakeFiles/CMakeDetermineCompilerABI_C.bin
Binary files differ
diff --git a/contrib/cmake/CMakeFiles/CMakeDetermineCompilerABI_CXX.bin b/contrib/cmake/CMakeFiles/CMakeDetermineCompilerABI_CXX.bin
new file mode 100755
index 0000000..52505ce
--- /dev/null
+++ b/contrib/cmake/CMakeFiles/CMakeDetermineCompilerABI_CXX.bin
Binary files differ
diff --git a/contrib/cmake/CMakeFiles/CMakeOutput.log b/contrib/cmake/CMakeFiles/CMakeOutput.log
new file mode 100644
index 0000000..9314bb2
--- /dev/null
+++ b/contrib/cmake/CMakeFiles/CMakeOutput.log
@@ -0,0 +1,89 @@
+The system is: Linux - 2.6.31-20-generic-pae - i686
+Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded.
+Compiler: /usr/bin/gcc
+Build flags:
+Id flags:
+
+The output was:
+0
+
+
+Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "a.out"
+
+The C compiler identification is GNU, found in "/home/markl/download/libconfig_test_app/CMakeFiles/CompilerIdC/a.out"
+
+Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded.
+Compiler: /usr/bin/c++
+Build flags:
+Id flags:
+
+The output was:
+0
+CMakeCXXCompilerId.cpp:67: warning: deprecated conversion from string constant to 'char*'
+CMakeCXXCompilerId.cpp:157: warning: deprecated conversion from string constant to 'char*'
+
+
+Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.out"
+
+The CXX compiler identification is GNU, found in "/home/markl/download/libconfig_test_app/CMakeFiles/CompilerIdCXX/a.out"
+
+Determining if the C compiler works passed with the following output:
+Change Dir: /home/markl/download/libconfig_test_app/CMakeFiles/CMakeTmp
+
+Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
+/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
+make[1]: Entering directory `/home/markl/download/libconfig_test_app/CMakeFiles/CMakeTmp'
+/usr/bin/cmake -E cmake_progress_report /home/markl/download/libconfig_test_app/CMakeFiles/CMakeTmp/CMakeFiles 1
+Building C object CMakeFiles/cmTryCompileExec.dir/testCCompiler.c.o
+/usr/bin/gcc -o CMakeFiles/cmTryCompileExec.dir/testCCompiler.c.o -c /home/markl/download/libconfig_test_app/CMakeFiles/CMakeTmp/testCCompiler.c
+Linking C executable cmTryCompileExec
+/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
+/usr/bin/gcc CMakeFiles/cmTryCompileExec.dir/testCCompiler.c.o -o cmTryCompileExec -rdynamic
+make[1]: Leaving directory `/home/markl/download/libconfig_test_app/CMakeFiles/CMakeTmp'
+
+
+Detecting C compiler ABI info compiled with the following output:
+Change Dir: /home/markl/download/libconfig_test_app/CMakeFiles/CMakeTmp
+
+Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
+/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
+make[1]: Entering directory `/home/markl/download/libconfig_test_app/CMakeFiles/CMakeTmp'
+/usr/bin/cmake -E cmake_progress_report /home/markl/download/libconfig_test_app/CMakeFiles/CMakeTmp/CMakeFiles 1
+Building C object CMakeFiles/cmTryCompileExec.dir/CMakeCCompilerABI.c.o
+/usr/bin/gcc -o CMakeFiles/cmTryCompileExec.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-2.6/Modules/CMakeCCompilerABI.c
+Linking C executable cmTryCompileExec
+/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
+/usr/bin/gcc CMakeFiles/cmTryCompileExec.dir/CMakeCCompilerABI.c.o -o cmTryCompileExec -rdynamic
+make[1]: Leaving directory `/home/markl/download/libconfig_test_app/CMakeFiles/CMakeTmp'
+
+
+Determining if the CXX compiler works passed with the following output:
+Change Dir: /home/markl/download/libconfig_test_app/CMakeFiles/CMakeTmp
+
+Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
+/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
+make[1]: Entering directory `/home/markl/download/libconfig_test_app/CMakeFiles/CMakeTmp'
+/usr/bin/cmake -E cmake_progress_report /home/markl/download/libconfig_test_app/CMakeFiles/CMakeTmp/CMakeFiles 1
+Building CXX object CMakeFiles/cmTryCompileExec.dir/testCXXCompiler.cxx.o
+/usr/bin/c++ -o CMakeFiles/cmTryCompileExec.dir/testCXXCompiler.cxx.o -c /home/markl/download/libconfig_test_app/CMakeFiles/CMakeTmp/testCXXCompiler.cxx
+Linking CXX executable cmTryCompileExec
+/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
+/usr/bin/c++ CMakeFiles/cmTryCompileExec.dir/testCXXCompiler.cxx.o -o cmTryCompileExec -rdynamic
+make[1]: Leaving directory `/home/markl/download/libconfig_test_app/CMakeFiles/CMakeTmp'
+
+
+Detecting CXX compiler ABI info compiled with the following output:
+Change Dir: /home/markl/download/libconfig_test_app/CMakeFiles/CMakeTmp
+
+Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
+/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
+make[1]: Entering directory `/home/markl/download/libconfig_test_app/CMakeFiles/CMakeTmp'
+/usr/bin/cmake -E cmake_progress_report /home/markl/download/libconfig_test_app/CMakeFiles/CMakeTmp/CMakeFiles 1
+Building CXX object CMakeFiles/cmTryCompileExec.dir/CMakeCXXCompilerABI.cpp.o
+/usr/bin/c++ -o CMakeFiles/cmTryCompileExec.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-2.6/Modules/CMakeCXXCompilerABI.cpp
+Linking CXX executable cmTryCompileExec
+/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
+/usr/bin/c++ CMakeFiles/cmTryCompileExec.dir/CMakeCXXCompilerABI.cpp.o -o cmTryCompileExec -rdynamic
+make[1]: Leaving directory `/home/markl/download/libconfig_test_app/CMakeFiles/CMakeTmp'
+
+
diff --git a/contrib/cmake/CMakeFiles/CMakeSystem.cmake b/contrib/cmake/CMakeFiles/CMakeSystem.cmake
new file mode 100644
index 0000000..24477a5
--- /dev/null
+++ b/contrib/cmake/CMakeFiles/CMakeSystem.cmake
@@ -0,0 +1,15 @@
+
+
+SET(CMAKE_SYSTEM "Linux-2.6.31-20-generic-pae")
+SET(CMAKE_SYSTEM_NAME "Linux")
+SET(CMAKE_SYSTEM_VERSION "2.6.31-20-generic-pae")
+SET(CMAKE_SYSTEM_PROCESSOR "i686")
+
+SET(CMAKE_HOST_SYSTEM "Linux-2.6.31-20-generic-pae")
+SET(CMAKE_HOST_SYSTEM_NAME "Linux")
+SET(CMAKE_HOST_SYSTEM_VERSION "2.6.31-20-generic-pae")
+SET(CMAKE_HOST_SYSTEM_PROCESSOR "i686")
+
+SET(CMAKE_CROSSCOMPILING "FALSE")
+
+SET(CMAKE_SYSTEM_LOADED 1)
diff --git a/contrib/cmake/CMakeFiles/CompilerIdC/CMakeCCompilerId.c b/contrib/cmake/CMakeFiles/CompilerIdC/CMakeCCompilerId.c
new file mode 100644
index 0000000..7fd0088
--- /dev/null
+++ b/contrib/cmake/CMakeFiles/CompilerIdC/CMakeCCompilerId.c
@@ -0,0 +1,182 @@
+#ifdef __cplusplus
+# error "A C++ compiler has been selected for C."
+#endif
+
+#if defined(__18CXX)
+# define ID_VOID_MAIN
+#endif
+
+#if defined(__INTEL_COMPILER) || defined(__ICC)
+# define COMPILER_ID "Intel"
+
+#elif defined(__BORLANDC__)
+# define COMPILER_ID "Borland"
+
+#elif defined(__WATCOMC__)
+# define COMPILER_ID "Watcom"
+
+#elif defined(__SUNPRO_C)
+# define COMPILER_ID "SunPro"
+
+#elif defined(__HP_cc)
+# define COMPILER_ID "HP"
+
+#elif defined(__DECC)
+# define COMPILER_ID "Compaq"
+
+#elif defined(__IBMC__)
+# define COMPILER_ID "VisualAge"
+
+#elif defined(__PGI)
+# define COMPILER_ID "PGI"
+
+#elif defined(__GNUC__)
+# define COMPILER_ID "GNU"
+
+#elif defined(_MSC_VER)
+# define COMPILER_ID "MSVC"
+
+#elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
+/* Analog Devices C++ compiler for Blackfin, TigerSHARC and
+ SHARC (21000) DSPs */
+# define COMPILER_ID "ADSP"
+
+/* IAR Systems compiler for embedded systems.
+ http://www.iar.com
+ Not supported yet by CMake
+#elif defined(__IAR_SYSTEMS_ICC__)
+# define COMPILER_ID "IAR" */
+
+/* sdcc, the small devices C compiler for embedded systems,
+ http://sdcc.sourceforge.net */
+#elif defined(SDCC)
+# define COMPILER_ID "SDCC"
+
+#elif defined(_COMPILER_VERSION)
+# define COMPILER_ID "MIPSpro"
+
+/* This compiler is either not known or is too old to define an
+ identification macro. Try to identify the platform and guess that
+ it is the native compiler. */
+#elif defined(__sgi)
+# define COMPILER_ID "MIPSpro"
+
+#elif defined(__hpux) || defined(__hpua)
+# define COMPILER_ID "HP"
+
+#else /* unknown compiler */
+# define COMPILER_ID ""
+
+#endif
+
+/* Construct the string literal in pieces to prevent the source from
+ getting matched. Store it in a pointer rather than an array
+ because some compilers will just produce instructions to fill the
+ array rather than assigning a pointer to a static array. */
+char* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
+
+/* Identify known platforms by name. */
+#if defined(__linux) || defined(__linux__) || defined(linux)
+# define PLATFORM_ID "Linux"
+
+#elif defined(__CYGWIN__)
+# define PLATFORM_ID "Cygwin"
+
+#elif defined(__MINGW32__)
+# define PLATFORM_ID "MinGW"
+
+#elif defined(__APPLE__)
+# define PLATFORM_ID "Darwin"
+
+#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
+# define PLATFORM_ID "Windows"
+
+#elif defined(__FreeBSD__) || defined(__FreeBSD)
+# define PLATFORM_ID "FreeBSD"
+
+#elif defined(__NetBSD__) || defined(__NetBSD)
+# define PLATFORM_ID "NetBSD"
+
+#elif defined(__OpenBSD__) || defined(__OPENBSD)
+# define PLATFORM_ID "OpenBSD"
+
+#elif defined(__sun) || defined(sun)
+# define PLATFORM_ID "SunOS"
+
+#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
+# define PLATFORM_ID "AIX"
+
+#elif defined(__sgi) || defined(__sgi__) || defined(_SGI)
+# define PLATFORM_ID "IRIX"
+
+#elif defined(__hpux) || defined(__hpux__)
+# define PLATFORM_ID "HP-UX"
+
+#elif defined(__HAIKU) || defined(__HAIKU__) || defined(_HAIKU)
+# define PLATFORM_ID "Haiku"
+/* Haiku also defines __BEOS__ so we must
+ put it prior to the check for __BEOS__
+*/
+
+#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
+# define PLATFORM_ID "BeOS"
+
+#elif defined(__QNX__) || defined(__QNXNTO__)
+# define PLATFORM_ID "QNX"
+
+#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
+# define PLATFORM_ID "Tru64"
+
+#elif defined(__riscos) || defined(__riscos__)
+# define PLATFORM_ID "RISCos"
+
+#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
+# define PLATFORM_ID "SINIX"
+
+#elif defined(__UNIX_SV__)
+# define PLATFORM_ID "UNIX_SV"
+
+#elif defined(__bsdos__)
+# define PLATFORM_ID "BSDOS"
+
+#elif defined(_MPRAS) || defined(MPRAS)
+# define PLATFORM_ID "MP-RAS"
+
+#elif defined(__osf) || defined(__osf__)
+# define PLATFORM_ID "OSF1"
+
+#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
+# define PLATFORM_ID "SCO_SV"
+
+#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
+# define PLATFORM_ID "ULTRIX"
+
+#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
+# define PLATFORM_ID "Xenix"
+
+#else /* unknown platform */
+# define PLATFORM_ID ""
+
+#endif
+
+/* Construct the string literal in pieces to prevent the source from
+ getting matched. Store it in a pointer rather than an array
+ because some compilers will just produce instructions to fill the
+ array rather than assigning a pointer to a static array. */
+char* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
+
+
+/*--------------------------------------------------------------------------*/
+
+#ifdef ID_VOID_MAIN
+void main() {}
+#else
+int main(int argc, char* argv[])
+{
+ int require = 0;
+ require += info_compiler[argc];
+ require += info_platform[argc];
+ (void)argv;
+ return require;
+}
+#endif
diff --git a/contrib/cmake/CMakeFiles/CompilerIdC/a.out b/contrib/cmake/CMakeFiles/CompilerIdC/a.out
new file mode 100755
index 0000000..b18090c
--- /dev/null
+++ b/contrib/cmake/CMakeFiles/CompilerIdC/a.out
Binary files differ
diff --git a/contrib/cmake/CMakeFiles/CompilerIdCXX/CMakeCXXCompilerId.cpp b/contrib/cmake/CMakeFiles/CompilerIdCXX/CMakeCXXCompilerId.cpp
new file mode 100644
index 0000000..f8c041f
--- /dev/null
+++ b/contrib/cmake/CMakeFiles/CompilerIdCXX/CMakeCXXCompilerId.cpp
@@ -0,0 +1,169 @@
+/* This source file must have a .cpp extension so that all C++ compilers
+ recognize the extension without flags. Borland does not know .cxx for
+ example. */
+#ifndef __cplusplus
+# error "A C compiler has been selected for C++."
+#endif
+
+#if defined(__COMO__)
+# define COMPILER_ID "Comeau"
+
+#elif defined(__INTEL_COMPILER) || defined(__ICC)
+# define COMPILER_ID "Intel"
+
+#elif defined(__BORLANDC__)
+# define COMPILER_ID "Borland"
+
+#elif defined(__WATCOMC__)
+# define COMPILER_ID "Watcom"
+
+#elif defined(__SUNPRO_CC)
+# define COMPILER_ID "SunPro"
+
+#elif defined(__HP_aCC)
+# define COMPILER_ID "HP"
+
+#elif defined(__DECCXX)
+# define COMPILER_ID "Compaq"
+
+#elif defined(__IBMCPP__)
+# define COMPILER_ID "VisualAge"
+
+#elif defined(__PGI)
+# define COMPILER_ID "PGI"
+
+#elif defined(__GNUC__)
+# define COMPILER_ID "GNU"
+
+#elif defined(_MSC_VER)
+# define COMPILER_ID "MSVC"
+
+#elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
+/* Analog Devices C++ compiler for Blackfin, TigerSHARC and
+ SHARC (21000) DSPs */
+# define COMPILER_ID "ADSP"
+
+#elif defined(_COMPILER_VERSION)
+# define COMPILER_ID "MIPSpro"
+
+/* This compiler is either not known or is too old to define an
+ identification macro. Try to identify the platform and guess that
+ it is the native compiler. */
+#elif defined(__sgi)
+# define COMPILER_ID "MIPSpro"
+
+#elif defined(__hpux) || defined(__hpua)
+# define COMPILER_ID "HP"
+
+#else /* unknown compiler */
+# define COMPILER_ID ""
+
+#endif
+
+/* Construct the string literal in pieces to prevent the source from
+ getting matched. Store it in a pointer rather than an array
+ because some compilers will just produce instructions to fill the
+ array rather than assigning a pointer to a static array. */
+char* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
+
+/* Identify known platforms by name. */
+#if defined(__linux) || defined(__linux__) || defined(linux)
+# define PLATFORM_ID "Linux"
+
+#elif defined(__CYGWIN__)
+# define PLATFORM_ID "Cygwin"
+
+#elif defined(__MINGW32__)
+# define PLATFORM_ID "MinGW"
+
+#elif defined(__APPLE__)
+# define PLATFORM_ID "Darwin"
+
+#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
+# define PLATFORM_ID "Windows"
+
+#elif defined(__FreeBSD__) || defined(__FreeBSD)
+# define PLATFORM_ID "FreeBSD"
+
+#elif defined(__NetBSD__) || defined(__NetBSD)
+# define PLATFORM_ID "NetBSD"
+
+#elif defined(__OpenBSD__) || defined(__OPENBSD)
+# define PLATFORM_ID "OpenBSD"
+
+#elif defined(__sun) || defined(sun)
+# define PLATFORM_ID "SunOS"
+
+#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
+# define PLATFORM_ID "AIX"
+
+#elif defined(__sgi) || defined(__sgi__) || defined(_SGI)
+# define PLATFORM_ID "IRIX"
+
+#elif defined(__hpux) || defined(__hpux__)
+# define PLATFORM_ID "HP-UX"
+
+#elif defined(__HAIKU) || defined(__HAIKU__) || defined(_HAIKU)
+# define PLATFORM_ID "Haiku"
+/* Haiku also defines __BEOS__ so we must
+ put it prior to the check for __BEOS__
+*/
+
+#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
+# define PLATFORM_ID "BeOS"
+
+#elif defined(__QNX__) || defined(__QNXNTO__)
+# define PLATFORM_ID "QNX"
+
+#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
+# define PLATFORM_ID "Tru64"
+
+#elif defined(__riscos) || defined(__riscos__)
+# define PLATFORM_ID "RISCos"
+
+#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
+# define PLATFORM_ID "SINIX"
+
+#elif defined(__UNIX_SV__)
+# define PLATFORM_ID "UNIX_SV"
+
+#elif defined(__bsdos__)
+# define PLATFORM_ID "BSDOS"
+
+#elif defined(_MPRAS) || defined(MPRAS)
+# define PLATFORM_ID "MP-RAS"
+
+#elif defined(__osf) || defined(__osf__)
+# define PLATFORM_ID "OSF1"
+
+#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
+# define PLATFORM_ID "SCO_SV"
+
+#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
+# define PLATFORM_ID "ULTRIX"
+
+#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
+# define PLATFORM_ID "Xenix"
+
+#else /* unknown platform */
+# define PLATFORM_ID ""
+
+#endif
+
+/* Construct the string literal in pieces to prevent the source from
+ getting matched. Store it in a pointer rather than an array
+ because some compilers will just produce instructions to fill the
+ array rather than assigning a pointer to a static array. */
+char* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
+
+
+/*--------------------------------------------------------------------------*/
+
+int main(int argc, char* argv[])
+{
+ int require = 0;
+ require += info_compiler[argc];
+ require += info_platform[argc];
+ (void)argv;
+ return require;
+}
diff --git a/contrib/cmake/CMakeFiles/CompilerIdCXX/a.out b/contrib/cmake/CMakeFiles/CompilerIdCXX/a.out
new file mode 100755
index 0000000..74b17e6
--- /dev/null
+++ b/contrib/cmake/CMakeFiles/CompilerIdCXX/a.out
Binary files differ
diff --git a/contrib/cmake/CMakeFiles/cmake.check_cache b/contrib/cmake/CMakeFiles/cmake.check_cache
new file mode 100644
index 0000000..3dccd73
--- /dev/null
+++ b/contrib/cmake/CMakeFiles/cmake.check_cache
@@ -0,0 +1 @@
+# This file is generated by cmake for dependency checking of the CMakeCache.txt file
diff --git a/contrib/cmake/CMakeLists.txt b/contrib/cmake/CMakeLists.txt
new file mode 100644
index 0000000..716888f
--- /dev/null
+++ b/contrib/cmake/CMakeLists.txt
@@ -0,0 +1,22 @@
+#cmake_minimum_required(VERSION 2.8)
+
+PROJECT(libconfig_test_app)
+
+add_subdirectory(src)
+
+#add cmake script files
+set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_work")
+
+#check if libconfig is present (FindConfig.cmake and FindConfig++.cmake files)
+FIND_PACKAGE(Config REQUIRED)
+FIND_PACKAGE(Config++ REQUIRED)
+
+#add undelete support
+CONFIGURE_FILE(
+ "${CMAKE_CURRENT_SOURCE_DIR}/cmake_work/cmake_uninstall.cmake.in"
+ "${CMAKE_CURRENT_BINARY_DIR}/cmake_work/cmake_uninstall.cmake"
+ IMMEDIATE @ONLY)
+ADD_CUSTOM_TARGET(uninstall
+ "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_work/cmake_uninstall.cmake")
+
+
diff --git a/contrib/cmake/cmake_work/FindConfig++.cmake b/contrib/cmake/cmake_work/FindConfig++.cmake
new file mode 100644
index 0000000..f6d11a3
--- /dev/null
+++ b/contrib/cmake/cmake_work/FindConfig++.cmake
@@ -0,0 +1,23 @@
+FIND_PATH(CONFIG++_INCLUDE_DIR libconfig.h++ /usr/include /usr/local/include)
+
+FIND_LIBRARY(CONFIG++_LIBRARY NAMES config++ PATH /usr/lib /usr/local/lib)
+
+IF (CONFIG++_INCLUDE_DIR AND CONFIG++_LIBRARY)
+ SET(CONFIG++_FOUND TRUE)
+ENDIF ( CONFIG++_INCLUDE_DIR AND CONFIG++_LIBRARY)
+
+IF (CONFIG++_FOUND)
+ IF (NOT CONFIG++_FIND_QUIETLY)
+ MESSAGE(STATUS "Found Config++: ${CONFIG++_LIBRARY}")
+ ENDIF (NOT CONFIG++_FIND_QUIETLY)
+ELSE(CONFIG++_FOUND)
+ IF (Config++_FIND_REQUIRED)
+ IF(NOT CONFIG++_INCLUDE_DIR)
+ MESSAGE(FATAL_ERROR "Could not find LibConfig++ header file!")
+ ENDIF(NOT CONFIG++_INCLUDE_DIR)
+
+ IF(NOT CONFIG++_LIBRARY)
+ MESSAGE(FATAL_ERROR "Could not find LibConfig++ library file!")
+ ENDIF(NOT CONFIG++_LIBRARY)
+ ENDIF (Config++_FIND_REQUIRED)
+ENDIF (CONFIG++_FOUND) \ No newline at end of file
diff --git a/contrib/cmake/cmake_work/FindConfig.cmake b/contrib/cmake/cmake_work/FindConfig.cmake
new file mode 100644
index 0000000..5361d96
--- /dev/null
+++ b/contrib/cmake/cmake_work/FindConfig.cmake
@@ -0,0 +1,23 @@
+FIND_PATH(CONFIG_INCLUDE_DIR libconfig.h /usr/include /usr/local/include)
+
+FIND_LIBRARY(CONFIG_LIBRARY NAMES config PATH /usr/lib /usr/local/lib)
+
+IF (CONFIG_INCLUDE_DIR AND CONFIG_LIBRARY)
+ SET(CONFIG_FOUND TRUE)
+ENDIF ( CONFIG_INCLUDE_DIR AND CONFIG_LIBRARY)
+
+IF (CONFIG_FOUND)
+ IF (NOT CONFIG_FIND_QUIETLY)
+ MESSAGE(STATUS "Found Config: ${CONFIG_LIBRARY}")
+ ENDIF (NOT CONFIG_FIND_QUIETLY)
+ELSE(CONFIG_FOUND)
+ IF (Config_FIND_REQUIRED)
+ IF(NOT CONFIG_INCLUDE_DIR)
+ MESSAGE(FATAL_ERROR "Could not find LibConfig header file!")
+ ENDIF(NOT CONFIG_INCLUDE_DIR)
+
+ IF(NOT CONFIG_LIBRARY)
+ MESSAGE(FATAL_ERROR "Could not find LibConfig library file!")
+ ENDIF(NOT CONFIG_LIBRARY)
+ ENDIF (Config_FIND_REQUIRED)
+ENDIF (CONFIG_FOUND) \ No newline at end of file
diff --git a/contrib/cmake/cmake_work/cmake_uninstall.cmake.in b/contrib/cmake/cmake_work/cmake_uninstall.cmake.in
new file mode 100644
index 0000000..10a2937
--- /dev/null
+++ b/contrib/cmake/cmake_work/cmake_uninstall.cmake.in
@@ -0,0 +1,36 @@
+# Copyright 2006-2008 The FLWOR Foundation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
+ MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"")
+ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
+
+FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
+STRING(REGEX REPLACE "\n" ";" files "${files}")
+FOREACH(file ${files})
+ MESSAGE(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"")
+ IF(EXISTS "$ENV{DESTDIR}${file}")
+ EXEC_PROGRAM(
+ "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
+ OUTPUT_VARIABLE rm_out
+ RETURN_VALUE rm_retval
+ )
+ IF("${rm_retval}" STREQUAL 0)
+ ELSE("${rm_retval}" STREQUAL 0)
+ MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"")
+ ENDIF("${rm_retval}" STREQUAL 0)
+ ELSE(EXISTS "$ENV{DESTDIR}${file}")
+ MESSAGE(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.")
+ ENDIF(EXISTS "$ENV{DESTDIR}${file}")
+ENDFOREACH(file)
diff --git a/contrib/cmake/src/CMakeLists.txt b/contrib/cmake/src/CMakeLists.txt
new file mode 100644
index 0000000..b10b7da
--- /dev/null
+++ b/contrib/cmake/src/CMakeLists.txt
@@ -0,0 +1,6 @@
+PROJECT(libconfig_test_app)
+
+ADD_EXECUTABLE(libconfig_test_app main.cpp)
+
+target_link_libraries(libconfig_test_app config++)
+
diff --git a/contrib/cmake/src/main.cpp b/contrib/cmake/src/main.cpp
new file mode 100644
index 0000000..a563249
--- /dev/null
+++ b/contrib/cmake/src/main.cpp
@@ -0,0 +1,13 @@
+#include <iostream>
+#include <fstream>
+#include <libconfig.h++>
+
+using namespace std;
+using namespace libconfig;
+
+int main ( int argc, char **argv )
+{
+ Config cfg;
+
+ return (0);
+} \ No newline at end of file
diff --git a/contrib/copy_setting.c b/contrib/copy_setting.c
new file mode 100644
index 0000000..1b20e59
--- /dev/null
+++ b/contrib/copy_setting.c
@@ -0,0 +1,161 @@
+void config_setting_copy_simple(config_setting_t * parent, const config_setting_t * src);
+void config_setting_copy_elem(config_setting_t * parent, const config_setting_t * src);
+
+void config_setting_copy_aggregate(config_setting_t * parent, const config_setting_t * src);
+int config_setting_copy(config_setting_t * parent, const config_setting_t * src);
+
+void config_setting_copy_simple(config_setting_t * parent, const config_setting_t * src)
+{
+ if(config_setting_is_aggregate(src))
+ {
+ config_setting_copy_aggregate(parent, src);
+ }
+ else
+ {
+ config_setting_t * set;
+
+ set = config_setting_add(parent, config_setting_name(src), config_setting_type(src));
+
+ if(CONFIG_TYPE_INT == config_setting_type(src))
+ {
+ config_setting_set_int(set, config_setting_get_int(src));
+ config_setting_set_format(set, src->format);
+ }
+ else if(CONFIG_TYPE_INT64 == config_setting_type(src))
+ {
+ config_setting_set_int64(set, config_setting_get_int64(src));
+ config_setting_set_format(set, src->format);
+ }
+ else if(CONFIG_TYPE_FLOAT == config_setting_type(src))
+ config_setting_set_float(set, config_setting_get_float(src));
+ else if(CONFIG_TYPE_STRING == config_setting_type(src))
+ config_setting_set_string(set, config_setting_get_string(src));
+ else if(CONFIG_TYPE_BOOL == config_setting_type(src))
+ config_setting_set_bool(set, config_setting_get_bool(src));
+ }
+}
+
+void config_setting_copy_elem(config_setting_t * parent, const config_setting_t * src)
+{
+ config_setting_t * set;
+
+ set = NULL;
+ if(config_setting_is_aggregate(src))
+ config_setting_copy_aggregate(parent, src);
+ else if(CONFIG_TYPE_INT == config_setting_type(src))
+ {
+ set = config_setting_set_int_elem(parent, -1, config_setting_get_int(src));
+ config_setting_set_format(set, src->format);
+ }
+ else if(CONFIG_TYPE_INT64 == config_setting_type(src))
+ {
+ set = config_setting_set_int64_elem(parent, -1, config_setting_get_int64(src));
+ config_setting_set_format(set, src->format);
+ }
+ else if(CONFIG_TYPE_FLOAT == config_setting_type(src))
+ set = config_setting_set_float_elem(parent, -1, config_setting_get_float(src));
+ else if(CONFIG_TYPE_STRING == config_setting_type(src))
+ set = config_setting_set_string_elem(parent, -1, config_setting_get_string(src));
+ else if(CONFIG_TYPE_BOOL == config_setting_type(src))
+ set = config_setting_set_bool_elem(parent, -1, config_setting_get_bool(src));
+}
+
+void config_setting_copy_aggregate(config_setting_t * parent, const config_setting_t * src)
+{
+ config_setting_t * newAgg;
+ int i, n;
+
+ newAgg = config_setting_add(parent, config_setting_name(src), config_setting_type(src));
+
+ n = config_setting_length(src);
+ for(i = 0; i < n; i++)
+ {
+ if(config_setting_is_group(src))
+ {
+ config_setting_copy_simple(newAgg, config_setting_get_elem(src, i));
+ }
+ else
+ {
+ config_setting_copy_elem(newAgg, config_setting_get_elem(src, i));
+ }
+ }
+}
+
+int config_setting_copy(config_setting_t * parent, const config_setting_t * src)
+{
+ if((!config_setting_is_group(parent)) &&
+ (!config_setting_is_list(parent)))
+ return CONFIG_FALSE;
+
+ if(config_setting_is_aggregate(src))
+ {
+ config_setting_copy_aggregate(parent, src);
+ }
+ else
+ {
+ config_setting_copy_simple(parent, src);
+ }
+
+ return CONFIG_TRUE;
+}
+
+
+//Some sample code
+
+//-----------------------------------------------------------------------------
+int main(int argc, char *argv[])
+//-----------------------------------------------------------------------------
+{
+ config_t cfgSrc;
+ config_t cfgSrcCopy;
+ config_t cfgDst;
+
+
+ config_init(&cfgSrc);
+ config_init(&cfgSrcCopy);
+ config_init(&cfgDst);
+
+ if(CONFIG_FALSE == config_read_file(&cfgSrc, "/data/menu/cfgSrc.cfg"))
+ {
+ fprintf(stderr, "Failed to open cfgSrc.cfg\n");
+ }
+ if(CONFIG_FALSE == config_read_file(&cfgDst, "/data/menu/cfgDst.cfg"))
+ {
+ fprintf(stderr, "Failed to open cfgDst.cfg\n");
+ }
+
+ /*
+ printf("Dump cfgSrc.cfg\n");
+ DumpCfgSetting(config_root_setting(&cfgSrc));
+
+ printf("Dump cfgDst.cfg\n");
+ DumpCfgSetting(config_root_setting(&cfgDst));
+ */
+
+ config_setting_t * src;
+ config_setting_t * dst;
+
+ dst = config_lookup(&cfgDst, "grp1");
+
+ if((0 != (dst = config_lookup(&cfgDst, "grp1"))) &&
+ (0 != (src = config_lookup(&cfgSrc, "application.window"))))
+ //(0 != (src = config_lookup(&cfgSrc, "list"))))
+
+ {
+ if(CONFIG_FALSE == config_setting_copy(dst, src))
+ {
+ printf("Failed to copy src to dst\n");
+ }
+ }
+
+ config_setting_copy(config_root_setting(&cfgSrcCopy), config_root_setting(&cfgSrc));
+
+ config_write_file(&cfgDst, "/data/menu/cfgDstMod.cfg");
+ config_write_file(&cfgSrcCopy, "/data/menu/cfgSrcCpy.cfg");
+ config_write_file(&cfgSrc, "/data/menu/cfgSrcOrig.cfg");
+
+ config_destroy(&cfgSrc);
+ config_destroy(&cfgDst);
+
+ return 0;
+}
diff --git a/contrib/libconfig-ruby/README b/contrib/libconfig-ruby/README
new file mode 100644
index 0000000..1a45477
--- /dev/null
+++ b/contrib/libconfig-ruby/README
@@ -0,0 +1,76 @@
+# << Usage >>
+
+# you can feed this README to irb and see the result
+# $ irb README
+
+# IMPORTANT NOTICE:
+# be careful with big *fixnum* (plain int) values in configs
+# int is 32 bit, but ruby fixnum is only 31!
+# For example, 2100000000 will be read as -47483648.
+
+require 'rconfig'
+c = Config.new
+
+c.read!('test.cfg')
+# => IOError
+c.read('test.cfg')
+# => false
+
+p c['some_var']
+# => SettingNotFoundError
+# note: Config#lookup is alias for Config#[]
+
+c.append 'fixnum', Config::Fixnum.new(150)
+# #<Config::Fixnum...>
+
+f1 = Config::Fixnum.new(1)
+c.append 'another_fixnum', f1
+
+f2 = Config::Fixnum.new(256)
+c.append 'next_fixnum', f2
+
+p c.size
+# => 3
+
+c.delete(f1) # by element
+c.delete(0) # by index
+c.delete('next_fixnum') # by name
+# note: (at now) you cannot delete nested elements by Config#delete
+# you can do c['nested.element'].parent.delete(c['nested.element'])
+
+p c.size
+# => 0
+
+l = Config::List.new
+c.append 'the_list', l
+
+l.append Config::String.new("abcdef")
+l << Config::Float.new(3.14)
+# note: Config::List#append and Config::Array#append both have
+# aliases Config::[Aggregate]#<<
+
+p l.name
+# => "the_list"
+
+p l.index
+# => 0
+
+p l.root?
+# => false
+
+p l.size
+# => 3
+
+l[0].format = Config::FORMAT_HEX
+
+p l[1].value
+# => 3.14
+
+l[1].value = 2.71828
+
+c.write 'test.cfg'
+
+# you will get test.cfg with following contents:
+#
+# the_list = ( "abcdef", 2.71828, 0x2A );
+#
diff --git a/contrib/libconfig-ruby/Rakefile b/contrib/libconfig-ruby/Rakefile
new file mode 100644
index 0000000..62dc34d
--- /dev/null
+++ b/contrib/libconfig-ruby/Rakefile
@@ -0,0 +1,17 @@
+require 'rubygems'
+require 'rake/gempackagetask'
+
+spec = Gem::Specification.new do |s|
+ s.name = "rconfig"
+ s.version = "1.0"
+ s.author = "Peter Zotov"
+ s.email = "whitequark@whitequark.ru"
+ s.platform = Gem::Platform::RUBY
+ s.summary = "libconfig bindings"
+ s.files = [ File.join('ext', 'extconf.rb'), File.join('ext', 'rconfig.c') ].to_a
+ s.extensions = 'ext/extconf.rb'
+end
+
+Rake::GemPackageTask.new(spec) do |pkg|
+end
+
diff --git a/contrib/libconfig-ruby/ext/extconf.rb b/contrib/libconfig-ruby/ext/extconf.rb
new file mode 100644
index 0000000..e6d65ca
--- /dev/null
+++ b/contrib/libconfig-ruby/ext/extconf.rb
@@ -0,0 +1,11 @@
+#!/usr/bin/ruby
+require "mkmf"
+
+unless pkg_config('libconfig')
+ puts 'failure: need libconfig'
+ exit 1
+end
+
+have_func('rb_block_call', 'ruby/ruby.h')
+
+create_makefile("rconfig")
diff --git a/contrib/libconfig-ruby/ext/rconfig.c b/contrib/libconfig-ruby/ext/rconfig.c
new file mode 100644
index 0000000..c111cd6
--- /dev/null
+++ b/contrib/libconfig-ruby/ext/rconfig.c
@@ -0,0 +1,700 @@
+#include <ruby.h>
+#include <libconfig.h>
+
+static VALUE cConfig, cConfigBaseSetting, cConfigSetting, cConfigAggregate;
+static VALUE cConfigFormatDefault, cConfigFormatHex;
+static VALUE cConfigFixnum, cConfigBignum, cConfigFloat, cConfigBoolean, cConfigString;
+static VALUE cConfigGroup, cConfigList, cConfigArray;
+
+static VALUE rSettingNameRegexp;
+static VALUE aConfigSettings, aConfigScalars, aConfigAggregates;
+static VALUE eConfigParseError, eSettingNotFoundError, eSettingFormatError, eSettingNameError;
+
+static VALUE rconfig_wrap_value(config_setting_t* setting)
+{
+ switch(config_setting_type(setting)) {
+ case CONFIG_TYPE_INT:
+ return LONG2FIX(config_setting_get_int(setting));
+
+ case CONFIG_TYPE_INT64:
+ return rb_ll2inum(config_setting_get_int64(setting));
+
+ case CONFIG_TYPE_FLOAT:
+ return rb_float_new(config_setting_get_float(setting));
+
+ case CONFIG_TYPE_STRING:
+ return rb_str_new2(config_setting_get_string(setting));
+
+ case CONFIG_TYPE_BOOL:
+ return config_setting_get_bool(setting) ? Qtrue : Qfalse;
+
+ default:
+ rb_bug("unknown value type %d", config_setting_type(setting));
+ }
+}
+
+static void rconfig_free_setting(config_setting_t* setting)
+{
+ // dummy
+}
+
+static VALUE rconfig_prepare_setting(config_setting_t* setting)
+{
+ VALUE wrapper = Data_Wrap_Struct(rb_cObject, 0, rconfig_free_setting, setting);
+ config_setting_set_hook(setting, (void*) wrapper);
+ return wrapper;
+}
+
+static void rconfig_destroy_setting(void* hook)
+{
+ if(hook != NULL) {
+ VALUE wrapper = (VALUE) hook;
+ rb_iv_set(wrapper, "@setting", Qnil);
+ }
+}
+
+static VALUE rconfig_wrap_setting(config_setting_t* setting)
+{
+ VALUE rbSetting = rconfig_prepare_setting(setting);
+
+ switch(config_setting_type(setting)) {
+ case CONFIG_TYPE_INT:
+ return rb_funcall(cConfigFixnum, rb_intern("new"), 2, LONG2FIX(config_setting_get_int(setting)), rbSetting);
+
+ case CONFIG_TYPE_INT64:
+ return rb_funcall(cConfigBignum, rb_intern("new"), 2, rb_ll2inum(config_setting_get_int64(setting)), rbSetting);
+
+ case CONFIG_TYPE_FLOAT:
+ return rb_funcall(cConfigFloat, rb_intern("new"), 2, rb_float_new(config_setting_get_float(setting)), rbSetting);
+
+ case CONFIG_TYPE_STRING:
+ return rb_funcall(cConfigString, rb_intern("new"), 2, rb_str_new2(config_setting_get_string(setting)), rbSetting);
+
+ case CONFIG_TYPE_BOOL:
+ return rb_funcall(cConfigBoolean, rb_intern("new"), 2, config_setting_get_bool(setting) ? Qtrue : Qfalse, rbSetting);
+
+ case CONFIG_TYPE_ARRAY:
+ return rb_funcall(cConfigArray, rb_intern("new"), 2, Qnil, rbSetting);
+
+ case CONFIG_TYPE_LIST:
+ return rb_funcall(cConfigList, rb_intern("new"), 1, rbSetting);
+
+ case CONFIG_TYPE_GROUP:
+ return rb_funcall(cConfigGroup, rb_intern("new"), 1, rbSetting);
+
+ default:
+ rb_bug("[r] unknown setting type %d", config_setting_type(setting));
+ }
+}
+
+static void rconfig_update_setting(config_setting_t* setting, VALUE value)
+{
+ switch(config_setting_type(setting)) {
+ case CONFIG_TYPE_INT:
+ config_setting_set_int(setting, FIX2LONG(value));
+ break;
+
+ case CONFIG_TYPE_INT64:
+ if(TYPE(value) == T_BIGNUM)
+ config_setting_set_int64(setting, rb_big2ll(value));
+ else // T_FIXNUM
+ config_setting_set_int64(setting, FIX2INT(value));
+ break;
+
+ case CONFIG_TYPE_FLOAT:
+// ruby1.9 check
+#if HAVE_RB_BLOCK_CALL
+ config_setting_set_float(setting, RFLOAT(value)->float_value);
+#else
+ config_setting_set_float(setting, RFLOAT(value)->value);
+#endif
+ break;
+
+ case CONFIG_TYPE_STRING:
+ config_setting_set_string(setting, RSTRING_PTR(value));
+ break;
+
+ case CONFIG_TYPE_BOOL:
+ config_setting_set_bool(setting, value == Qtrue);
+ break;
+
+ default:
+ rb_bug("[w] unknown setting type %d", config_setting_type(setting));
+ }
+}
+
+static void rconfig_check_setting_type(VALUE object, VALUE value)
+{
+ if(rb_obj_class(object) == cConfigFixnum) {
+ Check_Type(value, T_FIXNUM);
+ } else if(rb_obj_class(object) == cConfigBignum) {
+ if(TYPE(value) != T_BIGNUM && TYPE(value) != T_FIXNUM)
+ rb_raise(rb_eTypeError, "wrong argument type %s (expected Fixnum or Bignum)", rb_obj_classname(value));
+ } else if(rb_obj_class(object) == cConfigFloat) {
+ Check_Type(value, T_FLOAT);
+ } else if(rb_obj_class(object) == cConfigString) {
+ Check_Type(value, T_STRING);
+ } else if(rb_obj_class(object) == cConfigBoolean) {
+ if(value != Qtrue && value != Qfalse)
+ rb_raise(rb_eTypeError, "wrong argument type %s (expected boolean)", rb_obj_classname(value));
+ } else {
+ rb_raise(rb_eException, "never use Config::Setting itself");
+ }
+}
+
+static int rconfig_do_append(config_setting_t* setting, VALUE target, VALUE name)
+{
+ int type;
+ if(rb_obj_class(target) == cConfigFixnum)
+ type = CONFIG_TYPE_INT;
+ else if(rb_obj_class(target) == cConfigBignum)
+ type = CONFIG_TYPE_INT64;
+ else if(rb_obj_class(target) == cConfigFloat)
+ type = CONFIG_TYPE_FLOAT;
+ else if(rb_obj_class(target) == cConfigString)
+ type = CONFIG_TYPE_STRING;
+ else if(rb_obj_class(target) == cConfigBoolean)
+ type = CONFIG_TYPE_BOOL;
+ else if(rb_obj_class(target) == cConfigGroup)
+ type = CONFIG_TYPE_GROUP;
+ else if(rb_obj_class(target) == cConfigList)
+ type = CONFIG_TYPE_LIST;
+ else if(rb_obj_class(target) == cConfigArray)
+ type = CONFIG_TYPE_ARRAY;
+ else
+ rb_bug("unknown setting class %s", rb_obj_classname(target));
+
+ config_setting_t* new_setting;
+ if(name == Qnil) {
+ new_setting = config_setting_add(setting, NULL, type);
+ } else {
+ Check_Type(name, T_STRING);
+ new_setting = config_setting_add(setting, RSTRING_PTR(name), type);
+ }
+
+ if(new_setting == NULL)
+ return 0;
+
+ VALUE rbNewSetting = rconfig_prepare_setting(new_setting);
+ rb_iv_set(target, "@setting", rbNewSetting);
+
+ if(rb_ary_includes(aConfigScalars, rb_obj_class(target)) == Qtrue)
+ rconfig_update_setting(new_setting, rb_iv_get(target, "@value"));
+
+ if(rb_ary_includes(aConfigAggregates, rb_obj_class(target)) == Qtrue) {
+ if(rb_obj_class(target) == cConfigGroup) {
+ VALUE hash = rb_iv_get(target, "@hash");
+ VALUE children = rb_funcall(hash, rb_intern("keys"), 0);
+ int i;
+ for(i = 0; i < RARRAY_LEN(children); i++) {
+ VALUE key = RARRAY_PTR(children)[i];
+ rconfig_do_append(new_setting, rb_hash_aref(hash, key), key);
+ }
+ } else {
+ VALUE children = rb_iv_get(target, "@list");
+ int i;
+ for(i = 0; i < RARRAY_LEN(children); i++) {
+ rconfig_do_append(new_setting, RARRAY_PTR(children)[i], Qnil);
+ }
+ }
+ }
+
+ return 1;
+}
+
+static VALUE rbConfigBaseSetting_initialize(VALUE self, VALUE setting)
+{
+ if(setting != Qnil)
+ Check_Type(setting, T_DATA);
+ rb_iv_set(self, "@setting", setting);
+
+ return self;
+}
+
+static VALUE rbConfigBaseSetting_name(VALUE self)
+{
+ if(rb_iv_get(self, "@setting") != Qnil) {
+ config_setting_t* setting = NULL;
+ Data_Get_Struct(rb_iv_get(self, "@setting"), config_setting_t, setting);
+ return rb_str_new2(config_setting_name(setting));
+ } else {
+ return Qnil;
+ }
+}
+
+static VALUE rbConfigBaseSetting_parent(VALUE self)
+{
+ if(rb_iv_get(self, "@setting") != Qnil) {
+ config_setting_t* setting = NULL;
+ Data_Get_Struct(rb_iv_get(self, "@setting"), config_setting_t, setting);
+ return rconfig_wrap_setting(config_setting_parent(setting));
+ } else {
+ return Qnil;
+ }
+}
+
+static VALUE rbConfigBaseSetting_is_root(VALUE self)
+{
+ if(rb_iv_get(self, "@setting") != Qnil) {
+ config_setting_t* setting = NULL;
+ Data_Get_Struct(rb_iv_get(self, "@setting"), config_setting_t, setting);
+ return config_setting_is_root(setting) ? Qtrue : Qfalse;
+ } else {
+ return Qnil;
+ }
+}
+
+static VALUE rbConfigBaseSetting_index(VALUE self)
+{
+ if(rb_iv_get(self, "@setting") != Qnil) {
+ config_setting_t* setting = NULL;
+ Data_Get_Struct(rb_iv_get(self, "@setting"), config_setting_t, setting);
+ return INT2FIX(config_setting_index(setting));
+ } else {
+ return Qnil;
+ }
+}
+
+static VALUE rbConfigBaseSetting_line(VALUE self)
+{
+ if(rb_iv_get(self, "@setting") != Qnil) {
+ config_setting_t* setting = NULL;
+ Data_Get_Struct(rb_iv_get(self, "@setting"), config_setting_t, setting);
+ return INT2FIX(config_setting_source_line(setting));
+ } else {
+ return Qnil;
+ }
+}
+
+static VALUE rbConfigSetting_initialize(int argc, VALUE* argv, VALUE self)
+{
+ VALUE value, setting;
+ rb_scan_args(argc, argv, "11", &value, &setting);
+
+ rb_call_super(1, &setting);
+
+ rconfig_check_setting_type(self, value);
+ rb_iv_set(self, "@value", value);
+
+ if(rb_iv_get(self, "@setting") != Qnil) {
+ config_setting_t* c_setting = NULL;
+ Data_Get_Struct(rb_iv_get(self, "@setting"), config_setting_t, c_setting);
+ rb_iv_set(self, "@format", INT2FIX(config_setting_get_format(c_setting)));
+ } else {
+ rb_iv_set(self, "@format", cConfigFormatDefault);
+ }
+
+ return self;
+}
+
+static VALUE rbConfigSetting_get_value(VALUE self)
+{
+ if(rb_iv_get(self, "@setting") != Qnil) {
+ config_setting_t* setting;
+ Data_Get_Struct(rb_iv_get(self, "@setting"), config_setting_t, setting);
+ return rconfig_wrap_value(setting);
+ } else {
+ return rb_iv_get(self, "@value");
+ }
+}
+
+static VALUE rbConfigSetting_set_value(VALUE self, VALUE new_value)
+{
+ rconfig_check_setting_type(self, new_value);
+
+ if(rb_iv_get(self, "@setting") != Qnil) {
+ config_setting_t* setting;
+ Data_Get_Struct(rb_iv_get(self, "@setting"), config_setting_t, setting);
+ rconfig_update_setting(setting, new_value);
+ }
+
+ rb_iv_set(self, "@value", new_value);
+
+ return new_value;
+}
+
+static VALUE rbConfigSetting_get_format(VALUE self)
+{
+ if(rb_iv_get(self, "@setting") != Qnil) {
+ config_setting_t* setting;
+ Data_Get_Struct(rb_iv_get(self, "@setting"), config_setting_t, setting);
+ return INT2FIX(config_setting_get_format(setting));
+ } else {
+ return rb_iv_get(self, "format");
+ }
+}
+
+static VALUE rbConfigSetting_set_format(VALUE self, VALUE new_format)
+{
+ if(rb_iv_get(self, "@setting") != Qnil) {
+ config_setting_t* setting;
+ Data_Get_Struct(rb_iv_get(self, "@setting"), config_setting_t, setting);
+ if(!config_setting_set_format(setting, FIX2INT(new_format)))
+ rb_raise(eSettingFormatError, "invalid setting format %d", FIX2INT(new_format));
+ }
+
+ rb_iv_set(self, "@format", new_format);
+
+ return new_format;
+}
+
+static VALUE rbConfigAggregate_get(VALUE self, VALUE index);
+
+static VALUE rbConfigAggregate_initialize(int argc, VALUE* argv, VALUE self)
+{
+ VALUE setting = Qnil;
+ if(rb_obj_class(self) == cConfigGroup || rb_obj_class(self) == cConfigList) {
+ rb_scan_args(argc, argv, "01", &setting);
+ } else if(rb_obj_class(self) == cConfigArray) {
+ VALUE type = Qnil;
+ rb_scan_args(argc, argv, "02", &type, &setting);
+
+ if(type != Qnil && rb_ary_includes(aConfigScalars, type) != Qtrue)
+ rb_raise(rb_eTypeError, "invalid setting array type %s", rb_class2name(type));
+
+ rb_iv_set(self, "@type", type);
+ } else {
+ rb_raise(rb_eException, "never create Config::Aggregate itself");
+ }
+
+ rb_call_super(1, &setting);
+
+ rb_iv_set(self, "@list", rb_ary_new());
+ if(rb_obj_class(self) == cConfigGroup)
+ rb_iv_set(self, "@hash", rb_hash_new());
+
+ if(setting != Qnil && rb_obj_class(self) == cConfigArray) {
+ config_setting_t* c_setting;
+ Data_Get_Struct(setting, config_setting_t, c_setting);
+ if(config_setting_length(c_setting) > 0)
+ rb_iv_set(self, "@type", rb_obj_class(rbConfigAggregate_get(self, INT2FIX(0))));
+ }
+
+ return self;
+}
+
+static VALUE rbConfigAggregate_size(VALUE self)
+{
+ config_setting_t* setting = NULL;
+ if(rb_iv_get(self, "@setting") != Qnil)
+ Data_Get_Struct(rb_iv_get(self, "@setting"), config_setting_t, setting);
+
+ if(setting)
+ return INT2FIX(config_setting_length(setting));
+ else
+ return INT2FIX(RARRAY_LEN(rb_iv_get(self, "@list")));
+}
+
+static VALUE rbConfigAggregate_get(VALUE self, VALUE index)
+{
+ config_setting_t* setting = NULL;
+ if(rb_iv_get(self, "@setting") != Qnil)
+ Data_Get_Struct(rb_iv_get(self, "@setting"), config_setting_t, setting);
+
+ VALUE rbTarget = Qnil;
+
+ if(TYPE(index) == T_STRING && rb_obj_class(self) == cConfigGroup) {
+ if(setting) {
+ config_setting_t* target = config_setting_get_member(setting, RSTRING_PTR(index));
+ if(target)
+ rbTarget = rconfig_wrap_setting(target);
+ } else {
+ rbTarget = rb_hash_aref(rb_iv_get(self, "@hash"), index);
+ }
+ } else if(TYPE(index) == T_FIXNUM) {
+ if(setting) {
+ config_setting_t* target = config_setting_get_elem(setting, FIX2INT(index));
+ if(target)
+ rbTarget = rconfig_wrap_setting(target);
+ } else {
+ rbTarget = rb_ary_entry(rb_iv_get(self, "@list"), FIX2INT(index));
+ }
+ } else {
+ rb_raise(rb_eTypeError, "wrong argument type %s (expected String or Fixnum)", rb_obj_classname(index));
+ }
+
+ if(rbTarget == Qnil)
+ if(TYPE(index) == T_STRING)
+ rb_raise(eSettingNotFoundError, "setting `%s' not found", RSTRING_PTR(index));
+ else
+ rb_raise(eSettingNotFoundError, "setting [%d] not found", FIX2INT(index));
+
+ return rbTarget;
+}
+
+static VALUE rbConfigAggregate_append(VALUE self, VALUE target)
+{
+ config_setting_t* setting = NULL;
+ if(rb_iv_get(self, "@setting") != Qnil)
+ Data_Get_Struct(rb_iv_get(self, "@setting"), config_setting_t, setting);
+
+ Check_Type(target, T_OBJECT);
+
+ VALUE type = rb_iv_get(self, "@type");
+ if(rb_obj_class(self) == cConfigArray) {
+ if(type != Qnil && type != rb_obj_class(target))
+ rb_raise(rb_eTypeError, "wrong argument type %s (expected %s)", rb_obj_classname(target), rb_class2name(type));
+ if(type == Qnil && rb_ary_includes(aConfigScalars, rb_obj_class(target)) != Qtrue)
+ rb_raise(rb_eTypeError, "invalid setting array type %s", rb_obj_classname(target));
+ }
+
+ if(rb_ary_includes(aConfigSettings, rb_obj_class(target)) == Qtrue) {
+ if(setting)
+ rconfig_do_append(setting, target, Qnil);
+ rb_ary_push(rb_iv_get(self, "@list"), target);
+ } else {
+ rb_raise(rb_eTypeError, "wrong argument type %s (expected Config::BaseSetting)", rb_obj_classname(target));
+ }
+
+ if(rb_obj_class(self) == cConfigArray && type == Qnil)
+ rb_iv_set(self, "@type", rb_obj_class(target));
+
+ return target;
+}
+
+static VALUE rbConfigGroup_append(VALUE self, VALUE name, VALUE target)
+{
+ Check_Type(name, T_STRING);
+ Check_Type(target, T_OBJECT);
+
+ config_setting_t* setting = NULL;
+ if(rb_iv_get(self, "@setting") != Qnil)
+ Data_Get_Struct(rb_iv_get(self, "@setting"), config_setting_t, setting);
+
+ if(rb_ary_includes(aConfigSettings, rb_obj_class(target)) == Qtrue) {
+ if(rb_reg_match(rSettingNameRegexp, name) == Qnil)
+ rb_raise(eSettingNameError, "setting name `%s' contains invalid characters", RSTRING_PTR(name));
+ if(setting) {
+ if(!rconfig_do_append(setting, target, name))
+ rb_raise(eSettingNameError, "setting `%s' already exists", RSTRING_PTR(name));
+ } else if(rb_hash_aref(rb_iv_get(self, "@hash"), name) != Qnil) {
+ rb_raise(eSettingNameError, "setting `%s' already exists", RSTRING_PTR(name));
+ }
+ rb_ary_push(rb_iv_get(self, "@list"), target);
+ rb_hash_aset(rb_iv_get(self, "@hash"), name, target);
+ } else {
+ rb_raise(rb_eTypeError, "wrong argument type %s (expected Config::BaseSetting)", rb_obj_classname(target));
+ }
+
+ return target;
+}
+
+static VALUE rbConfigAggregate_delete(VALUE self, VALUE target)
+{
+ config_setting_t* setting = NULL;
+ if(rb_iv_get(self, "@setting") != Qnil)
+ Data_Get_Struct(rb_iv_get(self, "@setting"), config_setting_t, setting);
+
+ VALUE hash = rb_iv_get(self, "@hash"), list = rb_iv_get(self, "@list");
+
+ if(TYPE(target) == T_STRING && rb_obj_class(self) == cConfigGroup) {
+ if(setting)
+ config_setting_remove(setting, RSTRING_PTR(target));
+
+ rb_ary_delete_at(list, rb_hash_aref(hash, target));
+ rb_hash_delete(hash, target);
+ } else if(TYPE(target) == T_FIXNUM) {
+ int index = FIX2INT(target);
+ if(setting)
+ config_setting_remove_elem(setting, index);
+
+ if(rb_obj_class(self) == cConfigGroup)
+ rb_hash_delete(hash, rbConfigBaseSetting_name(rb_ary_entry(list, index)));
+ rb_ary_delete_at(list, index);
+ } else if(rb_ary_includes(aConfigSettings, rb_obj_class(target)) == Qtrue) {
+ VALUE name = rbConfigBaseSetting_name(target);
+ if(setting)
+ config_setting_remove(setting, RSTRING_PTR(name));
+
+ if(rb_obj_class(self) == cConfigGroup)
+ rb_hash_delete(hash, name);
+ rb_ary_delete(list, target);
+ } else {
+ if(rb_obj_class(self) == cConfigGroup)
+ rb_raise(rb_eTypeError, "wrong argument type %s (expected String, Fixnum or Config::BaseSetting)", rb_obj_classname(target));
+ else
+ rb_raise(rb_eTypeError, "wrong argument type %s (expected Fixnum or Config::BaseSetting)", rb_obj_classname(target));
+ }
+
+ return Qnil;
+}
+
+static VALUE rbConfig_initialize(VALUE self)
+{
+ config_t* config = (config_t*) malloc(sizeof(config_t));
+ config_init(config);
+ config_set_destructor(config, &rconfig_destroy_setting);
+
+ VALUE rbConfig = Data_Wrap_Struct(rb_cObject, 0, config_destroy, config);
+ rb_iv_set(self, "@config", rbConfig);
+
+ return self;
+}
+
+static VALUE rbConfig_read_bang(VALUE self, VALUE path)
+{
+ Check_Type(path, T_STRING);
+
+ config_t* config;
+ Data_Get_Struct(rb_iv_get(self, "@config"), config_t, config);
+
+ if(!config_read_file(config, RSTRING_PTR(path))) {
+ if(config_error_line(config) == 0)
+ rb_raise(rb_eIOError, "cannot load config: I/O error");
+ else
+ rb_raise(eConfigParseError, "cannot parse config on line %d: `%s'",
+ config_error_line(config), config_error_text(config));
+ }
+
+ return Qtrue;
+}
+
+static VALUE rbConfig_write_bang(VALUE self, VALUE path)
+{
+ Check_Type(path, T_STRING);
+
+ config_t* config;
+ Data_Get_Struct(rb_iv_get(self, "@config"), config_t, config);
+
+ if(!config_write_file(config, RSTRING_PTR(path)))
+ rb_raise(rb_eIOError, "cannot save config: I/O error");
+
+ return Qtrue;
+}
+
+static VALUE rbConfig_read(VALUE self, VALUE path)
+{
+ Check_Type(path, T_STRING);
+
+ config_t* config;
+ Data_Get_Struct(rb_iv_get(self, "@config"), config_t, config);
+
+ return config_read_file(config, RSTRING_PTR(path)) ? Qtrue : Qfalse;
+}
+
+static VALUE rbConfig_write(VALUE self, VALUE path)
+{
+ Check_Type(path, T_STRING);
+
+ config_t* config;
+ Data_Get_Struct(rb_iv_get(self, "@config"), config_t, config);
+
+ return config_write_file(config, RSTRING_PTR(path)) ? Qtrue : Qfalse;
+}
+
+static VALUE rbConfig_root(VALUE self)
+{
+ config_t* config;
+ Data_Get_Struct(rb_iv_get(self, "@config"), config_t, config);
+
+ return rconfig_wrap_setting(config_root_setting(config));
+}
+
+static VALUE rbConfig_lookup(VALUE self, VALUE handle)
+{
+ if(TYPE(handle) == T_STRING) {
+ config_t* config;
+ Data_Get_Struct(rb_iv_get(self, "@config"), config_t, config);
+
+ config_setting_t* setting;
+ setting = config_lookup(config, RSTRING_PTR(handle));
+
+ if(setting == NULL)
+ rb_raise(eSettingNotFoundError, "setting `%s' not found", RSTRING_PTR(handle));
+
+ return rconfig_wrap_setting(setting);
+ } else if(TYPE(handle) == T_FIXNUM) {
+ return rbConfigAggregate_get(rbConfig_root(self), handle);
+ } else {
+ rb_raise(rb_eTypeError, "wrong argument type %s (expected String or Fixnum)", rb_obj_classname(handle));
+ }
+}
+
+static VALUE rbConfig_append(VALUE self, VALUE name, VALUE target)
+{
+ return rbConfigGroup_append(rbConfig_root(self), name, target);
+}
+
+static VALUE rbConfig_delete(VALUE self, VALUE name)
+{
+ return rbConfigAggregate_delete(rbConfig_root(self), name);
+}
+
+static VALUE rbConfig_size(VALUE self)
+{
+ return rbConfigAggregate_size(rbConfig_root(self));
+}
+
+void Init_rconfig()
+{
+ cConfig = rb_define_class("Config", rb_cObject);
+ rb_define_method(cConfig, "initialize", rbConfig_initialize, 0);
+ rb_define_method(cConfig, "read!", rbConfig_read_bang, 1);
+ rb_define_method(cConfig, "write!", rbConfig_write_bang, 1);
+ rb_define_method(cConfig, "read", rbConfig_read, 1);
+ rb_define_method(cConfig, "write", rbConfig_write, 1);
+ rb_define_method(cConfig, "root", rbConfig_root, 0);
+ rb_define_method(cConfig, "lookup", rbConfig_lookup, 1);
+ rb_define_method(cConfig, "[]", rbConfig_lookup, 1);
+ rb_define_method(cConfig, "append", rbConfig_append, 2);
+ rb_define_method(cConfig, "delete", rbConfig_delete, 1);
+ rb_define_method(cConfig, "size", rbConfig_size, 0);
+
+ cConfigBaseSetting = rb_define_class_under(cConfig, "BaseSetting", rb_cObject);
+ rb_define_method(cConfigBaseSetting, "initialize", rbConfigBaseSetting_initialize, 1);
+ rb_define_method(cConfigBaseSetting, "name", rbConfigBaseSetting_name, 0);
+ rb_define_method(cConfigBaseSetting, "parent", rbConfigBaseSetting_parent, 0);
+ rb_define_method(cConfigBaseSetting, "root?", rbConfigBaseSetting_is_root, 0);
+ rb_define_method(cConfigBaseSetting, "index", rbConfigBaseSetting_index, 0);
+ rb_define_method(cConfigBaseSetting, "line", rbConfigBaseSetting_line, 0);
+
+ cConfigSetting = rb_define_class_under(cConfig, "Setting", cConfigBaseSetting);
+ rb_define_method(cConfigSetting, "initialize", rbConfigSetting_initialize, -1);
+ rb_define_method(cConfigSetting, "value", rbConfigSetting_get_value, 0);
+ rb_define_method(cConfigSetting, "value=", rbConfigSetting_set_value, 1);
+ rb_define_method(cConfigSetting, "format", rbConfigSetting_get_format, 0);
+ rb_define_method(cConfigSetting, "format=", rbConfigSetting_set_format, 1);
+
+ cConfigFormatDefault = INT2FIX(CONFIG_FORMAT_DEFAULT);
+ rb_define_const(cConfig, "FORMAT_DEFAULT", cConfigFormatDefault);
+ cConfigFormatHex = INT2FIX(CONFIG_FORMAT_HEX);
+ rb_define_const(cConfig, "FORMAT_HEX", cConfigFormatHex);
+
+ cConfigFixnum = rb_define_class_under(cConfig, "Fixnum", cConfigSetting);
+ cConfigBignum = rb_define_class_under(cConfig, "Bignum", cConfigSetting);
+ cConfigFloat = rb_define_class_under(cConfig, "Float", cConfigSetting);
+ cConfigBoolean = rb_define_class_under(cConfig, "Boolean", cConfigSetting);
+ cConfigString = rb_define_class_under(cConfig, "String", cConfigSetting);
+
+ cConfigAggregate = rb_define_class_under(cConfig, "Aggregate", cConfigBaseSetting);
+ rb_define_method(cConfigAggregate, "initialize", rbConfigAggregate_initialize, -1);
+ rb_define_method(cConfigAggregate, "size", rbConfigAggregate_size, 0);
+ rb_define_method(cConfigAggregate, "get", rbConfigAggregate_get, 1);
+ rb_define_method(cConfigAggregate, "[]", rbConfigAggregate_get, 1);
+ rb_define_method(cConfigAggregate, "delete", rbConfigAggregate_delete, 1);
+
+ cConfigGroup = rb_define_class_under(cConfig, "Group", cConfigAggregate);
+ rb_define_method(cConfigGroup, "append", rbConfigGroup_append, 2);
+ cConfigArray = rb_define_class_under(cConfig, "Array", cConfigAggregate);
+ rb_define_method(cConfigArray, "append", rbConfigAggregate_append, 1);
+ rb_define_method(cConfigArray, "<<", rbConfigAggregate_append, 1);
+ cConfigList = rb_define_class_under(cConfig, "List", cConfigAggregate);
+ rb_define_method(cConfigList, "append", rbConfigAggregate_append, 1);
+ rb_define_method(cConfigList, "<<", rbConfigAggregate_append, 1);
+
+ aConfigScalars = rb_ary_new3(5, cConfigFixnum, cConfigBignum, cConfigFloat, cConfigBoolean, cConfigString);
+ aConfigAggregates = rb_ary_new3(3, cConfigGroup, cConfigArray, cConfigList);
+ aConfigSettings = rb_ary_plus(aConfigScalars, aConfigAggregates);
+
+ rb_define_const(cConfig, "SCALARS", aConfigScalars);
+ rb_define_const(cConfig, "AGGREGATES", aConfigAggregates);
+ rb_define_const(cConfig, "SETTINGS", aConfigSettings);
+
+ char* settingNameRegexp = "^[A-Za-z*][A-Za-z\\-_*]*$";
+ rSettingNameRegexp = rb_reg_new(settingNameRegexp, strlen(settingNameRegexp), 0);
+
+ eConfigParseError = rb_define_class("ConfigParseError", rb_eException);
+ eSettingNotFoundError = rb_define_class("SettingNotFoundError", rb_eException);
+ eSettingFormatError = rb_define_class("SettingFormatError", rb_eException);
+ eSettingNameError = rb_define_class("SettingNameError", rb_eException);
+}