diff options
author | Jonathan McCrohan <jmccrohan@gmail.com> | 2011-12-01 22:56:23 +0000 |
---|---|---|
committer | Jonathan McCrohan <jmccrohan@gmail.com> | 2011-12-01 22:56:23 +0000 |
commit | 429e46051dba814e7d6c74368eb1bba550222cbe (patch) | |
tree | ed1dd43cd23c69f156aae2165006a16a66262cef /contrib | |
parent | 58bf1382be0cbcf3f9649286fd2719b789a1595f (diff) | |
download | libconfig-faaa576c7d4f56a6633683e3261ae99582bf887a.tar.gz |
Imported Upstream version 1.4.8upstream/1.4.8
Diffstat (limited to 'contrib')
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 Binary files differnew file mode 100755 index 0000000..da7f565 --- /dev/null +++ b/contrib/cmake/CMakeFiles/CMakeDetermineCompilerABI_C.bin diff --git a/contrib/cmake/CMakeFiles/CMakeDetermineCompilerABI_CXX.bin b/contrib/cmake/CMakeFiles/CMakeDetermineCompilerABI_CXX.bin Binary files differnew file mode 100755 index 0000000..52505ce --- /dev/null +++ b/contrib/cmake/CMakeFiles/CMakeDetermineCompilerABI_CXX.bin 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 Binary files differnew file mode 100755 index 0000000..b18090c --- /dev/null +++ b/contrib/cmake/CMakeFiles/CompilerIdC/a.out 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 Binary files differnew file mode 100755 index 0000000..74b17e6 --- /dev/null +++ b/contrib/cmake/CMakeFiles/CompilerIdCXX/a.out 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); +} |