starts ucx 3.0 development

Sat, 06 Feb 2021 19:11:44 +0100

author
Mike Becker <universe@uap-core.de>
date
Sat, 06 Feb 2021 19:11:44 +0100
changeset 390
d345541018fa
parent 389
92e482410453
child 391
f094a53c1178

starts ucx 3.0 development

.hgignore file | annotate | diff | comparison | revisions
CHANGELOG file | annotate | diff | comparison | revisions
CMakeLists.txt file | annotate | diff | comparison | revisions
COPYING file | annotate | diff | comparison | revisions
Makefile.am file | annotate | diff | comparison | revisions
README file | annotate | diff | comparison | revisions
autogen.sh file | annotate | diff | comparison | revisions
cmake_infile.doxygen file | annotate | diff | comparison | revisions
configure.ac file | annotate | diff | comparison | revisions
docs/api-2.1/allocator_8h.html file | annotate | diff | comparison | revisions
docs/api-2.1/allocator_8h_source.html file | annotate | diff | comparison | revisions
docs/api-2.1/annotated.html file | annotate | diff | comparison | revisions
docs/api-2.1/array_8h.html file | annotate | diff | comparison | revisions
docs/api-2.1/array_8h_source.html file | annotate | diff | comparison | revisions
docs/api-2.1/avl_8h.html file | annotate | diff | comparison | revisions
docs/api-2.1/avl_8h_source.html file | annotate | diff | comparison | revisions
docs/api-2.1/bc_s.png file | annotate | diff | comparison | revisions
docs/api-2.1/bdwn.png file | annotate | diff | comparison | revisions
docs/api-2.1/buffer_8h.html file | annotate | diff | comparison | revisions
docs/api-2.1/buffer_8h_source.html file | annotate | diff | comparison | revisions
docs/api-2.1/classes.html file | annotate | diff | comparison | revisions
docs/api-2.1/closed.png file | annotate | diff | comparison | revisions
docs/api-2.1/dir_68267d1309a1af8e8297ef4c3efbcdba.html file | annotate | diff | comparison | revisions
docs/api-2.1/dir_69f4ea29401808fe6229564976cde3ce.html file | annotate | diff | comparison | revisions
docs/api-2.1/doc.png file | annotate | diff | comparison | revisions
docs/api-2.1/doxygen.css file | annotate | diff | comparison | revisions
docs/api-2.1/doxygen.png file | annotate | diff | comparison | revisions
docs/api-2.1/dynsections.js file | annotate | diff | comparison | revisions
docs/api-2.1/files.html file | annotate | diff | comparison | revisions
docs/api-2.1/folderclosed.png file | annotate | diff | comparison | revisions
docs/api-2.1/folderopen.png file | annotate | diff | comparison | revisions
docs/api-2.1/functions.html file | annotate | diff | comparison | revisions
docs/api-2.1/functions_vars.html file | annotate | diff | comparison | revisions
docs/api-2.1/globals.html file | annotate | diff | comparison | revisions
docs/api-2.1/globals_a.html file | annotate | diff | comparison | revisions
docs/api-2.1/globals_c.html file | annotate | diff | comparison | revisions
docs/api-2.1/globals_d.html file | annotate | diff | comparison | revisions
docs/api-2.1/globals_defs.html file | annotate | diff | comparison | revisions
docs/api-2.1/globals_func.html file | annotate | diff | comparison | revisions
docs/api-2.1/globals_func_u.html file | annotate | diff | comparison | revisions
docs/api-2.1/globals_p.html file | annotate | diff | comparison | revisions
docs/api-2.1/globals_r.html file | annotate | diff | comparison | revisions
docs/api-2.1/globals_s.html file | annotate | diff | comparison | revisions
docs/api-2.1/globals_type.html file | annotate | diff | comparison | revisions
docs/api-2.1/globals_u.html file | annotate | diff | comparison | revisions
docs/api-2.1/globals_w.html file | annotate | diff | comparison | revisions
docs/api-2.1/index.html file | annotate | diff | comparison | revisions
docs/api-2.1/jquery.js file | annotate | diff | comparison | revisions
docs/api-2.1/list_8h.html file | annotate | diff | comparison | revisions
docs/api-2.1/list_8h_source.html file | annotate | diff | comparison | revisions
docs/api-2.1/logging_8h.html file | annotate | diff | comparison | revisions
docs/api-2.1/logging_8h_source.html file | annotate | diff | comparison | revisions
docs/api-2.1/map_8h.html file | annotate | diff | comparison | revisions
docs/api-2.1/map_8h_source.html file | annotate | diff | comparison | revisions
docs/api-2.1/mempool_8h.html file | annotate | diff | comparison | revisions
docs/api-2.1/mempool_8h_source.html file | annotate | diff | comparison | revisions
docs/api-2.1/menu.js file | annotate | diff | comparison | revisions
docs/api-2.1/menudata.js file | annotate | diff | comparison | revisions
docs/api-2.1/nav_f.png file | annotate | diff | comparison | revisions
docs/api-2.1/nav_g.png file | annotate | diff | comparison | revisions
docs/api-2.1/nav_h.png file | annotate | diff | comparison | revisions
docs/api-2.1/open.png file | annotate | diff | comparison | revisions
docs/api-2.1/properties_8h.html file | annotate | diff | comparison | revisions
docs/api-2.1/properties_8h_source.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_0.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_0.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_1.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_1.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_10.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_10.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_11.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_11.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_12.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_12.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_13.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_13.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_2.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_2.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_3.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_3.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_4.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_4.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_5.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_5.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_6.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_6.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_7.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_7.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_8.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_8.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_9.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_9.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_a.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_a.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_b.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_b.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_c.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_c.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_d.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_d.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_e.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_e.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_f.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/all_f.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/classes_0.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/classes_0.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/classes_1.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/classes_1.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/close.png file | annotate | diff | comparison | revisions
docs/api-2.1/search/defines_0.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/defines_0.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/defines_1.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/defines_1.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/defines_2.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/defines_2.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/defines_3.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/defines_3.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/defines_4.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/defines_4.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/files_0.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/files_0.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/files_1.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/files_1.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/files_2.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/files_2.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/files_3.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/files_3.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/files_4.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/files_4.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/files_5.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/files_5.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/files_6.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/files_6.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/files_7.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/files_7.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/functions_0.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/functions_0.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/functions_1.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/functions_1.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/mag_sel.png file | annotate | diff | comparison | revisions
docs/api-2.1/search/nomatches.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/pages_0.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/pages_0.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/search.css file | annotate | diff | comparison | revisions
docs/api-2.1/search/search.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/search_l.png file | annotate | diff | comparison | revisions
docs/api-2.1/search/search_m.png file | annotate | diff | comparison | revisions
docs/api-2.1/search/search_r.png file | annotate | diff | comparison | revisions
docs/api-2.1/search/searchdata.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/typedefs_0.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/typedefs_0.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/typedefs_1.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/typedefs_1.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/typedefs_2.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/typedefs_2.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/typedefs_3.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/typedefs_3.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/typedefs_4.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/typedefs_4.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_0.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_0.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_1.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_1.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_10.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_10.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_11.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_11.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_12.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_12.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_2.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_2.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_3.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_3.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_4.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_4.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_5.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_5.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_6.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_6.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_7.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_7.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_8.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_8.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_9.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_9.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_a.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_a.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_b.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_b.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_c.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_c.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_d.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_d.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_e.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_e.js file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_f.html file | annotate | diff | comparison | revisions
docs/api-2.1/search/variables_f.js file | annotate | diff | comparison | revisions
docs/api-2.1/splitbar.png file | annotate | diff | comparison | revisions
docs/api-2.1/stack_8h.html file | annotate | diff | comparison | revisions
docs/api-2.1/stack_8h_source.html file | annotate | diff | comparison | revisions
docs/api-2.1/string_8h.html file | annotate | diff | comparison | revisions
docs/api-2.1/string_8h_source.html file | annotate | diff | comparison | revisions
docs/api-2.1/structUcxAVLNode.html file | annotate | diff | comparison | revisions
docs/api-2.1/structUcxAVLTree.html file | annotate | diff | comparison | revisions
docs/api-2.1/structUcxAllocator.html file | annotate | diff | comparison | revisions
docs/api-2.1/structUcxArray.html file | annotate | diff | comparison | revisions
docs/api-2.1/structUcxBuffer.html file | annotate | diff | comparison | revisions
docs/api-2.1/structUcxKey.html file | annotate | diff | comparison | revisions
docs/api-2.1/structUcxList.html file | annotate | diff | comparison | revisions
docs/api-2.1/structUcxLogger.html file | annotate | diff | comparison | revisions
docs/api-2.1/structUcxMap.html file | annotate | diff | comparison | revisions
docs/api-2.1/structUcxMapElement.html file | annotate | diff | comparison | revisions
docs/api-2.1/structUcxMapIterator.html file | annotate | diff | comparison | revisions
docs/api-2.1/structUcxMapKey.html file | annotate | diff | comparison | revisions
docs/api-2.1/structUcxMempool.html file | annotate | diff | comparison | revisions
docs/api-2.1/structUcxProperties.html file | annotate | diff | comparison | revisions
docs/api-2.1/structUcxStack.html file | annotate | diff | comparison | revisions
docs/api-2.1/structUcxTestList.html file | annotate | diff | comparison | revisions
docs/api-2.1/structUcxTestSuite.html file | annotate | diff | comparison | revisions
docs/api-2.1/structscstr__t.html file | annotate | diff | comparison | revisions
docs/api-2.1/structsstr__t.html file | annotate | diff | comparison | revisions
docs/api-2.1/structucx__memchunk.html file | annotate | diff | comparison | revisions
docs/api-2.1/structucx__regdestr.html file | annotate | diff | comparison | revisions
docs/api-2.1/structucx__stack__metadata.html file | annotate | diff | comparison | revisions
docs/api-2.1/sync_off.png file | annotate | diff | comparison | revisions
docs/api-2.1/sync_on.png file | annotate | diff | comparison | revisions
docs/api-2.1/tab_a.png file | annotate | diff | comparison | revisions
docs/api-2.1/tab_b.png file | annotate | diff | comparison | revisions
docs/api-2.1/tab_h.png file | annotate | diff | comparison | revisions
docs/api-2.1/tab_s.png file | annotate | diff | comparison | revisions
docs/api-2.1/tabs.css file | annotate | diff | comparison | revisions
docs/api-2.1/test_8h.html file | annotate | diff | comparison | revisions
docs/api-2.1/test_8h_source.html file | annotate | diff | comparison | revisions
docs/api-2.1/uaplogo.png file | annotate | diff | comparison | revisions
docs/api-2.1/ucx_8h.html file | annotate | diff | comparison | revisions
docs/api-2.1/ucx_8h_source.html file | annotate | diff | comparison | revisions
docs/api-2.1/utils_8h.html file | annotate | diff | comparison | revisions
docs/api-2.1/utils_8h_source.html file | annotate | diff | comparison | revisions
docs/src/CMakeLists.txt file | annotate | diff | comparison | revisions
docs/src/Makefile file | annotate | diff | comparison | revisions
docs/src/header-ucx2.html file | annotate | diff | comparison | revisions
docs/src/header.html file | annotate | diff | comparison | revisions
docs/src/index.md file | annotate | diff | comparison | revisions
docs/src/install.md file | annotate | diff | comparison | revisions
docs/src/license.md file | annotate | diff | comparison | revisions
docs/src/modules-ucx2.md file | annotate | diff | comparison | revisions
docs/src/modules.md file | annotate | diff | comparison | revisions
src/CMakeLists.txt file | annotate | diff | comparison | revisions
src/Makefile.am file | annotate | diff | comparison | revisions
src/allocator.c file | annotate | diff | comparison | revisions
src/array.c file | annotate | diff | comparison | revisions
src/avl.c file | annotate | diff | comparison | revisions
src/buffer.c file | annotate | diff | comparison | revisions
src/cx/list.h file | annotate | diff | comparison | revisions
src/list.c file | annotate | diff | comparison | revisions
src/logging.c file | annotate | diff | comparison | revisions
src/map.c file | annotate | diff | comparison | revisions
src/mempool.c file | annotate | diff | comparison | revisions
src/properties.c file | annotate | diff | comparison | revisions
src/stack.c file | annotate | diff | comparison | revisions
src/string.c file | annotate | diff | comparison | revisions
src/test.c file | annotate | diff | comparison | revisions
src/ucx.c file | annotate | diff | comparison | revisions
src/ucx/allocator.h file | annotate | diff | comparison | revisions
src/ucx/array.h file | annotate | diff | comparison | revisions
src/ucx/avl.h file | annotate | diff | comparison | revisions
src/ucx/buffer.h file | annotate | diff | comparison | revisions
src/ucx/list.h file | annotate | diff | comparison | revisions
src/ucx/logging.h file | annotate | diff | comparison | revisions
src/ucx/map.h file | annotate | diff | comparison | revisions
src/ucx/mempool.h file | annotate | diff | comparison | revisions
src/ucx/properties.h file | annotate | diff | comparison | revisions
src/ucx/stack.h file | annotate | diff | comparison | revisions
src/ucx/string.h file | annotate | diff | comparison | revisions
src/ucx/test.h file | annotate | diff | comparison | revisions
src/ucx/ucx.h file | annotate | diff | comparison | revisions
src/ucx/utils.h file | annotate | diff | comparison | revisions
src/utils.c file | annotate | diff | comparison | revisions
test/CMakeLists.txt file | annotate | diff | comparison | revisions
test/Makefile.am file | annotate | diff | comparison | revisions
test/allocator_tests.c file | annotate | diff | comparison | revisions
test/allocator_tests.h file | annotate | diff | comparison | revisions
test/array_tests.c file | annotate | diff | comparison | revisions
test/array_tests.h file | annotate | diff | comparison | revisions
test/avl_tests.c file | annotate | diff | comparison | revisions
test/avl_tests.h file | annotate | diff | comparison | revisions
test/buffer_tests.c file | annotate | diff | comparison | revisions
test/buffer_tests.h file | annotate | diff | comparison | revisions
test/list_tests.c file | annotate | diff | comparison | revisions
test/list_tests.h file | annotate | diff | comparison | revisions
test/logging_tests.c file | annotate | diff | comparison | revisions
test/logging_tests.h file | annotate | diff | comparison | revisions
test/main.c file | annotate | diff | comparison | revisions
test/main.h file | annotate | diff | comparison | revisions
test/map_tests.c file | annotate | diff | comparison | revisions
test/map_tests.h file | annotate | diff | comparison | revisions
test/mpool_tests.c file | annotate | diff | comparison | revisions
test/mpool_tests.h file | annotate | diff | comparison | revisions
test/prop_tests.c file | annotate | diff | comparison | revisions
test/prop_tests.h file | annotate | diff | comparison | revisions
test/stack_tests.c file | annotate | diff | comparison | revisions
test/stack_tests.h file | annotate | diff | comparison | revisions
test/string_tests.c file | annotate | diff | comparison | revisions
test/string_tests.h file | annotate | diff | comparison | revisions
test/test_list.c file | annotate | diff | comparison | revisions
test/utils_tests.c file | annotate | diff | comparison | revisions
test/utils_tests.h file | annotate | diff | comparison | revisions
--- a/.hgignore	Mon Dec 30 09:54:10 2019 +0100
+++ b/.hgignore	Sat Feb 06 19:11:44 2021 +0100
@@ -26,7 +26,7 @@
 /\.deps/
 /\.libs/
 ^stamp-h
-^test/ucxtest
+test/test_list.c
 /test-suite.log$
 ^ucx-.*\.tar.gz$
 ^.idea/
--- a/CHANGELOG	Mon Dec 30 09:54:10 2019 +0100
+++ b/CHANGELOG	Sat Feb 06 19:11:44 2021 +0100
@@ -1,3 +1,8 @@
+Version 3.0 M1
+--------------
+work in progress
+
+
 Version 2.1 - 2019-12-30
 ------------------------
 
--- a/CMakeLists.txt	Mon Dec 30 09:54:10 2019 +0100
+++ b/CMakeLists.txt	Sat Feb 06 19:11:44 2021 +0100
@@ -1,5 +1,5 @@
-cmake_minimum_required(VERSION 3.10)
-project(ucx VERSION 2.1 DESCRIPTION "UAP Common Extensions")
+cmake_minimum_required(VERSION 3.14)
+project(ucx VERSION 3.0 DESCRIPTION "UAP Common Extensions")
 
 # Configuration
 set(CMAKE_C_STANDARD 11)
@@ -11,7 +11,6 @@
 # Tests
 enable_testing()
 add_subdirectory(test)
-add_test(NAME test COMMAND ucxtest WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/test")
 
 # Web Documentation
 add_subdirectory(docs/src)
@@ -31,10 +30,18 @@
 
     configure_file(${CMAKE_SOURCE_DIR}/cmake_infile.doxygen ${CMAKE_BINARY_DIR}/Doxyfile)
 
+    add_custom_target(docs-api-21
+            COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/docs/api-2.1 ${CMAKE_BINARY_DIR}/docs/web/api-2.1
+            WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
+            COMMENT "Copying UCX 2.1 API documentation.")
+
     add_custom_target(docs-api
             COMMAND ${DOXYGEN_EXECUTABLE}
             WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
-            COMMENT "Generating API documentation with Doxygen")
+            COMMENT "Generating API documentation with Doxygen.")
+
+    add_custom_target(docs-all DEPENDS docs-html docs-api docs-api-21)
+else()
+    add_custom_target(docs-all DEPENDS docs-html)
 endif()
 
-add_custom_target(docs-all DEPENDS docs-html docs-api)
--- a/COPYING	Mon Dec 30 09:54:10 2019 +0100
+++ b/COPYING	Sat Feb 06 19:11:44 2021 +0100
@@ -1,4 +1,4 @@
-Copyright 2017 Mike Becker, Olaf Wintermann. All rights reserved.
+Copyright 2021 Mike Becker, Olaf Wintermann. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
--- a/Makefile.am	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-#
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-#
-# Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-#   1. Redistributions of source code must retain the above copyright
-#      notice, this list of conditions and the following disclaimer.
-#
-#   2. Redistributions in binary form must reproduce the above copyright
-#      notice, this list of conditions and the following disclaimer in the
-#      documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
-# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-
-SUBDIRS = src test
-ACLOCAL_AMFLAGS = -I m4
--- a/README	Mon Dec 30 09:54:10 2019 +0100
+++ b/README	Sat Feb 06 19:11:44 2021 +0100
@@ -5,11 +5,10 @@
 0. Table of Contents:
 
   1. Introduction  ........................................................ 15
-  2. Build  ............................................................... 26
-  3. Install  ............................................................. 37
-  4. Documentation  ....................................................... 50
-  5. Contact  ............................................................. 63
-  6. License  ............................................................. 69
+  2. Build  ............................................................... 25
+  3. Documentation  ....................................................... 44
+  4. Contact  ............................................................. 57
+  5. License  ............................................................. 64
 
 
 1. Introduction
@@ -26,28 +25,23 @@
 2. Build
 --------
 
-Untar the source archive and simply run
+Untar the source archive and run
 
-  ./configure && make
+  mkdir build
+  cd build
+  cmake ..
+  make
 
-If you want to verify your build, you may then run
+Optionally install UCX by running the following command as privileged user
+
+  make install
+
+If you want to verify your build, you can run
 
   make check
 
-3. Install
-----------
 
-Build the binaries as described above. Then install UCX, by running
-
-  make install
-
-or
-
-  make install PREFIX=<install_dir>
-
-The default prefix is /usr/local and will require privileged access.
-
-4. Documentation
+3. Documentation
 ----------------
 
 Documentation is available at:
@@ -60,16 +54,17 @@
   https://develop.uap-core.de/ucx/api/index.html
 
 
-5. Contact
+4. Contact
 ----------
 
   Olaf Wintermann    (olaf.wintermann@gmail.com)
   Mike Becker        (universe@uap-core.de)
 
-6. License
+
+5. License
 ----------
 
-Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
+Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
--- a/autogen.sh	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-#!/bin/sh
-autoreconf --install
-
--- a/cmake_infile.doxygen	Mon Dec 30 09:54:10 2019 +0100
+++ b/cmake_infile.doxygen	Sat Feb 06 19:11:44 2021 +0100
@@ -230,12 +230,6 @@
 
 ALIASES                =
 
-# This tag can be used to specify a number of word-keyword mappings (TCL only).
-# A mapping has the form "name=value". For example adding "class=itcl::class"
-# will allow you to use the command class in the itcl::class meaning.
-
-TCL_SUBST              =
-
 # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
 # only. Doxygen will then generate output that is more tailored for C. For
 # instance, some of the names that are used will be different. The list of all
@@ -989,13 +983,6 @@
 
 ALPHABETICAL_INDEX     = YES
 
-# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
-# which the alphabetical index list will be split.
-# Minimum value: 1, maximum value: 20, default value: 5.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
-COLS_IN_ALPHA_INDEX    = 5
-
 # In case all classes in a project start with a common prefix, all classes will
 # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
 # can be used to specify a prefix (or a list of prefixes) that should be ignored
@@ -2008,12 +1995,6 @@
 
 EXTERNAL_PAGES         = YES
 
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of 'which perl').
-# The default file (with absolute path) is: /usr/bin/perl.
-
-PERL_PATH              = /usr/bin/perl
-
 #---------------------------------------------------------------------------
 # Configuration options related to the dot tool
 #---------------------------------------------------------------------------
@@ -2027,15 +2008,6 @@
 
 CLASS_DIAGRAMS         = YES
 
-# You can define message sequence charts within doxygen comments using the \msc
-# command. Doxygen will then run the mscgen tool (see:
-# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where
-# the mscgen tool resides. If left empty the tool is assumed to be found in the
-# default search path.
-
-MSCGEN_PATH            =
-
 # You can include diagrams made with dia in doxygen documentation. Doxygen will
 # then run dia to produce the diagram and insert it in the documentation. The
 # DIA_PATH tag allows you to specify the directory where the dia binary resides.
--- a/configure.ac	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-#
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-#
-# Copyright 2019 Mike Becker, Olaf Wintermann All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-#   1. Redistributions of source code must retain the above copyright
-#      notice, this list of conditions and the following disclaimer.
-#
-#   2. Redistributions in binary form must reproduce the above copyright
-#      notice, this list of conditions and the following disclaimer in the
-#      documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
-# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-
-# the package version must match the macros in ucx.h
-# the lib version must follow the libtool versioning convention
-AC_PREREQ([2.60])
-AC_INIT([ucx], [2.1.0], [olaf.wintermann@gmail.com])
-AC_SUBST([UCX_LIB_VERSION], [4:0:1])
-
-# don't place everything in the project root
-AC_CONFIG_AUX_DIR([build-aux])
-AC_CONFIG_MACRO_DIR([m4])
-
-# we use our own directory structure
-AM_INIT_AUTOMAKE([foreign -Wall -Werror])
-
-# if there is an archiver, use it
-m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
-
-# we are compiling a library
-LT_INIT
-
-# we want c11, and may fall back to c99
-AC_PROG_CC_C99
-
-# we want to support automake < 1.14, so we need this deprecated macro
-# it tests, whether the compiler allows -c and -o simultaneously
-# in modern versions of autoconf, this is done by AC_PROG_CC
-AM_PROG_CC_C_O
-
-# where to place config macros
-AC_CONFIG_HEADERS([config.h])
-
-# our Makefiles
-AC_CONFIG_FILES([Makefile src/Makefile test/Makefile])
-
-# GO
-AC_OUTPUT
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/allocator_8h.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,600 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/allocator.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a> &#124;
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">allocator.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Allocator for custom memory management.  
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
+</div>
+<p><a href="allocator_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxAllocator.html">UcxAllocator</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">UCX allocator data structure containing memory management functions.  <a href="structUcxAllocator.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ae1bc218fea8a35f4a3706f0beefcfb19"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="allocator_8h.html#ae1bc218fea8a35f4a3706f0beefcfb19">almalloc</a>(allocator,  n)&#160;&#160;&#160;((allocator)-&gt;malloc((allocator)-&gt;pool, n))</td></tr>
+<tr class="memdesc:ae1bc218fea8a35f4a3706f0beefcfb19"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shorthand for calling an allocators malloc function.  <a href="#ae1bc218fea8a35f4a3706f0beefcfb19">More...</a><br /></td></tr>
+<tr class="separator:ae1bc218fea8a35f4a3706f0beefcfb19"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8d71470816f88f78cb9a9686c57e1b10"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="allocator_8h.html#a8d71470816f88f78cb9a9686c57e1b10">alcalloc</a>(allocator,  n,  size)&#160;&#160;&#160;((allocator)-&gt;calloc((allocator)-&gt;pool, n, size))</td></tr>
+<tr class="memdesc:a8d71470816f88f78cb9a9686c57e1b10"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shorthand for calling an allocators calloc function.  <a href="#a8d71470816f88f78cb9a9686c57e1b10">More...</a><br /></td></tr>
+<tr class="separator:a8d71470816f88f78cb9a9686c57e1b10"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a029ee5c9bcbb3f873571553f788c5820"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="allocator_8h.html#a029ee5c9bcbb3f873571553f788c5820">alrealloc</a>(allocator,  ptr,  n)&#160;&#160;&#160;((allocator)-&gt;realloc((allocator)-&gt;pool, ptr, n))</td></tr>
+<tr class="memdesc:a029ee5c9bcbb3f873571553f788c5820"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shorthand for calling an allocators realloc function.  <a href="#a029ee5c9bcbb3f873571553f788c5820">More...</a><br /></td></tr>
+<tr class="separator:a029ee5c9bcbb3f873571553f788c5820"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acd775785b54e97dc2b33a432c12c8fb2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="allocator_8h.html#acd775785b54e97dc2b33a432c12c8fb2">alfree</a>(allocator,  ptr)&#160;&#160;&#160;((allocator)-&gt;free((allocator)-&gt;pool, ptr))</td></tr>
+<tr class="memdesc:acd775785b54e97dc2b33a432c12c8fb2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shorthand for calling an allocators free function.  <a href="#acd775785b54e97dc2b33a432c12c8fb2">More...</a><br /></td></tr>
+<tr class="separator:acd775785b54e97dc2b33a432c12c8fb2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1283a8f875f90a7af3aba5e031fc2e3f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="allocator_8h.html#a1283a8f875f90a7af3aba5e031fc2e3f">UCX_ALLOCATOR_DEFAULT</a></td></tr>
+<tr class="memdesc:a1283a8f875f90a7af3aba5e031fc2e3f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convenient macro for a default allocator <code>struct</code> definition.  <a href="#a1283a8f875f90a7af3aba5e031fc2e3f">More...</a><br /></td></tr>
+<tr class="separator:a1283a8f875f90a7af3aba5e031fc2e3f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:a29f0f6a23a70db3b60635cd6dc384473"><td class="memItemLeft" align="right" valign="top">typedef void *(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="allocator_8h.html#a29f0f6a23a70db3b60635cd6dc384473">ucx_allocator_malloc</a>) (void *pool, size_t n)</td></tr>
+<tr class="memdesc:a29f0f6a23a70db3b60635cd6dc384473"><td class="mdescLeft">&#160;</td><td class="mdescRight">A function pointer to the allocators <code>malloc()</code> function.  <a href="#a29f0f6a23a70db3b60635cd6dc384473">More...</a><br /></td></tr>
+<tr class="separator:a29f0f6a23a70db3b60635cd6dc384473"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c0aba4221c1ac6801f03ed799f15b12"><td class="memItemLeft" align="right" valign="top">typedef void *(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="allocator_8h.html#a2c0aba4221c1ac6801f03ed799f15b12">ucx_allocator_calloc</a>) (void *pool, size_t n, size_t size)</td></tr>
+<tr class="memdesc:a2c0aba4221c1ac6801f03ed799f15b12"><td class="mdescLeft">&#160;</td><td class="mdescRight">A function pointer to the allocators <code>calloc()</code> function.  <a href="#a2c0aba4221c1ac6801f03ed799f15b12">More...</a><br /></td></tr>
+<tr class="separator:a2c0aba4221c1ac6801f03ed799f15b12"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6d7cf038a806e327c5da37321d04e426"><td class="memItemLeft" align="right" valign="top">typedef void *(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="allocator_8h.html#a6d7cf038a806e327c5da37321d04e426">ucx_allocator_realloc</a>) (void *pool, void *data, size_t n)</td></tr>
+<tr class="memdesc:a6d7cf038a806e327c5da37321d04e426"><td class="mdescLeft">&#160;</td><td class="mdescRight">A function pointer to the allocators <code>realloc()</code> function.  <a href="#a6d7cf038a806e327c5da37321d04e426">More...</a><br /></td></tr>
+<tr class="separator:a6d7cf038a806e327c5da37321d04e426"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaf2387ddaddd8ab4b267e6b00e5d6f7e"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="allocator_8h.html#aaf2387ddaddd8ab4b267e6b00e5d6f7e">ucx_allocator_free</a>) (void *pool, void *data)</td></tr>
+<tr class="memdesc:aaf2387ddaddd8ab4b267e6b00e5d6f7e"><td class="mdescLeft">&#160;</td><td class="mdescRight">A function pointer to the allocators <code>free()</code> function.  <a href="#aaf2387ddaddd8ab4b267e6b00e5d6f7e">More...</a><br /></td></tr>
+<tr class="separator:aaf2387ddaddd8ab4b267e6b00e5d6f7e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a98d2f1b341118b7a0e341fda5d8b2ebf"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="allocator_8h.html#a98d2f1b341118b7a0e341fda5d8b2ebf">ucx_default_allocator</a> ()</td></tr>
+<tr class="memdesc:a98d2f1b341118b7a0e341fda5d8b2ebf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a pointer to the default allocator.  <a href="#a98d2f1b341118b7a0e341fda5d8b2ebf">More...</a><br /></td></tr>
+<tr class="separator:a98d2f1b341118b7a0e341fda5d8b2ebf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a96403ebf3d2312d95f2fe7627a1cdbc0"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="allocator_8h.html#a96403ebf3d2312d95f2fe7627a1cdbc0">ucx_default_malloc</a> (void *ignore, size_t n)</td></tr>
+<tr class="memdesc:a96403ebf3d2312d95f2fe7627a1cdbc0"><td class="mdescLeft">&#160;</td><td class="mdescRight">A wrapper for the standard libc <code>malloc()</code> function.  <a href="#a96403ebf3d2312d95f2fe7627a1cdbc0">More...</a><br /></td></tr>
+<tr class="separator:a96403ebf3d2312d95f2fe7627a1cdbc0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3a0bfdd13d887012309c459b339f338f"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="allocator_8h.html#a3a0bfdd13d887012309c459b339f338f">ucx_default_calloc</a> (void *ignore, size_t n, size_t size)</td></tr>
+<tr class="memdesc:a3a0bfdd13d887012309c459b339f338f"><td class="mdescLeft">&#160;</td><td class="mdescRight">A wrapper for the standard libc <code>calloc()</code> function.  <a href="#a3a0bfdd13d887012309c459b339f338f">More...</a><br /></td></tr>
+<tr class="separator:a3a0bfdd13d887012309c459b339f338f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a47cfc8af626a86fcb93a2b14b90498ed"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="allocator_8h.html#a47cfc8af626a86fcb93a2b14b90498ed">ucx_default_realloc</a> (void *ignore, void *data, size_t n)</td></tr>
+<tr class="memdesc:a47cfc8af626a86fcb93a2b14b90498ed"><td class="mdescLeft">&#160;</td><td class="mdescRight">A wrapper for the standard libc <code>realloc()</code> function.  <a href="#a47cfc8af626a86fcb93a2b14b90498ed">More...</a><br /></td></tr>
+<tr class="separator:a47cfc8af626a86fcb93a2b14b90498ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a646d83aaaadfe33ae414c0fad8bfc52a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="allocator_8h.html#a646d83aaaadfe33ae414c0fad8bfc52a">ucx_default_free</a> (void *ignore, void *data)</td></tr>
+<tr class="memdesc:a646d83aaaadfe33ae414c0fad8bfc52a"><td class="mdescLeft">&#160;</td><td class="mdescRight">A wrapper for the standard libc <code>free()</code> function.  <a href="#a646d83aaaadfe33ae414c0fad8bfc52a">More...</a><br /></td></tr>
+<tr class="separator:a646d83aaaadfe33ae414c0fad8bfc52a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Allocator for custom memory management. </p>
+<p>A UCX allocator consists of a pointer to the memory area / pool and four function pointers to memory management functions operating on this memory area / pool. These functions shall behave equivalent to the standard libc functions <code>malloc(), calloc(), realloc()</code> and <code>free()</code>.</p>
+<p>The signature of the memory management functions is based on the signature of the respective libc function but each of them takes the pointer to the memory area / pool as first argument.</p>
+<p>As the pointer to the memory area / pool can be arbitrarily chosen, any data can be provided to the memory management functions. A <a class="el" href="structUcxMempool.html" title="UCX mempool structure. ">UcxMempool</a> is just one example.</p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="mempool_8h.html" title="Memory pool implementation. ">mempool.h</a> </dd>
+<dd>
+<a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a></dd></dl>
+<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
+<dd>
+Olaf Wintermann </dd></dl>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a8d71470816f88f78cb9a9686c57e1b10"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8d71470816f88f78cb9a9686c57e1b10">&#9670;&nbsp;</a></span>alcalloc</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define alcalloc</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">allocator, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">n, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">size&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;((allocator)-&gt;calloc((allocator)-&gt;pool, n, size))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shorthand for calling an allocators calloc function. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
+    <tr><td class="paramname">n</td><td>the count of elements the space should be allocated for </td></tr>
+    <tr><td class="paramname">size</td><td>the size of each element </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the allocated memory area </dd></dl>
+
+</div>
+</div>
+<a id="acd775785b54e97dc2b33a432c12c8fb2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acd775785b54e97dc2b33a432c12c8fb2">&#9670;&nbsp;</a></span>alfree</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define alfree</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">allocator, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ptr&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;((allocator)-&gt;free((allocator)-&gt;pool, ptr))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shorthand for calling an allocators free function. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
+    <tr><td class="paramname">ptr</td><td>the pointer to the memory area that shall be freed </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ae1bc218fea8a35f4a3706f0beefcfb19"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae1bc218fea8a35f4a3706f0beefcfb19">&#9670;&nbsp;</a></span>almalloc</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define almalloc</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">allocator, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">n&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;((allocator)-&gt;malloc((allocator)-&gt;pool, n))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shorthand for calling an allocators malloc function. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
+    <tr><td class="paramname">n</td><td>size of space to allocate </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the allocated memory area </dd></dl>
+
+</div>
+</div>
+<a id="a029ee5c9bcbb3f873571553f788c5820"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a029ee5c9bcbb3f873571553f788c5820">&#9670;&nbsp;</a></span>alrealloc</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define alrealloc</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">allocator, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ptr, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">n&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;((allocator)-&gt;realloc((allocator)-&gt;pool, ptr, n))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shorthand for calling an allocators realloc function. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
+    <tr><td class="paramname">ptr</td><td>the pointer to the memory area that shall be reallocated </td></tr>
+    <tr><td class="paramname">n</td><td>the new size of the allocated memory area </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the reallocated memory area </dd></dl>
+
+</div>
+</div>
+<a id="a1283a8f875f90a7af3aba5e031fc2e3f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1283a8f875f90a7af3aba5e031fc2e3f">&#9670;&nbsp;</a></span>UCX_ALLOCATOR_DEFAULT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UCX_ALLOCATOR_DEFAULT</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">{NULL, \</div><div class="line">        ucx_default_malloc, <a class="code" href="allocator_8h.html#a3a0bfdd13d887012309c459b339f338f">ucx_default_calloc</a>, <a class="code" href="allocator_8h.html#a47cfc8af626a86fcb93a2b14b90498ed">ucx_default_realloc</a>, \</div><div class="line">        ucx_default_free }</div><div class="ttc" id="allocator_8h_html_a3a0bfdd13d887012309c459b339f338f"><div class="ttname"><a href="allocator_8h.html#a3a0bfdd13d887012309c459b339f338f">ucx_default_calloc</a></div><div class="ttdeci">void * ucx_default_calloc(void *ignore, size_t n, size_t size)</div><div class="ttdoc">A wrapper for the standard libc calloc() function. </div><div class="ttdef"><b>Definition:</b> allocator.c:50</div></div>
+<div class="ttc" id="allocator_8h_html_a47cfc8af626a86fcb93a2b14b90498ed"><div class="ttname"><a href="allocator_8h.html#a47cfc8af626a86fcb93a2b14b90498ed">ucx_default_realloc</a></div><div class="ttdeci">void * ucx_default_realloc(void *ignore, void *data, size_t n)</div><div class="ttdoc">A wrapper for the standard libc realloc() function. </div><div class="ttdef"><b>Definition:</b> allocator.c:54</div></div>
+</div><!-- fragment -->
+<p>Convenient macro for a default allocator <code>struct</code> definition. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="a2c0aba4221c1ac6801f03ed799f15b12"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2c0aba4221c1ac6801f03ed799f15b12">&#9670;&nbsp;</a></span>ucx_allocator_calloc</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void*(* ucx_allocator_calloc) (void *pool, size_t n, size_t size)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>A function pointer to the allocators <code>calloc()</code> function. </p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a> </dd></dl>
+
+</div>
+</div>
+<a id="aaf2387ddaddd8ab4b267e6b00e5d6f7e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaf2387ddaddd8ab4b267e6b00e5d6f7e">&#9670;&nbsp;</a></span>ucx_allocator_free</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(* ucx_allocator_free) (void *pool, void *data)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>A function pointer to the allocators <code>free()</code> function. </p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a> </dd></dl>
+
+</div>
+</div>
+<a id="a29f0f6a23a70db3b60635cd6dc384473"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a29f0f6a23a70db3b60635cd6dc384473">&#9670;&nbsp;</a></span>ucx_allocator_malloc</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void*(* ucx_allocator_malloc) (void *pool, size_t n)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>A function pointer to the allocators <code>malloc()</code> function. </p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a> </dd></dl>
+
+</div>
+</div>
+<a id="a6d7cf038a806e327c5da37321d04e426"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6d7cf038a806e327c5da37321d04e426">&#9670;&nbsp;</a></span>ucx_allocator_realloc</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void*(* ucx_allocator_realloc) (void *pool, void *data, size_t n)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>A function pointer to the allocators <code>realloc()</code> function. </p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a> </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a98d2f1b341118b7a0e341fda5d8b2ebf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a98d2f1b341118b7a0e341fda5d8b2ebf">&#9670;&nbsp;</a></span>ucx_default_allocator()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxAllocator.html">UcxAllocator</a>* ucx_default_allocator </td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns a pointer to the default allocator. </p>
+<p>The default allocator contains wrappers to the standard libc memory management functions. Use this function to get a pointer to a globally available allocator. You may also define an own <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a> by assigning <a class="el" href="allocator_8h.html#a1283a8f875f90a7af3aba5e031fc2e3f" title="Convenient macro for a default allocator struct definition. ">UCX_ALLOCATOR_DEFAULT</a> to a variable and pass the address of this variable to any function that takes a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a> as argument. Note that using this function is the recommended way of passing a default allocator, thus it never runs out of scope.</p>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the default allocator</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="allocator_8h.html#a1283a8f875f90a7af3aba5e031fc2e3f" title="Convenient macro for a default allocator struct definition. ">UCX_ALLOCATOR_DEFAULT</a> </dd></dl>
+
+</div>
+</div>
+<a id="a3a0bfdd13d887012309c459b339f338f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3a0bfdd13d887012309c459b339f338f">&#9670;&nbsp;</a></span>ucx_default_calloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* ucx_default_calloc </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>ignore</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>n</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>size</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>A wrapper for the standard libc <code>calloc()</code> function. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ignore</td><td>ignored (may be used by allocators for pooled memory) </td></tr>
+    <tr><td class="paramname">n</td><td>argument passed to <code>calloc()</code> </td></tr>
+    <tr><td class="paramname">size</td><td>argument passed to <code>calloc()</code> </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>return value of <code>calloc()</code> </dd></dl>
+
+</div>
+</div>
+<a id="a646d83aaaadfe33ae414c0fad8bfc52a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a646d83aaaadfe33ae414c0fad8bfc52a">&#9670;&nbsp;</a></span>ucx_default_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_default_free </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>ignore</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>A wrapper for the standard libc <code>free()</code> function. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ignore</td><td>ignored (may be used by allocators for pooled memory) </td></tr>
+    <tr><td class="paramname">data</td><td>argument passed to <code>free()</code> </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a96403ebf3d2312d95f2fe7627a1cdbc0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a96403ebf3d2312d95f2fe7627a1cdbc0">&#9670;&nbsp;</a></span>ucx_default_malloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* ucx_default_malloc </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>ignore</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>n</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>A wrapper for the standard libc <code>malloc()</code> function. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ignore</td><td>ignored (may be used by allocators for pooled memory) </td></tr>
+    <tr><td class="paramname">n</td><td>argument passed to <code>malloc()</code> </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>return value of <code>malloc()</code> </dd></dl>
+
+</div>
+</div>
+<a id="a47cfc8af626a86fcb93a2b14b90498ed"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a47cfc8af626a86fcb93a2b14b90498ed">&#9670;&nbsp;</a></span>ucx_default_realloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* ucx_default_realloc </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>ignore</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>n</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>A wrapper for the standard libc <code>realloc()</code> function. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ignore</td><td>ignored (may be used by allocators for pooled memory) </td></tr>
+    <tr><td class="paramname">data</td><td>argumend passed to <code>realloc()</code> </td></tr>
+    <tr><td class="paramname">n</td><td>argument passed to <code>realloc()</code> </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>return value of <code>realloc()</code> </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/allocator_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,95 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/allocator.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">allocator.h</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a href="allocator_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment"> * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"> * Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment"> * modification, are permitted provided that the following conditions are met:</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> *   1. Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> *   2. Redistributions in binary form must reproduce the above copyright</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer in the</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment"> *      documentation and/or other materials provided with the distribution.</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment"> * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment"> * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment"> * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"> * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment"> * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment"> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment"> * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE</span></div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> * POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;<span class="preprocessor">#ifndef UCX_ALLOCATOR_H</span></div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;<span class="preprocessor">#define UCX_ALLOCATOR_H</span></div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ucx_8h.html">ucx.h</a>&quot;</span></div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;</div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;</div><div class="line"><a name="l00065"></a><span class="lineno"><a class="line" href="allocator_8h.html#a29f0f6a23a70db3b60635cd6dc384473">   65</a></span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">void</span>*(*ucx_allocator_malloc)(<span class="keywordtype">void</span> *pool, <span class="keywordtype">size_t</span> n);</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;</div><div class="line"><a name="l00071"></a><span class="lineno"><a class="line" href="allocator_8h.html#a2c0aba4221c1ac6801f03ed799f15b12">   71</a></span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">void</span>*(*ucx_allocator_calloc)(<span class="keywordtype">void</span> *pool, <span class="keywordtype">size_t</span> n, <span class="keywordtype">size_t</span> size);</div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;</div><div class="line"><a name="l00077"></a><span class="lineno"><a class="line" href="allocator_8h.html#a6d7cf038a806e327c5da37321d04e426">   77</a></span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">void</span>*(*ucx_allocator_realloc)(<span class="keywordtype">void</span> *pool, <span class="keywordtype">void</span> *data, <span class="keywordtype">size_t</span> n);</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;</div><div class="line"><a name="l00083"></a><span class="lineno"><a class="line" href="allocator_8h.html#aaf2387ddaddd8ab4b267e6b00e5d6f7e">   83</a></span>&#160;<span class="keyword">typedef</span> void(*<a class="code" href="allocator_8h.html#aaf2387ddaddd8ab4b267e6b00e5d6f7e">ucx_allocator_free</a>)(<span class="keywordtype">void</span> *pool, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;</div><div class="line"><a name="l00088"></a><span class="lineno"><a class="line" href="structUcxAllocator.html">   88</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span>{</div><div class="line"><a name="l00093"></a><span class="lineno"><a class="line" href="structUcxAllocator.html#a1b78012998d1c28be86dc595f8f0aac9">   93</a></span>&#160;    <span class="keywordtype">void</span> *<a class="code" href="structUcxAllocator.html#a1b78012998d1c28be86dc595f8f0aac9">pool</a>;</div><div class="line"><a name="l00097"></a><span class="lineno"><a class="line" href="structUcxAllocator.html#a013376172be39ed54f77c4be6898845a">   97</a></span>&#160;    <a class="code" href="allocator_8h.html#a29f0f6a23a70db3b60635cd6dc384473">ucx_allocator_malloc</a>  <a class="code" href="structUcxAllocator.html#a013376172be39ed54f77c4be6898845a">malloc</a>;</div><div class="line"><a name="l00101"></a><span class="lineno"><a class="line" href="structUcxAllocator.html#ab94ec1cba45cc4e7d81e1588a11cbb62">  101</a></span>&#160;    <a class="code" href="allocator_8h.html#a2c0aba4221c1ac6801f03ed799f15b12">ucx_allocator_calloc</a>  <a class="code" href="structUcxAllocator.html#ab94ec1cba45cc4e7d81e1588a11cbb62">calloc</a>;</div><div class="line"><a name="l00105"></a><span class="lineno"><a class="line" href="structUcxAllocator.html#a3550e3847f31d9e9ce3ffcb0d3440c15">  105</a></span>&#160;    <a class="code" href="allocator_8h.html#a6d7cf038a806e327c5da37321d04e426">ucx_allocator_realloc</a> <a class="code" href="structUcxAllocator.html#a3550e3847f31d9e9ce3ffcb0d3440c15">realloc</a>;</div><div class="line"><a name="l00109"></a><span class="lineno"><a class="line" href="structUcxAllocator.html#aecce1840378ed53f1002190f4f87026f">  109</a></span>&#160;    <a class="code" href="allocator_8h.html#aaf2387ddaddd8ab4b267e6b00e5d6f7e">ucx_allocator_free</a>    <a class="code" href="structUcxAllocator.html#aecce1840378ed53f1002190f4f87026f">free</a>;</div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;} <a class="code" href="structUcxAllocator.html">UcxAllocator</a>;</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;<a class="code" href="structUcxAllocator.html">UcxAllocator</a> *<a class="code" href="allocator_8h.html#a98d2f1b341118b7a0e341fda5d8b2ebf">ucx_default_allocator</a>();</div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;</div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;<span class="keywordtype">void</span> *<a class="code" href="allocator_8h.html#a96403ebf3d2312d95f2fe7627a1cdbc0">ucx_default_malloc</a>(<span class="keywordtype">void</span> *ignore, <span class="keywordtype">size_t</span> n);</div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;<span class="keywordtype">void</span> *<a class="code" href="allocator_8h.html#a3a0bfdd13d887012309c459b339f338f">ucx_default_calloc</a>(<span class="keywordtype">void</span> *ignore, <span class="keywordtype">size_t</span> n, <span class="keywordtype">size_t</span> size);</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;<span class="keywordtype">void</span> *<a class="code" href="allocator_8h.html#a47cfc8af626a86fcb93a2b14b90498ed">ucx_default_realloc</a>(<span class="keywordtype">void</span> *ignore, <span class="keywordtype">void</span> *data, <span class="keywordtype">size_t</span> n);</div><div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;<span class="keywordtype">void</span> <a class="code" href="allocator_8h.html#a646d83aaaadfe33ae414c0fad8bfc52a">ucx_default_free</a>(<span class="keywordtype">void</span> *ignore, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;</div><div class="line"><a name="l00165"></a><span class="lineno"><a class="line" href="allocator_8h.html#ae1bc218fea8a35f4a3706f0beefcfb19">  165</a></span>&#160;<span class="preprocessor">#define almalloc(allocator, n) ((allocator)-&gt;malloc((allocator)-&gt;pool, n))</span></div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;</div><div class="line"><a name="l00174"></a><span class="lineno"><a class="line" href="allocator_8h.html#a8d71470816f88f78cb9a9686c57e1b10">  174</a></span>&#160;<span class="preprocessor">#define alcalloc(allocator, n, size) \</span></div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;<span class="preprocessor">        ((allocator)-&gt;calloc((allocator)-&gt;pool, n, size))</span></div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;</div><div class="line"><a name="l00184"></a><span class="lineno"><a class="line" href="allocator_8h.html#a029ee5c9bcbb3f873571553f788c5820">  184</a></span>&#160;<span class="preprocessor">#define alrealloc(allocator, ptr, n) \</span></div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;<span class="preprocessor">        ((allocator)-&gt;realloc((allocator)-&gt;pool, ptr, n))</span></div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;</div><div class="line"><a name="l00192"></a><span class="lineno"><a class="line" href="allocator_8h.html#acd775785b54e97dc2b33a432c12c8fb2">  192</a></span>&#160;<span class="preprocessor">#define alfree(allocator, ptr) ((allocator)-&gt;free((allocator)-&gt;pool, ptr))</span></div><div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;</div><div class="line"><a name="l00197"></a><span class="lineno"><a class="line" href="allocator_8h.html#a1283a8f875f90a7af3aba5e031fc2e3f">  197</a></span>&#160;<span class="preprocessor">#define UCX_ALLOCATOR_DEFAULT {NULL, \</span></div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;<span class="preprocessor">        ucx_default_malloc, ucx_default_calloc, ucx_default_realloc, \</span></div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;<span class="preprocessor">        ucx_default_free }</span></div><div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;}</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;</div><div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;<span class="preprocessor">#endif  </span><span class="comment">/* UCX_ALLOCATOR_H */</span><span class="preprocessor"></span></div><div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;</div><div class="ttc" id="ucx_8h_html"><div class="ttname"><a href="ucx_8h.html">ucx.h</a></div><div class="ttdoc">Main UCX Header providing most common definitions. </div></div>
+<div class="ttc" id="allocator_8h_html_a96403ebf3d2312d95f2fe7627a1cdbc0"><div class="ttname"><a href="allocator_8h.html#a96403ebf3d2312d95f2fe7627a1cdbc0">ucx_default_malloc</a></div><div class="ttdeci">void * ucx_default_malloc(void *ignore, size_t n)</div><div class="ttdoc">A wrapper for the standard libc malloc() function. </div><div class="ttdef"><b>Definition:</b> allocator.c:46</div></div>
+<div class="ttc" id="structUcxAllocator_html"><div class="ttname"><a href="structUcxAllocator.html">UcxAllocator</a></div><div class="ttdoc">UCX allocator data structure containing memory management functions. </div><div class="ttdef"><b>Definition:</b> allocator.h:88</div></div>
+<div class="ttc" id="structUcxAllocator_html_a013376172be39ed54f77c4be6898845a"><div class="ttname"><a href="structUcxAllocator.html#a013376172be39ed54f77c4be6898845a">UcxAllocator::malloc</a></div><div class="ttdeci">ucx_allocator_malloc malloc</div><div class="ttdoc">The malloc() function for this allocator. </div><div class="ttdef"><b>Definition:</b> allocator.h:97</div></div>
+<div class="ttc" id="allocator_8h_html_a2c0aba4221c1ac6801f03ed799f15b12"><div class="ttname"><a href="allocator_8h.html#a2c0aba4221c1ac6801f03ed799f15b12">ucx_allocator_calloc</a></div><div class="ttdeci">void *(* ucx_allocator_calloc)(void *pool, size_t n, size_t size)</div><div class="ttdoc">A function pointer to the allocators calloc() function. </div><div class="ttdef"><b>Definition:</b> allocator.h:71</div></div>
+<div class="ttc" id="structUcxAllocator_html_aecce1840378ed53f1002190f4f87026f"><div class="ttname"><a href="structUcxAllocator.html#aecce1840378ed53f1002190f4f87026f">UcxAllocator::free</a></div><div class="ttdeci">ucx_allocator_free free</div><div class="ttdoc">The free() function for this allocator. </div><div class="ttdef"><b>Definition:</b> allocator.h:109</div></div>
+<div class="ttc" id="allocator_8h_html_a29f0f6a23a70db3b60635cd6dc384473"><div class="ttname"><a href="allocator_8h.html#a29f0f6a23a70db3b60635cd6dc384473">ucx_allocator_malloc</a></div><div class="ttdeci">void *(* ucx_allocator_malloc)(void *pool, size_t n)</div><div class="ttdoc">A function pointer to the allocators malloc() function. </div><div class="ttdef"><b>Definition:</b> allocator.h:65</div></div>
+<div class="ttc" id="allocator_8h_html_a98d2f1b341118b7a0e341fda5d8b2ebf"><div class="ttname"><a href="allocator_8h.html#a98d2f1b341118b7a0e341fda5d8b2ebf">ucx_default_allocator</a></div><div class="ttdeci">UcxAllocator * ucx_default_allocator()</div><div class="ttdoc">Returns a pointer to the default allocator. </div><div class="ttdef"><b>Definition:</b> allocator.c:41</div></div>
+<div class="ttc" id="allocator_8h_html_a3a0bfdd13d887012309c459b339f338f"><div class="ttname"><a href="allocator_8h.html#a3a0bfdd13d887012309c459b339f338f">ucx_default_calloc</a></div><div class="ttdeci">void * ucx_default_calloc(void *ignore, size_t n, size_t size)</div><div class="ttdoc">A wrapper for the standard libc calloc() function. </div><div class="ttdef"><b>Definition:</b> allocator.c:50</div></div>
+<div class="ttc" id="allocator_8h_html_a6d7cf038a806e327c5da37321d04e426"><div class="ttname"><a href="allocator_8h.html#a6d7cf038a806e327c5da37321d04e426">ucx_allocator_realloc</a></div><div class="ttdeci">void *(* ucx_allocator_realloc)(void *pool, void *data, size_t n)</div><div class="ttdoc">A function pointer to the allocators realloc() function. </div><div class="ttdef"><b>Definition:</b> allocator.h:77</div></div>
+<div class="ttc" id="allocator_8h_html_a47cfc8af626a86fcb93a2b14b90498ed"><div class="ttname"><a href="allocator_8h.html#a47cfc8af626a86fcb93a2b14b90498ed">ucx_default_realloc</a></div><div class="ttdeci">void * ucx_default_realloc(void *ignore, void *data, size_t n)</div><div class="ttdoc">A wrapper for the standard libc realloc() function. </div><div class="ttdef"><b>Definition:</b> allocator.c:54</div></div>
+<div class="ttc" id="allocator_8h_html_aaf2387ddaddd8ab4b267e6b00e5d6f7e"><div class="ttname"><a href="allocator_8h.html#aaf2387ddaddd8ab4b267e6b00e5d6f7e">ucx_allocator_free</a></div><div class="ttdeci">void(* ucx_allocator_free)(void *pool, void *data)</div><div class="ttdoc">A function pointer to the allocators free() function. </div><div class="ttdef"><b>Definition:</b> allocator.h:83</div></div>
+<div class="ttc" id="structUcxAllocator_html_ab94ec1cba45cc4e7d81e1588a11cbb62"><div class="ttname"><a href="structUcxAllocator.html#ab94ec1cba45cc4e7d81e1588a11cbb62">UcxAllocator::calloc</a></div><div class="ttdeci">ucx_allocator_calloc calloc</div><div class="ttdoc">The calloc() function for this allocator. </div><div class="ttdef"><b>Definition:</b> allocator.h:101</div></div>
+<div class="ttc" id="allocator_8h_html_a646d83aaaadfe33ae414c0fad8bfc52a"><div class="ttname"><a href="allocator_8h.html#a646d83aaaadfe33ae414c0fad8bfc52a">ucx_default_free</a></div><div class="ttdeci">void ucx_default_free(void *ignore, void *data)</div><div class="ttdoc">A wrapper for the standard libc free() function. </div><div class="ttdef"><b>Definition:</b> allocator.c:58</div></div>
+<div class="ttc" id="structUcxAllocator_html_a3550e3847f31d9e9ce3ffcb0d3440c15"><div class="ttname"><a href="structUcxAllocator.html#a3550e3847f31d9e9ce3ffcb0d3440c15">UcxAllocator::realloc</a></div><div class="ttdeci">ucx_allocator_realloc realloc</div><div class="ttdoc">The realloc() function for this allocator. </div><div class="ttdef"><b>Definition:</b> allocator.h:105</div></div>
+<div class="ttc" id="structUcxAllocator_html_a1b78012998d1c28be86dc595f8f0aac9"><div class="ttname"><a href="structUcxAllocator.html#a1b78012998d1c28be86dc595f8f0aac9">UcxAllocator::pool</a></div><div class="ttdeci">void * pool</div><div class="ttdoc">Pointer to an area of memory or a complex memory pool. </div><div class="ttdef"><b>Definition:</b> allocator.h:93</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/annotated.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,101 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: Data Structures</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">Data Structures</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here are the data structures with brief descriptions:</div><div class="directory">
+<table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structscstr__t.html" target="_self">scstr_t</a></td><td class="desc">The UCX string structure for immutable (constant) strings </td></tr>
+<tr id="row_1_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structsstr__t.html" target="_self">sstr_t</a></td><td class="desc">The UCX string structure </td></tr>
+<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structucx__memchunk.html" target="_self">ucx_memchunk</a></td><td class="desc">Capsule for destructible memory chunks </td></tr>
+<tr id="row_3_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structucx__regdestr.html" target="_self">ucx_regdestr</a></td><td class="desc">Capsule for data and its destructor </td></tr>
+<tr id="row_4_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structucx__stack__metadata.html" target="_self">ucx_stack_metadata</a></td><td class="desc">Metadata for each UCX stack element </td></tr>
+<tr id="row_5_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structUcxAllocator.html" target="_self">UcxAllocator</a></td><td class="desc">UCX allocator data structure containing memory management functions </td></tr>
+<tr id="row_6_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structUcxArray.html" target="_self">UcxArray</a></td><td class="desc">UCX array type </td></tr>
+<tr id="row_7_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structUcxAVLNode.html" target="_self">UcxAVLNode</a></td><td class="desc">UCX AVL Node </td></tr>
+<tr id="row_8_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structUcxAVLTree.html" target="_self">UcxAVLTree</a></td><td class="desc">UCX AVL Tree </td></tr>
+<tr id="row_9_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structUcxBuffer.html" target="_self">UcxBuffer</a></td><td class="desc">UCX Buffer </td></tr>
+<tr id="row_10_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structUcxKey.html" target="_self">UcxKey</a></td><td class="desc">Structure to publicly denote a key of a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a> </td></tr>
+<tr id="row_11_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structUcxList.html" target="_self">UcxList</a></td><td class="desc">UCX list structure </td></tr>
+<tr id="row_12_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structUcxLogger.html" target="_self">UcxLogger</a></td><td class="desc">The UCX Logger object </td></tr>
+<tr id="row_13_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structUcxMap.html" target="_self">UcxMap</a></td><td class="desc">Structure for the UCX map </td></tr>
+<tr id="row_14_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structUcxMapElement.html" target="_self">UcxMapElement</a></td><td class="desc">Structure for an element of a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a> </td></tr>
+<tr id="row_15_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structUcxMapIterator.html" target="_self">UcxMapIterator</a></td><td class="desc">Structure for an iterator over a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a> </td></tr>
+<tr id="row_16_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structUcxMapKey.html" target="_self">UcxMapKey</a></td><td class="desc">Internal structure for a key of a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a> </td></tr>
+<tr id="row_17_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structUcxMempool.html" target="_self">UcxMempool</a></td><td class="desc">UCX mempool structure </td></tr>
+<tr id="row_18_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structUcxProperties.html" target="_self">UcxProperties</a></td><td class="desc"><a class="el" href="structUcxProperties.html" title="UcxProperties object for parsing properties data. ">UcxProperties</a> object for parsing properties data </td></tr>
+<tr id="row_19_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structUcxStack.html" target="_self">UcxStack</a></td><td class="desc">UCX stack structure </td></tr>
+<tr id="row_20_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structUcxTestList.html" target="_self">UcxTestList</a></td><td class="desc">Structure for the internal list of test cases </td></tr>
+<tr id="row_21_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structUcxTestSuite.html" target="_self">UcxTestSuite</a></td><td class="desc">A test suite containing multiple test cases </td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/array_8h.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,1376 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/array.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">array.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Dynamically allocated array implementation.  
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="allocator_8h_source.html">allocator.h</a>&quot;</code><br />
+</div>
+<p><a href="array_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxArray.html">UcxArray</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">UCX array type.  <a href="structUcxArray.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a1d959c29af3125bdd37cde3a554e729c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a1d959c29af3125bdd37cde3a554e729c">ucx_array_util_set</a>(array,  capacity,  elmsize,  idx,  data)</td></tr>
+<tr class="memdesc:a1d959c29af3125bdd37cde3a554e729c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets an element in an arbitrary user defined array.  <a href="#a1d959c29af3125bdd37cde3a554e729c">More...</a><br /></td></tr>
+<tr class="separator:a1d959c29af3125bdd37cde3a554e729c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a59a5b342965e790945f9c7a3f86b99f9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a59a5b342965e790945f9c7a3f86b99f9">ucx_array_util_setptr</a>(array,  capacity,  idx,  ptr)</td></tr>
+<tr class="memdesc:a59a5b342965e790945f9c7a3f86b99f9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Stores a pointer in an arbitrary user defined array.  <a href="#a59a5b342965e790945f9c7a3f86b99f9">More...</a><br /></td></tr>
+<tr class="separator:a59a5b342965e790945f9c7a3f86b99f9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ad0a8d76980cf1c1910e64a245803fb9a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#ad0a8d76980cf1c1910e64a245803fb9a">ucx_array_util_set_a</a> (<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *alloc, void **array, size_t *capacity, size_t elmsize, size_t idx, void *data)</td></tr>
+<tr class="memdesc:ad0a8d76980cf1c1910e64a245803fb9a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets an element in an arbitrary user defined array.  <a href="#ad0a8d76980cf1c1910e64a245803fb9a">More...</a><br /></td></tr>
+<tr class="separator:ad0a8d76980cf1c1910e64a245803fb9a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad708b333c0c1b02c998309a58ea65e31"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#ad708b333c0c1b02c998309a58ea65e31">ucx_array_util_setptr_a</a> (<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *alloc, void **array, size_t *capacity, size_t idx, void *ptr)</td></tr>
+<tr class="memdesc:ad708b333c0c1b02c998309a58ea65e31"><td class="mdescLeft">&#160;</td><td class="mdescRight">Stores a pointer in an arbitrary user defined array.  <a href="#ad708b333c0c1b02c998309a58ea65e31">More...</a><br /></td></tr>
+<tr class="separator:ad708b333c0c1b02c998309a58ea65e31"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a994a2fbf1c33a3833e2a70cd9a4352b7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a994a2fbf1c33a3833e2a70cd9a4352b7">ucx_array_new</a> (size_t capacity, size_t elemsize)</td></tr>
+<tr class="memdesc:a994a2fbf1c33a3833e2a70cd9a4352b7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new UCX array with the given capacity and element size.  <a href="#a994a2fbf1c33a3833e2a70cd9a4352b7">More...</a><br /></td></tr>
+<tr class="separator:a994a2fbf1c33a3833e2a70cd9a4352b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a177170258c215eb2e4f5a32e59f0cb1b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a177170258c215eb2e4f5a32e59f0cb1b">ucx_array_new_a</a> (size_t capacity, size_t elemsize, <a class="el" href="structUcxAllocator.html">UcxAllocator</a> *allocator)</td></tr>
+<tr class="memdesc:a177170258c215eb2e4f5a32e59f0cb1b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new UCX array using the specified allocator.  <a href="#a177170258c215eb2e4f5a32e59f0cb1b">More...</a><br /></td></tr>
+<tr class="separator:a177170258c215eb2e4f5a32e59f0cb1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad921e85c28ffae32230777a53c5037e5"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#ad921e85c28ffae32230777a53c5037e5">ucx_array_init</a> (<a class="el" href="structUcxArray.html">UcxArray</a> *array, size_t capacity, size_t elemsize)</td></tr>
+<tr class="memdesc:ad921e85c28ffae32230777a53c5037e5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Initializes a UCX array structure with the given capacity and element size.  <a href="#ad921e85c28ffae32230777a53c5037e5">More...</a><br /></td></tr>
+<tr class="separator:ad921e85c28ffae32230777a53c5037e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2451e61ebb15a7ba1c1319267ba75b8c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a2451e61ebb15a7ba1c1319267ba75b8c">ucx_array_init_a</a> (<a class="el" href="structUcxArray.html">UcxArray</a> *array, size_t capacity, size_t elemsize, <a class="el" href="structUcxAllocator.html">UcxAllocator</a> *allocator)</td></tr>
+<tr class="memdesc:a2451e61ebb15a7ba1c1319267ba75b8c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Initializes a UCX array structure using the specified allocator.  <a href="#a2451e61ebb15a7ba1c1319267ba75b8c">More...</a><br /></td></tr>
+<tr class="separator:a2451e61ebb15a7ba1c1319267ba75b8c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4a8c273370e4a3a3e2624e364f5ab410"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a4a8c273370e4a3a3e2624e364f5ab410">ucx_array_clone</a> (<a class="el" href="structUcxArray.html">UcxArray</a> *dest, <a class="el" href="structUcxArray.html">UcxArray</a> const *src)</td></tr>
+<tr class="memdesc:a4a8c273370e4a3a3e2624e364f5ab410"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates an shallow copy of an array.  <a href="#a4a8c273370e4a3a3e2624e364f5ab410">More...</a><br /></td></tr>
+<tr class="separator:a4a8c273370e4a3a3e2624e364f5ab410"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a43292b448adb1741677aa8c578bcc201"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a43292b448adb1741677aa8c578bcc201">ucx_array_equals</a> (<a class="el" href="structUcxArray.html">UcxArray</a> const *array1, <a class="el" href="structUcxArray.html">UcxArray</a> const *array2, <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, void *data)</td></tr>
+<tr class="memdesc:a43292b448adb1741677aa8c578bcc201"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two UCX arrays element-wise by using a compare function.  <a href="#a43292b448adb1741677aa8c578bcc201">More...</a><br /></td></tr>
+<tr class="separator:a43292b448adb1741677aa8c578bcc201"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8e83681d8d5d8cddbf10f63ce5be4c10"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a8e83681d8d5d8cddbf10f63ce5be4c10">ucx_array_destroy</a> (<a class="el" href="structUcxArray.html">UcxArray</a> *array)</td></tr>
+<tr class="memdesc:a8e83681d8d5d8cddbf10f63ce5be4c10"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys the array.  <a href="#a8e83681d8d5d8cddbf10f63ce5be4c10">More...</a><br /></td></tr>
+<tr class="separator:a8e83681d8d5d8cddbf10f63ce5be4c10"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac01ee914468a16f470bf3071fffbe438"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#ac01ee914468a16f470bf3071fffbe438">ucx_array_free</a> (<a class="el" href="structUcxArray.html">UcxArray</a> *array)</td></tr>
+<tr class="memdesc:ac01ee914468a16f470bf3071fffbe438"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys and frees the array.  <a href="#ac01ee914468a16f470bf3071fffbe438">More...</a><br /></td></tr>
+<tr class="separator:ac01ee914468a16f470bf3071fffbe438"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aea01731ad94ea73c0c8fb1d1b7a35fcf"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#aea01731ad94ea73c0c8fb1d1b7a35fcf">ucx_array_append_from</a> (<a class="el" href="structUcxArray.html">UcxArray</a> *array, void *data, size_t count)</td></tr>
+<tr class="memdesc:aea01731ad94ea73c0c8fb1d1b7a35fcf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Inserts elements at the end of the array.  <a href="#aea01731ad94ea73c0c8fb1d1b7a35fcf">More...</a><br /></td></tr>
+<tr class="separator:aea01731ad94ea73c0c8fb1d1b7a35fcf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a95b52acc2193b5c33cf0eaa4f2082477"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a95b52acc2193b5c33cf0eaa4f2082477">ucx_array_prepend_from</a> (<a class="el" href="structUcxArray.html">UcxArray</a> *array, void *data, size_t count)</td></tr>
+<tr class="memdesc:a95b52acc2193b5c33cf0eaa4f2082477"><td class="mdescLeft">&#160;</td><td class="mdescRight">Inserts elements at the beginning of the array.  <a href="#a95b52acc2193b5c33cf0eaa4f2082477">More...</a><br /></td></tr>
+<tr class="separator:a95b52acc2193b5c33cf0eaa4f2082477"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1bb545d065358d265d80d815ba382a28"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a1bb545d065358d265d80d815ba382a28">ucx_array_set_from</a> (<a class="el" href="structUcxArray.html">UcxArray</a> *array, size_t index, void *data, size_t count)</td></tr>
+<tr class="memdesc:a1bb545d065358d265d80d815ba382a28"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets elements starting at the specified index.  <a href="#a1bb545d065358d265d80d815ba382a28">More...</a><br /></td></tr>
+<tr class="separator:a1bb545d065358d265d80d815ba382a28"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa5a0bf3d3f0df6406beb0e569021cc28"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#aa5a0bf3d3f0df6406beb0e569021cc28">ucx_array_concat</a> (<a class="el" href="structUcxArray.html">UcxArray</a> *array1, const <a class="el" href="structUcxArray.html">UcxArray</a> *array2)</td></tr>
+<tr class="memdesc:aa5a0bf3d3f0df6406beb0e569021cc28"><td class="mdescLeft">&#160;</td><td class="mdescRight">Concatenates two arrays.  <a href="#aa5a0bf3d3f0df6406beb0e569021cc28">More...</a><br /></td></tr>
+<tr class="separator:aa5a0bf3d3f0df6406beb0e569021cc28"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa698085fd1a8b70d6b709999c51b49e8"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#aa698085fd1a8b70d6b709999c51b49e8">ucx_array_at</a> (<a class="el" href="structUcxArray.html">UcxArray</a> const *array, size_t index)</td></tr>
+<tr class="memdesc:aa698085fd1a8b70d6b709999c51b49e8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a pointer to the array element at the specified index.  <a href="#aa698085fd1a8b70d6b709999c51b49e8">More...</a><br /></td></tr>
+<tr class="separator:aa698085fd1a8b70d6b709999c51b49e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae7bdbed94afee9b20b38b95e3ab470f0"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#ae7bdbed94afee9b20b38b95e3ab470f0">ucx_array_find</a> (<a class="el" href="structUcxArray.html">UcxArray</a> const *array, void *elem, <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, void *data)</td></tr>
+<tr class="memdesc:ae7bdbed94afee9b20b38b95e3ab470f0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the index of an element containing the specified data.  <a href="#ae7bdbed94afee9b20b38b95e3ab470f0">More...</a><br /></td></tr>
+<tr class="separator:ae7bdbed94afee9b20b38b95e3ab470f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5241058cd2329147bc5b1593ae7e51dc"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a5241058cd2329147bc5b1593ae7e51dc">ucx_array_contains</a> (<a class="el" href="structUcxArray.html">UcxArray</a> const *array, void *elem, <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, void *data)</td></tr>
+<tr class="memdesc:a5241058cd2329147bc5b1593ae7e51dc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks, if an array contains a specific element.  <a href="#a5241058cd2329147bc5b1593ae7e51dc">More...</a><br /></td></tr>
+<tr class="separator:a5241058cd2329147bc5b1593ae7e51dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:add773514569b872a6624381b4b6af52c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#add773514569b872a6624381b4b6af52c">ucx_array_sort</a> (<a class="el" href="structUcxArray.html">UcxArray</a> *array, <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, void *data)</td></tr>
+<tr class="memdesc:add773514569b872a6624381b4b6af52c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sorts a <a class="el" href="structUcxArray.html" title="UCX array type. ">UcxArray</a> with the best available sort algorithm.  <a href="#add773514569b872a6624381b4b6af52c">More...</a><br /></td></tr>
+<tr class="separator:add773514569b872a6624381b4b6af52c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa45eac6b697f83adac81c0860cf306b8"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#aa45eac6b697f83adac81c0860cf306b8">ucx_array_remove</a> (<a class="el" href="structUcxArray.html">UcxArray</a> *array, size_t index)</td></tr>
+<tr class="memdesc:aa45eac6b697f83adac81c0860cf306b8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Removes an element from the array.  <a href="#aa45eac6b697f83adac81c0860cf306b8">More...</a><br /></td></tr>
+<tr class="separator:aa45eac6b697f83adac81c0860cf306b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a548d81b07612bae3ba8c4c4b49104b8e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a548d81b07612bae3ba8c4c4b49104b8e">ucx_array_remove_fast</a> (<a class="el" href="structUcxArray.html">UcxArray</a> *array, size_t index)</td></tr>
+<tr class="memdesc:a548d81b07612bae3ba8c4c4b49104b8e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Removes an element from the array.  <a href="#a548d81b07612bae3ba8c4c4b49104b8e">More...</a><br /></td></tr>
+<tr class="separator:a548d81b07612bae3ba8c4c4b49104b8e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2daf50e80aee9bccebee876a7efd2dfc"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a2daf50e80aee9bccebee876a7efd2dfc">ucx_array_shrink</a> (<a class="el" href="structUcxArray.html">UcxArray</a> *array)</td></tr>
+<tr class="memdesc:a2daf50e80aee9bccebee876a7efd2dfc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shrinks the memory to exactly fit the contents.  <a href="#a2daf50e80aee9bccebee876a7efd2dfc">More...</a><br /></td></tr>
+<tr class="separator:a2daf50e80aee9bccebee876a7efd2dfc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a27762e7c06a6c781015e3c8ceeee0ce3"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a27762e7c06a6c781015e3c8ceeee0ce3">ucx_array_resize</a> (<a class="el" href="structUcxArray.html">UcxArray</a> *array, size_t capacity)</td></tr>
+<tr class="memdesc:a27762e7c06a6c781015e3c8ceeee0ce3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the capacity of the array.  <a href="#a27762e7c06a6c781015e3c8ceeee0ce3">More...</a><br /></td></tr>
+<tr class="separator:a27762e7c06a6c781015e3c8ceeee0ce3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1c3bf8433c1de3c933f3854ab297fe1d"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#a1c3bf8433c1de3c933f3854ab297fe1d">ucx_array_reserve</a> (<a class="el" href="structUcxArray.html">UcxArray</a> *array, size_t capacity)</td></tr>
+<tr class="memdesc:a1c3bf8433c1de3c933f3854ab297fe1d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Resizes the array only, if the capacity is insufficient.  <a href="#a1c3bf8433c1de3c933f3854ab297fe1d">More...</a><br /></td></tr>
+<tr class="separator:a1c3bf8433c1de3c933f3854ab297fe1d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab0cbf243824aaebee48277315e03afce"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html#ab0cbf243824aaebee48277315e03afce">ucx_array_grow</a> (<a class="el" href="structUcxArray.html">UcxArray</a> *array, size_t count)</td></tr>
+<tr class="memdesc:ab0cbf243824aaebee48277315e03afce"><td class="mdescLeft">&#160;</td><td class="mdescRight">Resizes the capacity, if the specified number of elements would not fit.  <a href="#ab0cbf243824aaebee48277315e03afce">More...</a><br /></td></tr>
+<tr class="separator:ab0cbf243824aaebee48277315e03afce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Dynamically allocated array implementation. </p>
+<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
+<dd>
+Olaf Wintermann </dd></dl>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a1d959c29af3125bdd37cde3a554e729c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1d959c29af3125bdd37cde3a554e729c">&#9670;&nbsp;</a></span>ucx_array_util_set</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_array_util_set</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">array, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">capacity, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">elmsize, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">idx, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">data&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line"><a class="code" href="array_8h.html#ad0a8d76980cf1c1910e64a245803fb9a">ucx_array_util_set_a</a>(<a class="code" href="allocator_8h.html#a98d2f1b341118b7a0e341fda5d8b2ebf">ucx_default_allocator</a>(), (<span class="keywordtype">void</span>**)(array), capacity, \</div><div class="line">                         elmsize, idx, data)</div><div class="ttc" id="array_8h_html_ad0a8d76980cf1c1910e64a245803fb9a"><div class="ttname"><a href="array_8h.html#ad0a8d76980cf1c1910e64a245803fb9a">ucx_array_util_set_a</a></div><div class="ttdeci">int ucx_array_util_set_a(UcxAllocator *alloc, void **array, size_t *capacity, size_t elmsize, size_t idx, void *data)</div><div class="ttdoc">Sets an element in an arbitrary user defined array. </div><div class="ttdef"><b>Definition:</b> array.c:72</div></div>
+<div class="ttc" id="allocator_8h_html_a98d2f1b341118b7a0e341fda5d8b2ebf"><div class="ttname"><a href="allocator_8h.html#a98d2f1b341118b7a0e341fda5d8b2ebf">ucx_default_allocator</a></div><div class="ttdeci">UcxAllocator * ucx_default_allocator()</div><div class="ttdoc">Returns a pointer to the default allocator. </div><div class="ttdef"><b>Definition:</b> allocator.c:41</div></div>
+</div><!-- fragment -->
+<p>Sets an element in an arbitrary user defined array. </p>
+<p>The data is copied from the specified data location.</p>
+<p>If the capacity is insufficient, the array is automatically reallocated and the possibly new pointer is stored in the <code>array</code> argument.</p>
+<p>On reallocation the capacity of the array is doubled until it is sufficient. The new capacity is stored back to <code>capacity</code>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">array</td><td>a pointer to location of the array pointer </td></tr>
+    <tr><td class="paramname">capacity</td><td>a pointer to the capacity </td></tr>
+    <tr><td class="paramname">elmsize</td><td>the size of each element </td></tr>
+    <tr><td class="paramname">idx</td><td>the index of the element to set </td></tr>
+    <tr><td class="paramname">data</td><td>a pointer to the element data </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>zero on success or non-zero on error (errno will be set) </dd></dl>
+
+</div>
+</div>
+<a id="a59a5b342965e790945f9c7a3f86b99f9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a59a5b342965e790945f9c7a3f86b99f9">&#9670;&nbsp;</a></span>ucx_array_util_setptr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_array_util_setptr</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">array, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">capacity, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">idx, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">ptr&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line"><a class="code" href="array_8h.html#ad708b333c0c1b02c998309a58ea65e31">ucx_array_util_setptr_a</a>(<a class="code" href="allocator_8h.html#a98d2f1b341118b7a0e341fda5d8b2ebf">ucx_default_allocator</a>(), (<span class="keywordtype">void</span>**)(array), \</div><div class="line">                            capacity, idx, ptr)</div><div class="ttc" id="allocator_8h_html_a98d2f1b341118b7a0e341fda5d8b2ebf"><div class="ttname"><a href="allocator_8h.html#a98d2f1b341118b7a0e341fda5d8b2ebf">ucx_default_allocator</a></div><div class="ttdeci">UcxAllocator * ucx_default_allocator()</div><div class="ttdoc">Returns a pointer to the default allocator. </div><div class="ttdef"><b>Definition:</b> allocator.c:41</div></div>
+<div class="ttc" id="array_8h_html_ad708b333c0c1b02c998309a58ea65e31"><div class="ttname"><a href="array_8h.html#ad708b333c0c1b02c998309a58ea65e31">ucx_array_util_setptr_a</a></div><div class="ttdeci">int ucx_array_util_setptr_a(UcxAllocator *alloc, void **array, size_t *capacity, size_t idx, void *ptr)</div><div class="ttdoc">Stores a pointer in an arbitrary user defined array. </div><div class="ttdef"><b>Definition:</b> array.c:112</div></div>
+</div><!-- fragment -->
+<p>Stores a pointer in an arbitrary user defined array. </p>
+<p>The element size of the array must be sizeof(void*).</p>
+<p>If the capacity is insufficient, the array is automatically reallocated and the possibly new pointer is stored in the <code>array</code> argument.</p>
+<p>On reallocation the capacity of the array is doubled until it is sufficient. The new capacity is stored back to <code>capacity</code>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">array</td><td>a pointer to location of the array pointer </td></tr>
+    <tr><td class="paramname">capacity</td><td>a pointer to the capacity </td></tr>
+    <tr><td class="paramname">idx</td><td>the index of the element to set </td></tr>
+    <tr><td class="paramname">ptr</td><td>the pointer to store </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>zero on success or non-zero on error (errno will be set) </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="aea01731ad94ea73c0c8fb1d1b7a35fcf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aea01731ad94ea73c0c8fb1d1b7a35fcf">&#9670;&nbsp;</a></span>ucx_array_append_from()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_array_append_from </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
+          <td class="paramname"><em>array</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>count</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Inserts elements at the end of the array. </p>
+<p>This is an O(1) operation. The array will automatically grow, if the capacity is exceeded. If a pointer to data is provided, the data is copied into the array with memcpy(). Otherwise the new elements are completely zeroed.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">array</td><td>a pointer the array where to append the data </td></tr>
+    <tr><td class="paramname">data</td><td>a pointer to the data to insert (may be <code>NULL</code>) </td></tr>
+    <tr><td class="paramname">count</td><td>number of elements to copy from data (if data is <code>NULL</code>, zeroed elements are appended) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>zero on success, non-zero if a reallocation was necessary but failed </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="array_8h.html#a1bb545d065358d265d80d815ba382a28" title="Sets elements starting at the specified index. ">ucx_array_set_from()</a> </dd>
+<dd>
+ucx_array_append() </dd></dl>
+
+</div>
+</div>
+<a id="aa698085fd1a8b70d6b709999c51b49e8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa698085fd1a8b70d6b709999c51b49e8">&#9670;&nbsp;</a></span>ucx_array_at()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* ucx_array_at </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> const *&#160;</td>
+          <td class="paramname"><em>array</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>index</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns a pointer to the array element at the specified index. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">array</td><td>the array to retrieve the element from </td></tr>
+    <tr><td class="paramname">index</td><td>index of the element to return </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the element at the specified index or <code>NULL</code>, if the index is greater than the array size </dd></dl>
+
+</div>
+</div>
+<a id="a4a8c273370e4a3a3e2624e364f5ab410"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4a8c273370e4a3a3e2624e364f5ab410">&#9670;&nbsp;</a></span>ucx_array_clone()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_array_clone </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
+          <td class="paramname"><em>dest</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> const *&#160;</td>
+          <td class="paramname"><em>src</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Creates an shallow copy of an array. </p>
+<p>This function clones the specified array by using memcpy(). If the destination capacity is insufficient, an automatic reallocation is attempted.</p>
+<p>Note: if the destination array is uninitialized, the behavior is undefined.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">dest</td><td>the array to copy to </td></tr>
+    <tr><td class="paramname">src</td><td>the array to copy from </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>zero on success, non-zero on reallocation failure. </dd></dl>
+
+</div>
+</div>
+<a id="aa5a0bf3d3f0df6406beb0e569021cc28"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa5a0bf3d3f0df6406beb0e569021cc28">&#9670;&nbsp;</a></span>ucx_array_concat()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_array_concat </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
+          <td class="paramname"><em>array1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
+          <td class="paramname"><em>array2</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Concatenates two arrays. </p>
+<p>The contents of the second array are appended to the first array in one single operation. The second array is otherwise left untouched.</p>
+<p>The first array may grow automatically. If this fails, both arrays remain unmodified.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">array1</td><td>first array </td></tr>
+    <tr><td class="paramname">array2</td><td>second array </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>zero on success, non-zero if reallocation was necessary but failed or the element size does not match </dd></dl>
+
+</div>
+</div>
+<a id="a5241058cd2329147bc5b1593ae7e51dc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5241058cd2329147bc5b1593ae7e51dc">&#9670;&nbsp;</a></span>ucx_array_contains()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_array_contains </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> const *&#160;</td>
+          <td class="paramname"><em>array</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>elem</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
+          <td class="paramname"><em>cmpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Checks, if an array contains a specific element. </p>
+<p>An element is found, if <a class="el" href="array_8h.html#ae7bdbed94afee9b20b38b95e3ab470f0" title="Returns the index of an element containing the specified data. ">ucx_array_find()</a> returns a value less than the size.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">array</td><td>the array where to search for the data </td></tr>
+    <tr><td class="paramname">elem</td><td>the element data </td></tr>
+    <tr><td class="paramname">cmpfnc</td><td>the compare function </td></tr>
+    <tr><td class="paramname">data</td><td>additional data for the compare function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1, if and only if the array contains the specified element data </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="array_8h.html#ae7bdbed94afee9b20b38b95e3ab470f0" title="Returns the index of an element containing the specified data. ">ucx_array_find()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a8e83681d8d5d8cddbf10f63ce5be4c10"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8e83681d8d5d8cddbf10f63ce5be4c10">&#9670;&nbsp;</a></span>ucx_array_destroy()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_array_destroy </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
+          <td class="paramname"><em>array</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Destroys the array. </p>
+<p>The data is freed and both capacity and count are reset to zero. If the array structure itself has been dynamically allocated, it has to be freed separately.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">array</td><td>the array to destroy </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a43292b448adb1741677aa8c578bcc201"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a43292b448adb1741677aa8c578bcc201">&#9670;&nbsp;</a></span>ucx_array_equals()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_array_equals </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> const *&#160;</td>
+          <td class="paramname"><em>array1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> const *&#160;</td>
+          <td class="paramname"><em>array2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
+          <td class="paramname"><em>cmpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Compares two UCX arrays element-wise by using a compare function. </p>
+<p>Elements of the two specified arrays are compared by using the specified compare function and the additional data. The type and content of this additional data depends on the <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791" title="Function pointer to a compare function. ">cmp_func()</a> used.</p>
+<p>This function always returns zero, if the element sizes of the arrays do not match and performs no comparisons in this case.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">array1</td><td>the first array </td></tr>
+    <tr><td class="paramname">array2</td><td>the second array </td></tr>
+    <tr><td class="paramname">cmpfnc</td><td>the compare function </td></tr>
+    <tr><td class="paramname">data</td><td>additional data for the compare function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1, if and only if the two arrays equal element-wise, 0 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ae7bdbed94afee9b20b38b95e3ab470f0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae7bdbed94afee9b20b38b95e3ab470f0">&#9670;&nbsp;</a></span>ucx_array_find()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t ucx_array_find </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> const *&#160;</td>
+          <td class="paramname"><em>array</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>elem</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
+          <td class="paramname"><em>cmpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns the index of an element containing the specified data. </p>
+<p>This function uses a <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791" title="Function pointer to a compare function. ">cmp_func()</a> to compare the data of each list element with the specified data. If no cmp_func is provided, memcmp() is used.</p>
+<p>If the array contains the data more than once, the index of the first occurrence is returned. If the array does not contain the data, the size of array is returned.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">array</td><td>the array where to search for the data </td></tr>
+    <tr><td class="paramname">elem</td><td>the element data </td></tr>
+    <tr><td class="paramname">cmpfnc</td><td>the compare function </td></tr>
+    <tr><td class="paramname">data</td><td>additional data for the compare function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the index of the element containing the specified data or the size of the array, if the data is not found in this array </dd></dl>
+
+</div>
+</div>
+<a id="ac01ee914468a16f470bf3071fffbe438"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac01ee914468a16f470bf3071fffbe438">&#9670;&nbsp;</a></span>ucx_array_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_array_free </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
+          <td class="paramname"><em>array</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Destroys and frees the array. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">array</td><td>the array to free </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ab0cbf243824aaebee48277315e03afce"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab0cbf243824aaebee48277315e03afce">&#9670;&nbsp;</a></span>ucx_array_grow()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_array_grow </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
+          <td class="paramname"><em>array</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>count</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Resizes the capacity, if the specified number of elements would not fit. </p>
+<p>A call to ucx_array_grow(array, count) is effectively the same as ucx_array_reserve(array, array-&gt;size+count).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">array</td><td>a pointer to the array </td></tr>
+    <tr><td class="paramname">count</td><td>the number of elements that should additionally fit into the array </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>zero on success, non-zero if reallocation failed </dd></dl>
+
+</div>
+</div>
+<a id="ad921e85c28ffae32230777a53c5037e5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad921e85c28ffae32230777a53c5037e5">&#9670;&nbsp;</a></span>ucx_array_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_array_init </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
+          <td class="paramname"><em>array</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>capacity</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>elemsize</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Initializes a UCX array structure with the given capacity and element size. </p>
+<p>The structure must be uninitialized as the data pointer will be overwritten.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">array</td><td>the structure to initialize </td></tr>
+    <tr><td class="paramname">capacity</td><td>the initial capacity </td></tr>
+    <tr><td class="paramname">elemsize</td><td>the element size </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a2451e61ebb15a7ba1c1319267ba75b8c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2451e61ebb15a7ba1c1319267ba75b8c">&#9670;&nbsp;</a></span>ucx_array_init_a()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_array_init_a </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
+          <td class="paramname"><em>array</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>capacity</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>elemsize</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Initializes a UCX array structure using the specified allocator. </p>
+<p>The structure must be uninitialized as the data pointer will be overwritten.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">array</td><td>the structure to initialize </td></tr>
+    <tr><td class="paramname">capacity</td><td>the initial capacity </td></tr>
+    <tr><td class="paramname">elemsize</td><td>the element size </td></tr>
+    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a994a2fbf1c33a3833e2a70cd9a4352b7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a994a2fbf1c33a3833e2a70cd9a4352b7">&#9670;&nbsp;</a></span>ucx_array_new()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxArray.html">UcxArray</a>* ucx_array_new </td>
+          <td>(</td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>capacity</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>elemsize</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Creates a new UCX array with the given capacity and element size. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">capacity</td><td>the initial capacity </td></tr>
+    <tr><td class="paramname">elemsize</td><td>the element size </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to a new UCX array structure </dd></dl>
+
+</div>
+</div>
+<a id="a177170258c215eb2e4f5a32e59f0cb1b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a177170258c215eb2e4f5a32e59f0cb1b">&#9670;&nbsp;</a></span>ucx_array_new_a()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxArray.html">UcxArray</a>* ucx_array_new_a </td>
+          <td>(</td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>capacity</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>elemsize</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Creates a new UCX array using the specified allocator. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">capacity</td><td>the initial capacity </td></tr>
+    <tr><td class="paramname">elemsize</td><td>the element size </td></tr>
+    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to new UCX array structure </dd></dl>
+
+</div>
+</div>
+<a id="a95b52acc2193b5c33cf0eaa4f2082477"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a95b52acc2193b5c33cf0eaa4f2082477">&#9670;&nbsp;</a></span>ucx_array_prepend_from()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_array_prepend_from </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
+          <td class="paramname"><em>array</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>count</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Inserts elements at the beginning of the array. </p>
+<p>This is an expensive operation, because the contents must be moved. If there is no particular reason to prepend data, you should use <a class="el" href="array_8h.html#aea01731ad94ea73c0c8fb1d1b7a35fcf" title="Inserts elements at the end of the array. ">ucx_array_append_from()</a> instead.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">array</td><td>a pointer the array where to prepend the data </td></tr>
+    <tr><td class="paramname">data</td><td>a pointer to the data to insert (may be <code>NULL</code>) </td></tr>
+    <tr><td class="paramname">count</td><td>number of elements to copy from data (if data is <code>NULL</code>, zeroed elements are inserted) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>zero on success, non-zero if a reallocation was necessary but failed </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="array_8h.html#aea01731ad94ea73c0c8fb1d1b7a35fcf" title="Inserts elements at the end of the array. ">ucx_array_append_from()</a> </dd>
+<dd>
+<a class="el" href="array_8h.html#a1bb545d065358d265d80d815ba382a28" title="Sets elements starting at the specified index. ">ucx_array_set_from()</a> </dd>
+<dd>
+ucx_array_prepend() </dd></dl>
+
+</div>
+</div>
+<a id="aa45eac6b697f83adac81c0860cf306b8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa45eac6b697f83adac81c0860cf306b8">&#9670;&nbsp;</a></span>ucx_array_remove()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_array_remove </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
+          <td class="paramname"><em>array</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>index</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Removes an element from the array. </p>
+<p>This is in general an expensive operation, because several elements may be moved. If the order of the elements is not relevant, use <a class="el" href="array_8h.html#a548d81b07612bae3ba8c4c4b49104b8e" title="Removes an element from the array. ">ucx_array_remove_fast()</a> instead.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">array</td><td>pointer to the array from which the element shall be removed </td></tr>
+    <tr><td class="paramname">index</td><td>the index of the element to remove </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a548d81b07612bae3ba8c4c4b49104b8e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a548d81b07612bae3ba8c4c4b49104b8e">&#9670;&nbsp;</a></span>ucx_array_remove_fast()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_array_remove_fast </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
+          <td class="paramname"><em>array</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>index</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Removes an element from the array. </p>
+<p>This is an O(1) operation, but does not maintain the order of the elements. The last element in the array is moved to the location of the removed element.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">array</td><td>pointer to the array from which the element shall be removed </td></tr>
+    <tr><td class="paramname">index</td><td>the index of the element to remove </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a1c3bf8433c1de3c933f3854ab297fe1d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1c3bf8433c1de3c933f3854ab297fe1d">&#9670;&nbsp;</a></span>ucx_array_reserve()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_array_reserve </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
+          <td class="paramname"><em>array</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>capacity</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Resizes the array only, if the capacity is insufficient. </p>
+<p>If the requested capacity is smaller than the current capacity, this function does nothing.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">array</td><td>a pointer to the array </td></tr>
+    <tr><td class="paramname">capacity</td><td>the guaranteed capacity </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>zero on success, non-zero if reallocation failed </dd></dl>
+
+</div>
+</div>
+<a id="a27762e7c06a6c781015e3c8ceeee0ce3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a27762e7c06a6c781015e3c8ceeee0ce3">&#9670;&nbsp;</a></span>ucx_array_resize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_array_resize </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
+          <td class="paramname"><em>array</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>capacity</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Sets the capacity of the array. </p>
+<p>If the new capacity is smaller than the size of the array, the elements are removed and the size is adjusted accordingly.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">array</td><td>a pointer to the array </td></tr>
+    <tr><td class="paramname">capacity</td><td>the new capacity </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>zero on success, non-zero if reallocation failed </dd></dl>
+
+</div>
+</div>
+<a id="a1bb545d065358d265d80d815ba382a28"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1bb545d065358d265d80d815ba382a28">&#9670;&nbsp;</a></span>ucx_array_set_from()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_array_set_from </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
+          <td class="paramname"><em>array</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>index</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>count</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Sets elements starting at the specified index. </p>
+<p>If the any index is out of bounds, the array automatically grows. The pointer to the data may be NULL, in which case the elements are zeroed.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">array</td><td>a pointer the array where to set the data </td></tr>
+    <tr><td class="paramname">index</td><td>the index of the element to set </td></tr>
+    <tr><td class="paramname">data</td><td>a pointer to the data to insert (may be <code>NULL</code>) </td></tr>
+    <tr><td class="paramname">count</td><td>number of elements to copy from data (if data is <code>NULL</code>, the memory in the array is zeroed) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>zero on success, non-zero if a reallocation was necessary but failed </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="array_8h.html#aea01731ad94ea73c0c8fb1d1b7a35fcf" title="Inserts elements at the end of the array. ">ucx_array_append_from()</a> </dd>
+<dd>
+ucx_array_set() </dd></dl>
+
+</div>
+</div>
+<a id="a2daf50e80aee9bccebee876a7efd2dfc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2daf50e80aee9bccebee876a7efd2dfc">&#9670;&nbsp;</a></span>ucx_array_shrink()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_array_shrink </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
+          <td class="paramname"><em>array</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shrinks the memory to exactly fit the contents. </p>
+<p>After this operation, the capacity equals the size.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">array</td><td>a pointer to the array </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>zero on success, non-zero if reallocation failed </dd></dl>
+
+</div>
+</div>
+<a id="add773514569b872a6624381b4b6af52c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#add773514569b872a6624381b4b6af52c">&#9670;&nbsp;</a></span>ucx_array_sort()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_array_sort </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxArray.html">UcxArray</a> *&#160;</td>
+          <td class="paramname"><em>array</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
+          <td class="paramname"><em>cmpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Sorts a <a class="el" href="structUcxArray.html" title="UCX array type. ">UcxArray</a> with the best available sort algorithm. </p>
+<p>The qsort_r() function is used, if available (glibc, FreeBSD or MacOS). The order of arguments is automatically adjusted for the FreeBSD and MacOS version of qsort_r().</p>
+<p>If qsort_r() is not available, a merge sort algorithm is used, which is guaranteed to use no more additional memory than for exactly one element.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">array</td><td>the array to sort </td></tr>
+    <tr><td class="paramname">cmpfnc</td><td>the function that shall be used to compare the element data </td></tr>
+    <tr><td class="paramname">data</td><td>additional data for the <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791" title="Function pointer to a compare function. ">cmp_func()</a> or <code>NULL</code> </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ad0a8d76980cf1c1910e64a245803fb9a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad0a8d76980cf1c1910e64a245803fb9a">&#9670;&nbsp;</a></span>ucx_array_util_set_a()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_array_util_set_a </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>alloc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void **&#160;</td>
+          <td class="paramname"><em>array</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t *&#160;</td>
+          <td class="paramname"><em>capacity</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>elmsize</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>idx</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Sets an element in an arbitrary user defined array. </p>
+<p>The data is copied from the specified data location.</p>
+<p>If the capacity is insufficient, the array is automatically reallocated using the specified allocator and the possibly new pointer is stored in the <code>array</code> argument.</p>
+<p>On reallocation the capacity of the array is doubled until it is sufficient. The new capacity is stored back to <code>capacity</code>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">alloc</td><td>the allocator that shall be used to reallocate the array </td></tr>
+    <tr><td class="paramname">array</td><td>a pointer to location of the array pointer </td></tr>
+    <tr><td class="paramname">capacity</td><td>a pointer to the capacity </td></tr>
+    <tr><td class="paramname">elmsize</td><td>the size of each element </td></tr>
+    <tr><td class="paramname">idx</td><td>the index of the element to set </td></tr>
+    <tr><td class="paramname">data</td><td>a pointer to the element data </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>zero on success or non-zero on error (errno will be set) </dd></dl>
+
+</div>
+</div>
+<a id="ad708b333c0c1b02c998309a58ea65e31"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad708b333c0c1b02c998309a58ea65e31">&#9670;&nbsp;</a></span>ucx_array_util_setptr_a()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_array_util_setptr_a </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>alloc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void **&#160;</td>
+          <td class="paramname"><em>array</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t *&#160;</td>
+          <td class="paramname"><em>capacity</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>idx</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>ptr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Stores a pointer in an arbitrary user defined array. </p>
+<p>The element size of the array must be sizeof(void*).</p>
+<p>If the capacity is insufficient, the array is automatically reallocated using the specified allocator and the possibly new pointer is stored in the <code>array</code> argument.</p>
+<p>On reallocation the capacity of the array is doubled until it is sufficient. The new capacity is stored back to <code>capacity</code>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">alloc</td><td>the allocator that shall be used to reallocate the array </td></tr>
+    <tr><td class="paramname">array</td><td>a pointer to location of the array pointer </td></tr>
+    <tr><td class="paramname">capacity</td><td>a pointer to the capacity </td></tr>
+    <tr><td class="paramname">idx</td><td>the index of the element to set </td></tr>
+    <tr><td class="paramname">ptr</td><td>the pointer to store </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>zero on success or non-zero on error (errno will be set) </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/array_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,113 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/array.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">array.h</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a href="array_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment"> * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * Copyright 2019 Mike Becker, Olaf Wintermann All rights reserved.</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"> * Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment"> * modification, are permitted provided that the following conditions are met:</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> *   1. Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> *   2. Redistributions in binary form must reproduce the above copyright</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer in the</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment"> *      documentation and/or other materials provided with the distribution.</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment"> * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment"> * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment"> * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"> * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment"> * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment"> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment"> * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE</span></div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> * POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;<span class="preprocessor">#ifndef UCX_ARRAY_H</span></div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;<span class="preprocessor">#define UCX_ARRAY_H</span></div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;</div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ucx_8h.html">ucx.h</a>&quot;</span></div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="allocator_8h.html">allocator.h</a>&quot;</span></div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;</div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;</div><div class="line"><a name="l00049"></a><span class="lineno"><a class="line" href="structUcxArray.html">   49</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span>{</div><div class="line"><a name="l00053"></a><span class="lineno"><a class="line" href="structUcxArray.html#a7ed074887908e45bde7e1fbc67b31c18">   53</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="structUcxArray.html#a7ed074887908e45bde7e1fbc67b31c18">capacity</a>;</div><div class="line"><a name="l00057"></a><span class="lineno"><a class="line" href="structUcxArray.html#a20c11f2c9048cda80062842b7c094e20">   57</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="structUcxArray.html#a20c11f2c9048cda80062842b7c094e20">size</a>;</div><div class="line"><a name="l00061"></a><span class="lineno"><a class="line" href="structUcxArray.html#ac4e9ecdf8a8d010644f6e44dfef8190f">   61</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="structUcxArray.html#ac4e9ecdf8a8d010644f6e44dfef8190f">elemsize</a>;</div><div class="line"><a name="l00065"></a><span class="lineno"><a class="line" href="structUcxArray.html#a04d2b03d0a45af1fab19b4216602075a">   65</a></span>&#160;    <span class="keywordtype">void</span>* <a class="code" href="structUcxArray.html#a04d2b03d0a45af1fab19b4216602075a">data</a>;</div><div class="line"><a name="l00069"></a><span class="lineno"><a class="line" href="structUcxArray.html#a2ef31303b7548b9aa8e2b9187e295212">   69</a></span>&#160;    <a class="code" href="structUcxAllocator.html">UcxAllocator</a>* <a class="code" href="structUcxArray.html#a2ef31303b7548b9aa8e2b9187e295212">allocator</a>;</div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;} <a class="code" href="structUcxArray.html">UcxArray</a>;</div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;</div><div class="line"><a name="l00089"></a><span class="lineno"><a class="line" href="array_8h.html#a1d959c29af3125bdd37cde3a554e729c">   89</a></span>&#160;<span class="preprocessor">#define ucx_array_util_set(array, capacity, elmsize, idx, data) \</span></div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;<span class="preprocessor">    ucx_array_util_set_a(ucx_default_allocator(), (void**)(array), capacity, \</span></div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;<span class="preprocessor">                         elmsize, idx, data)</span></div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;</div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;<span class="keywordtype">int</span> <a class="code" href="array_8h.html#ad0a8d76980cf1c1910e64a245803fb9a">ucx_array_util_set_a</a>(<a class="code" href="structUcxAllocator.html">UcxAllocator</a>* alloc, <span class="keywordtype">void</span>** array, <span class="keywordtype">size_t</span>* capacity,</div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;    <span class="keywordtype">size_t</span> elmsize, <span class="keywordtype">size_t</span> idx, <span class="keywordtype">void</span>* data);</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;</div><div class="line"><a name="l00131"></a><span class="lineno"><a class="line" href="array_8h.html#a59a5b342965e790945f9c7a3f86b99f9">  131</a></span>&#160;<span class="preprocessor">#define ucx_array_util_setptr(array, capacity, idx, ptr) \</span></div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;<span class="preprocessor">    ucx_array_util_setptr_a(ucx_default_allocator(), (void**)(array), \</span></div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;<span class="preprocessor">                            capacity, idx, ptr)</span></div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;<span class="keywordtype">int</span> <a class="code" href="array_8h.html#ad708b333c0c1b02c998309a58ea65e31">ucx_array_util_setptr_a</a>(<a class="code" href="structUcxAllocator.html">UcxAllocator</a>* alloc, <span class="keywordtype">void</span>** array, <span class="keywordtype">size_t</span>* capacity,</div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;    <span class="keywordtype">size_t</span> idx, <span class="keywordtype">void</span>* ptr);</div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;</div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;</div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;<a class="code" href="structUcxArray.html">UcxArray</a>* <a class="code" href="array_8h.html#a994a2fbf1c33a3833e2a70cd9a4352b7">ucx_array_new</a>(<span class="keywordtype">size_t</span> capacity, <span class="keywordtype">size_t</span> elemsize);</div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;</div><div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;<a class="code" href="structUcxArray.html">UcxArray</a>* <a class="code" href="array_8h.html#a177170258c215eb2e4f5a32e59f0cb1b">ucx_array_new_a</a>(<span class="keywordtype">size_t</span> capacity, <span class="keywordtype">size_t</span> elemsize,</div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;        <a class="code" href="structUcxAllocator.html">UcxAllocator</a>* allocator);</div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;</div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;<span class="keywordtype">void</span> <a class="code" href="array_8h.html#ad921e85c28ffae32230777a53c5037e5">ucx_array_init</a>(<a class="code" href="structUcxArray.html">UcxArray</a>* array, <span class="keywordtype">size_t</span> capacity, <span class="keywordtype">size_t</span> elemsize);</div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;</div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;<span class="keywordtype">void</span> <a class="code" href="array_8h.html#a2451e61ebb15a7ba1c1319267ba75b8c">ucx_array_init_a</a>(<a class="code" href="structUcxArray.html">UcxArray</a>* array, <span class="keywordtype">size_t</span> capacity, <span class="keywordtype">size_t</span> elemsize,</div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;        <a class="code" href="structUcxAllocator.html">UcxAllocator</a>* allocator);</div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;</div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;<span class="keywordtype">int</span> <a class="code" href="array_8h.html#a4a8c273370e4a3a3e2624e364f5ab410">ucx_array_clone</a>(<a class="code" href="structUcxArray.html">UcxArray</a>* dest, <a class="code" href="structUcxArray.html">UcxArray</a> <span class="keyword">const</span>* src);</div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;</div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;</div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;<span class="keywordtype">int</span> <a class="code" href="array_8h.html#a43292b448adb1741677aa8c578bcc201">ucx_array_equals</a>(<a class="code" href="structUcxArray.html">UcxArray</a> <span class="keyword">const</span> *array1, <a class="code" href="structUcxArray.html">UcxArray</a> <span class="keyword">const</span> *array2,</div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;        <a class="code" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, <span class="keywordtype">void</span>* data);</div><div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;</div><div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;<span class="keywordtype">void</span> <a class="code" href="array_8h.html#a8e83681d8d5d8cddbf10f63ce5be4c10">ucx_array_destroy</a>(<a class="code" href="structUcxArray.html">UcxArray</a> *array);</div><div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;</div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;<span class="keywordtype">void</span> <a class="code" href="array_8h.html#ac01ee914468a16f470bf3071fffbe438">ucx_array_free</a>(<a class="code" href="structUcxArray.html">UcxArray</a> *array);</div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;</div><div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;<span class="keywordtype">int</span> <a class="code" href="array_8h.html#aea01731ad94ea73c0c8fb1d1b7a35fcf">ucx_array_append_from</a>(<a class="code" href="structUcxArray.html">UcxArray</a> *array, <span class="keywordtype">void</span> *data, <span class="keywordtype">size_t</span> count);</div><div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;</div><div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;</div><div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;<span class="keywordtype">int</span> <a class="code" href="array_8h.html#a95b52acc2193b5c33cf0eaa4f2082477">ucx_array_prepend_from</a>(<a class="code" href="structUcxArray.html">UcxArray</a> *array, <span class="keywordtype">void</span> *data, <span class="keywordtype">size_t</span> count);</div><div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;</div><div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;</div><div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;<span class="keywordtype">int</span> <a class="code" href="array_8h.html#a1bb545d065358d265d80d815ba382a28">ucx_array_set_from</a>(<a class="code" href="structUcxArray.html">UcxArray</a> *array, <span class="keywordtype">size_t</span> index, <span class="keywordtype">void</span> *data, <span class="keywordtype">size_t</span> count);</div><div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;</div><div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;<span class="keywordtype">int</span> <a class="code" href="array_8h.html#aa5a0bf3d3f0df6406beb0e569021cc28">ucx_array_concat</a>(<a class="code" href="structUcxArray.html">UcxArray</a> *array1, <span class="keyword">const</span> <a class="code" href="structUcxArray.html">UcxArray</a> *array2);</div><div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;</div><div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;<span class="keywordtype">void</span> *<a class="code" href="array_8h.html#aa698085fd1a8b70d6b709999c51b49e8">ucx_array_at</a>(<a class="code" href="structUcxArray.html">UcxArray</a> <span class="keyword">const</span>* array, <span class="keywordtype">size_t</span> index);</div><div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;</div><div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;<span class="keywordtype">size_t</span> <a class="code" href="array_8h.html#ae7bdbed94afee9b20b38b95e3ab470f0">ucx_array_find</a>(<a class="code" href="structUcxArray.html">UcxArray</a> <span class="keyword">const</span> *array, <span class="keywordtype">void</span> *elem,</div><div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;    <a class="code" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;</div><div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;<span class="keywordtype">int</span> <a class="code" href="array_8h.html#a5241058cd2329147bc5b1593ae7e51dc">ucx_array_contains</a>(<a class="code" href="structUcxArray.html">UcxArray</a> <span class="keyword">const</span> *array, <span class="keywordtype">void</span> *elem,</div><div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;    <a class="code" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;</div><div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;<span class="keywordtype">void</span> <a class="code" href="array_8h.html#add773514569b872a6624381b4b6af52c">ucx_array_sort</a>(<a class="code" href="structUcxArray.html">UcxArray</a>* array, <a class="code" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;</div><div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;<span class="keywordtype">void</span> <a class="code" href="array_8h.html#aa45eac6b697f83adac81c0860cf306b8">ucx_array_remove</a>(<a class="code" href="structUcxArray.html">UcxArray</a> *array, <span class="keywordtype">size_t</span> index);</div><div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;</div><div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;<span class="keywordtype">void</span> <a class="code" href="array_8h.html#a548d81b07612bae3ba8c4c4b49104b8e">ucx_array_remove_fast</a>(<a class="code" href="structUcxArray.html">UcxArray</a> *array, <span class="keywordtype">size_t</span> index);</div><div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;</div><div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;<span class="keywordtype">int</span> <a class="code" href="array_8h.html#a2daf50e80aee9bccebee876a7efd2dfc">ucx_array_shrink</a>(<a class="code" href="structUcxArray.html">UcxArray</a>* array);</div><div class="line"><a name="l00416"></a><span class="lineno">  416</span>&#160;</div><div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;<span class="keywordtype">int</span> <a class="code" href="array_8h.html#a27762e7c06a6c781015e3c8ceeee0ce3">ucx_array_resize</a>(<a class="code" href="structUcxArray.html">UcxArray</a>* array, <span class="keywordtype">size_t</span> capacity);</div><div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;</div><div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;<span class="keywordtype">int</span> <a class="code" href="array_8h.html#a1c3bf8433c1de3c933f3854ab297fe1d">ucx_array_reserve</a>(<a class="code" href="structUcxArray.html">UcxArray</a>* array, <span class="keywordtype">size_t</span> capacity);</div><div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;</div><div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;<span class="keywordtype">int</span> <a class="code" href="array_8h.html#ab0cbf243824aaebee48277315e03afce">ucx_array_grow</a>(<a class="code" href="structUcxArray.html">UcxArray</a>* array, <span class="keywordtype">size_t</span> count);</div><div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;</div><div class="line"><a name="l00454"></a><span class="lineno">  454</span>&#160;</div><div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;}</div><div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;</div><div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;<span class="preprocessor">#endif  </span><span class="comment">/* UCX_ARRAY_H */</span><span class="preprocessor"></span></div><div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;</div><div class="ttc" id="array_8h_html_aea01731ad94ea73c0c8fb1d1b7a35fcf"><div class="ttname"><a href="array_8h.html#aea01731ad94ea73c0c8fb1d1b7a35fcf">ucx_array_append_from</a></div><div class="ttdeci">int ucx_array_append_from(UcxArray *array, void *data, size_t count)</div><div class="ttdoc">Inserts elements at the end of the array. </div><div class="ttdef"><b>Definition:</b> array.c:206</div></div>
+<div class="ttc" id="array_8h_html_a95b52acc2193b5c33cf0eaa4f2082477"><div class="ttname"><a href="array_8h.html#a95b52acc2193b5c33cf0eaa4f2082477">ucx_array_prepend_from</a></div><div class="ttdeci">int ucx_array_prepend_from(UcxArray *array, void *data, size_t count)</div><div class="ttdoc">Inserts elements at the beginning of the array. </div><div class="ttdef"><b>Definition:</b> array.c:221</div></div>
+<div class="ttc" id="array_8h_html_ab0cbf243824aaebee48277315e03afce"><div class="ttname"><a href="array_8h.html#ab0cbf243824aaebee48277315e03afce">ucx_array_grow</a></div><div class="ttdeci">int ucx_array_grow(UcxArray *array, size_t count)</div><div class="ttdoc">Resizes the capacity, if the specified number of elements would not fit. </div><div class="ttdef"><b>Definition:</b> array.c:465</div></div>
+<div class="ttc" id="ucx_8h_html_afe5e2d5dbf34778e0e97852051570791"><div class="ttname"><a href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a></div><div class="ttdeci">int(* cmp_func)(const void *, const void *, void *)</div><div class="ttdoc">Function pointer to a compare function. </div><div class="ttdef"><b>Definition:</b> ucx.h:84</div></div>
+<div class="ttc" id="array_8h_html_a2daf50e80aee9bccebee876a7efd2dfc"><div class="ttname"><a href="array_8h.html#a2daf50e80aee9bccebee876a7efd2dfc">ucx_array_shrink</a></div><div class="ttdeci">int ucx_array_shrink(UcxArray *array)</div><div class="ttdoc">Shrinks the memory to exactly fit the contents. </div><div class="ttdef"><b>Definition:</b> array.c:418</div></div>
+<div class="ttc" id="array_8h_html_aa5a0bf3d3f0df6406beb0e569021cc28"><div class="ttname"><a href="array_8h.html#aa5a0bf3d3f0df6406beb0e569021cc28">ucx_array_concat</a></div><div class="ttdeci">int ucx_array_concat(UcxArray *array1, const UcxArray *array2)</div><div class="ttdoc">Concatenates two arrays. </div><div class="ttdef"><b>Definition:</b> array.c:259</div></div>
+<div class="ttc" id="ucx_8h_html"><div class="ttname"><a href="ucx_8h.html">ucx.h</a></div><div class="ttdoc">Main UCX Header providing most common definitions. </div></div>
+<div class="ttc" id="structUcxArray_html_a7ed074887908e45bde7e1fbc67b31c18"><div class="ttname"><a href="structUcxArray.html#a7ed074887908e45bde7e1fbc67b31c18">UcxArray::capacity</a></div><div class="ttdeci">size_t capacity</div><div class="ttdoc">The current capacity of the array. </div><div class="ttdef"><b>Definition:</b> array.h:53</div></div>
+<div class="ttc" id="array_8h_html_ad0a8d76980cf1c1910e64a245803fb9a"><div class="ttname"><a href="array_8h.html#ad0a8d76980cf1c1910e64a245803fb9a">ucx_array_util_set_a</a></div><div class="ttdeci">int ucx_array_util_set_a(UcxAllocator *alloc, void **array, size_t *capacity, size_t elmsize, size_t idx, void *data)</div><div class="ttdoc">Sets an element in an arbitrary user defined array. </div><div class="ttdef"><b>Definition:</b> array.c:72</div></div>
+<div class="ttc" id="array_8h_html_a43292b448adb1741677aa8c578bcc201"><div class="ttname"><a href="array_8h.html#a43292b448adb1741677aa8c578bcc201">ucx_array_equals</a></div><div class="ttdeci">int ucx_array_equals(UcxArray const *array1, UcxArray const *array2, cmp_func cmpfnc, void *data)</div><div class="ttdoc">Compares two UCX arrays element-wise by using a compare function. </div><div class="ttdef"><b>Definition:</b> array.c:166</div></div>
+<div class="ttc" id="array_8h_html_a2451e61ebb15a7ba1c1319267ba75b8c"><div class="ttname"><a href="array_8h.html#a2451e61ebb15a7ba1c1319267ba75b8c">ucx_array_init_a</a></div><div class="ttdeci">void ucx_array_init_a(UcxArray *array, size_t capacity, size_t elemsize, UcxAllocator *allocator)</div><div class="ttdoc">Initializes a UCX array structure using the specified allocator. </div><div class="ttdef"><b>Definition:</b> array.c:136</div></div>
+<div class="ttc" id="array_8h_html_add773514569b872a6624381b4b6af52c"><div class="ttname"><a href="array_8h.html#add773514569b872a6624381b4b6af52c">ucx_array_sort</a></div><div class="ttdeci">void ucx_array_sort(UcxArray *array, cmp_func cmpfnc, void *data)</div><div class="ttdoc">Sorts a UcxArray with the best available sort algorithm. </div><div class="ttdef"><b>Definition:</b> array.c:395</div></div>
+<div class="ttc" id="structUcxArray_html_a04d2b03d0a45af1fab19b4216602075a"><div class="ttname"><a href="structUcxArray.html#a04d2b03d0a45af1fab19b4216602075a">UcxArray::data</a></div><div class="ttdeci">void * data</div><div class="ttdoc">A pointer to the data. </div><div class="ttdef"><b>Definition:</b> array.h:65</div></div>
+<div class="ttc" id="array_8h_html_a994a2fbf1c33a3833e2a70cd9a4352b7"><div class="ttname"><a href="array_8h.html#a994a2fbf1c33a3833e2a70cd9a4352b7">ucx_array_new</a></div><div class="ttdeci">UcxArray * ucx_array_new(size_t capacity, size_t elemsize)</div><div class="ttdoc">Creates a new UCX array with the given capacity and element size. </div><div class="ttdef"><b>Definition:</b> array.c:119</div></div>
+<div class="ttc" id="array_8h_html_aa45eac6b697f83adac81c0860cf306b8"><div class="ttname"><a href="array_8h.html#aa45eac6b697f83adac81c0860cf306b8">ucx_array_remove</a></div><div class="ttdeci">void ucx_array_remove(UcxArray *array, size_t index)</div><div class="ttdoc">Removes an element from the array. </div><div class="ttdef"><b>Definition:</b> array.c:400</div></div>
+<div class="ttc" id="structUcxArray_html_a2ef31303b7548b9aa8e2b9187e295212"><div class="ttname"><a href="structUcxArray.html#a2ef31303b7548b9aa8e2b9187e295212">UcxArray::allocator</a></div><div class="ttdeci">UcxAllocator * allocator</div><div class="ttdoc">The allocator used for the data. </div><div class="ttdef"><b>Definition:</b> array.h:69</div></div>
+<div class="ttc" id="array_8h_html_a1bb545d065358d265d80d815ba382a28"><div class="ttname"><a href="array_8h.html#a1bb545d065358d265d80d815ba382a28">ucx_array_set_from</a></div><div class="ttdeci">int ucx_array_set_from(UcxArray *array, size_t index, void *data, size_t count)</div><div class="ttdoc">Sets elements starting at the specified index. </div><div class="ttdef"><b>Definition:</b> array.c:240</div></div>
+<div class="ttc" id="array_8h_html_a548d81b07612bae3ba8c4c4b49104b8e"><div class="ttname"><a href="array_8h.html#a548d81b07612bae3ba8c4c4b49104b8e">ucx_array_remove_fast</a></div><div class="ttdeci">void ucx_array_remove_fast(UcxArray *array, size_t index)</div><div class="ttdoc">Removes an element from the array. </div><div class="ttdef"><b>Definition:</b> array.c:409</div></div>
+<div class="ttc" id="structUcxAllocator_html"><div class="ttname"><a href="structUcxAllocator.html">UcxAllocator</a></div><div class="ttdoc">UCX allocator data structure containing memory management functions. </div><div class="ttdef"><b>Definition:</b> allocator.h:88</div></div>
+<div class="ttc" id="array_8h_html_a5241058cd2329147bc5b1593ae7e51dc"><div class="ttname"><a href="array_8h.html#a5241058cd2329147bc5b1593ae7e51dc">ucx_array_contains</a></div><div class="ttdeci">int ucx_array_contains(UcxArray const *array, void *elem, cmp_func cmpfnc, void *data)</div><div class="ttdoc">Checks, if an array contains a specific element. </div><div class="ttdef"><b>Definition:</b> array.c:309</div></div>
+<div class="ttc" id="array_8h_html_ae7bdbed94afee9b20b38b95e3ab470f0"><div class="ttname"><a href="array_8h.html#ae7bdbed94afee9b20b38b95e3ab470f0">ucx_array_find</a></div><div class="ttdeci">size_t ucx_array_find(UcxArray const *array, void *elem, cmp_func cmpfnc, void *data)</div><div class="ttdoc">Returns the index of an element containing the specified data. </div><div class="ttdef"><b>Definition:</b> array.c:286</div></div>
+<div class="ttc" id="structUcxArray_html"><div class="ttname"><a href="structUcxArray.html">UcxArray</a></div><div class="ttdoc">UCX array type. </div><div class="ttdef"><b>Definition:</b> array.h:49</div></div>
+<div class="ttc" id="structUcxArray_html_a20c11f2c9048cda80062842b7c094e20"><div class="ttname"><a href="structUcxArray.html#a20c11f2c9048cda80062842b7c094e20">UcxArray::size</a></div><div class="ttdeci">size_t size</div><div class="ttdoc">The actual number of elements in the array. </div><div class="ttdef"><b>Definition:</b> array.h:57</div></div>
+<div class="ttc" id="array_8h_html_a8e83681d8d5d8cddbf10f63ce5be4c10"><div class="ttname"><a href="array_8h.html#a8e83681d8d5d8cddbf10f63ce5be4c10">ucx_array_destroy</a></div><div class="ttdeci">void ucx_array_destroy(UcxArray *array)</div><div class="ttdoc">Destroys the array. </div><div class="ttdef"><b>Definition:</b> array.c:194</div></div>
+<div class="ttc" id="array_8h_html_ad708b333c0c1b02c998309a58ea65e31"><div class="ttname"><a href="array_8h.html#ad708b333c0c1b02c998309a58ea65e31">ucx_array_util_setptr_a</a></div><div class="ttdeci">int ucx_array_util_setptr_a(UcxAllocator *alloc, void **array, size_t *capacity, size_t idx, void *ptr)</div><div class="ttdoc">Stores a pointer in an arbitrary user defined array. </div><div class="ttdef"><b>Definition:</b> array.c:112</div></div>
+<div class="ttc" id="allocator_8h_html"><div class="ttname"><a href="allocator_8h.html">allocator.h</a></div><div class="ttdoc">Allocator for custom memory management. </div></div>
+<div class="ttc" id="array_8h_html_ac01ee914468a16f470bf3071fffbe438"><div class="ttname"><a href="array_8h.html#ac01ee914468a16f470bf3071fffbe438">ucx_array_free</a></div><div class="ttdeci">void ucx_array_free(UcxArray *array)</div><div class="ttdoc">Destroys and frees the array. </div><div class="ttdef"><b>Definition:</b> array.c:201</div></div>
+<div class="ttc" id="array_8h_html_a4a8c273370e4a3a3e2624e364f5ab410"><div class="ttname"><a href="array_8h.html#a4a8c273370e4a3a3e2624e364f5ab410">ucx_array_clone</a></div><div class="ttdeci">int ucx_array_clone(UcxArray *dest, UcxArray const *src)</div><div class="ttdoc">Creates an shallow copy of an array. </div><div class="ttdef"><b>Definition:</b> array.c:151</div></div>
+<div class="ttc" id="array_8h_html_aa698085fd1a8b70d6b709999c51b49e8"><div class="ttname"><a href="array_8h.html#aa698085fd1a8b70d6b709999c51b49e8">ucx_array_at</a></div><div class="ttdeci">void * ucx_array_at(UcxArray const *array, size_t index)</div><div class="ttdoc">Returns a pointer to the array element at the specified index. </div><div class="ttdef"><b>Definition:</b> array.c:280</div></div>
+<div class="ttc" id="array_8h_html_a27762e7c06a6c781015e3c8ceeee0ce3"><div class="ttname"><a href="array_8h.html#a27762e7c06a6c781015e3c8ceeee0ce3">ucx_array_resize</a></div><div class="ttdeci">int ucx_array_resize(UcxArray *array, size_t capacity)</div><div class="ttdoc">Sets the capacity of the array. </div><div class="ttdef"><b>Definition:</b> array.c:430</div></div>
+<div class="ttc" id="array_8h_html_ad921e85c28ffae32230777a53c5037e5"><div class="ttname"><a href="array_8h.html#ad921e85c28ffae32230777a53c5037e5">ucx_array_init</a></div><div class="ttdeci">void ucx_array_init(UcxArray *array, size_t capacity, size_t elemsize)</div><div class="ttdoc">Initializes a UCX array structure with the given capacity and element size. </div><div class="ttdef"><b>Definition:</b> array.c:132</div></div>
+<div class="ttc" id="structUcxArray_html_ac4e9ecdf8a8d010644f6e44dfef8190f"><div class="ttname"><a href="structUcxArray.html#ac4e9ecdf8a8d010644f6e44dfef8190f">UcxArray::elemsize</a></div><div class="ttdeci">size_t elemsize</div><div class="ttdoc">The size of an individual element in bytes. </div><div class="ttdef"><b>Definition:</b> array.h:61</div></div>
+<div class="ttc" id="array_8h_html_a1c3bf8433c1de3c933f3854ab297fe1d"><div class="ttname"><a href="array_8h.html#a1c3bf8433c1de3c933f3854ab297fe1d">ucx_array_reserve</a></div><div class="ttdeci">int ucx_array_reserve(UcxArray *array, size_t capacity)</div><div class="ttdoc">Resizes the array only, if the capacity is insufficient. </div><div class="ttdef"><b>Definition:</b> array.c:449</div></div>
+<div class="ttc" id="array_8h_html_a177170258c215eb2e4f5a32e59f0cb1b"><div class="ttname"><a href="array_8h.html#a177170258c215eb2e4f5a32e59f0cb1b">ucx_array_new_a</a></div><div class="ttdeci">UcxArray * ucx_array_new_a(size_t capacity, size_t elemsize, UcxAllocator *allocator)</div><div class="ttdoc">Creates a new UCX array using the specified allocator. </div><div class="ttdef"><b>Definition:</b> array.c:123</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/avl_8h.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,883 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/avl.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a> &#124;
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">avl.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>AVL tree implementation.  
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="allocator_8h_source.html">allocator.h</a>&quot;</code><br />
+<code>#include &lt;inttypes.h&gt;</code><br />
+</div>
+<p><a href="avl_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxAVLNode.html">UcxAVLNode</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">UCX AVL Node.  <a href="structUcxAVLNode.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">UCX AVL Tree.  <a href="structUcxAVLTree.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ac2886d4b79b48c9fabf6408873f84cd2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="avl_8h.html#ac2886d4b79b48c9fabf6408873f84cd2">ucx_avl_default_new</a>()&#160;&#160;&#160;<a class="el" href="avl_8h.html#af0f868d67e9dc08b4867c02a06c23ee2">ucx_avl_new_a</a>(<a class="el" href="utils_8h.html#aa174d539de3ea59be4f9640f17ce53d8">ucx_cmp_ptr</a>, <a class="el" href="allocator_8h.html#a98d2f1b341118b7a0e341fda5d8b2ebf">ucx_default_allocator</a>())</td></tr>
+<tr class="memdesc:ac2886d4b79b48c9fabf6408873f84cd2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Macro for initializing a new <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> with the default allocator and a <a class="el" href="utils_8h.html#aa174d539de3ea59be4f9640f17ce53d8" title="Compares two pointers. ">ucx_cmp_ptr()</a> compare function.  <a href="#ac2886d4b79b48c9fabf6408873f84cd2">More...</a><br /></td></tr>
+<tr class="separator:ac2886d4b79b48c9fabf6408873f84cd2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaaf4a6f6f661cda7791db239212285d9"><td class="memItemLeft" align="right" valign="top"><a id="aaaf4a6f6f661cda7791db239212285d9"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="avl_8h.html#aaaf4a6f6f661cda7791db239212285d9">UCX_AVL_FIND_EXACT</a>&#160;&#160;&#160;0</td></tr>
+<tr class="memdesc:aaaf4a6f6f661cda7791db239212285d9"><td class="mdescLeft">&#160;</td><td class="mdescRight">A mode for <a class="el" href="avl_8h.html#a664986f64d6865605199fbff06e19cd5" title="Finds a node within the tree. ">ucx_avl_find_node()</a> with the same behavior as <a class="el" href="avl_8h.html#acf42da9a4168e47dc10b4ba0d27ceb4e" title="Gets the node from the tree, that is associated with the specified key. ">ucx_avl_get_node()</a>. <br /></td></tr>
+<tr class="separator:aaaf4a6f6f661cda7791db239212285d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abd2446d544d5412b6997ee8a17bd368c"><td class="memItemLeft" align="right" valign="top"><a id="abd2446d544d5412b6997ee8a17bd368c"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="avl_8h.html#abd2446d544d5412b6997ee8a17bd368c">UCX_AVL_FIND_LOWER_BOUNDED</a>&#160;&#160;&#160;1</td></tr>
+<tr class="memdesc:abd2446d544d5412b6997ee8a17bd368c"><td class="mdescLeft">&#160;</td><td class="mdescRight">A mode for <a class="el" href="avl_8h.html#a664986f64d6865605199fbff06e19cd5" title="Finds a node within the tree. ">ucx_avl_find_node()</a> finding the node whose key is at least as large as the specified key. <br /></td></tr>
+<tr class="separator:abd2446d544d5412b6997ee8a17bd368c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac74ee7649c1e206b08b31f37dd68ca5e"><td class="memItemLeft" align="right" valign="top"><a id="ac74ee7649c1e206b08b31f37dd68ca5e"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="avl_8h.html#ac74ee7649c1e206b08b31f37dd68ca5e">UCX_AVL_FIND_UPPER_BOUNDED</a>&#160;&#160;&#160;2</td></tr>
+<tr class="memdesc:ac74ee7649c1e206b08b31f37dd68ca5e"><td class="mdescLeft">&#160;</td><td class="mdescRight">A mode for <a class="el" href="avl_8h.html#a664986f64d6865605199fbff06e19cd5" title="Finds a node within the tree. ">ucx_avl_find_node()</a> finding the node whose key is at most as large as the specified key. <br /></td></tr>
+<tr class="separator:ac74ee7649c1e206b08b31f37dd68ca5e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af16f24d74fd6af0154de041566c6603b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="avl_8h.html#af16f24d74fd6af0154de041566c6603b">UCX_AVL_FIND_CLOSEST</a>&#160;&#160;&#160;3</td></tr>
+<tr class="memdesc:af16f24d74fd6af0154de041566c6603b"><td class="mdescLeft">&#160;</td><td class="mdescRight">A mode for <a class="el" href="avl_8h.html#a664986f64d6865605199fbff06e19cd5" title="Finds a node within the tree. ">ucx_avl_find_node()</a> finding the node with a key that is as close to the specified key as possible.  <a href="#af16f24d74fd6af0154de041566c6603b">More...</a><br /></td></tr>
+<tr class="separator:af16f24d74fd6af0154de041566c6603b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:a08ba2496c2316df58548c3cc29712add"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structUcxAVLNode.html">UcxAVLNode</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="avl_8h.html#a08ba2496c2316df58548c3cc29712add">UcxAVLNode</a></td></tr>
+<tr class="memdesc:a08ba2496c2316df58548c3cc29712add"><td class="mdescLeft">&#160;</td><td class="mdescRight">UCX AVL Node type.  <a href="#a08ba2496c2316df58548c3cc29712add">More...</a><br /></td></tr>
+<tr class="separator:a08ba2496c2316df58548c3cc29712add"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a11b043d65a11b7092d5d98b298e5ede3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="avl_8h.html#a11b043d65a11b7092d5d98b298e5ede3">ucx_avl_new</a> (<a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfunc)</td></tr>
+<tr class="memdesc:a11b043d65a11b7092d5d98b298e5ede3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Initializes a new <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> with a default allocator.  <a href="#a11b043d65a11b7092d5d98b298e5ede3">More...</a><br /></td></tr>
+<tr class="separator:a11b043d65a11b7092d5d98b298e5ede3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af0f868d67e9dc08b4867c02a06c23ee2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="avl_8h.html#af0f868d67e9dc08b4867c02a06c23ee2">ucx_avl_new_a</a> (<a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfunc, <a class="el" href="structUcxAllocator.html">UcxAllocator</a> *allocator)</td></tr>
+<tr class="memdesc:af0f868d67e9dc08b4867c02a06c23ee2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Initializes a new <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> with the specified allocator.  <a href="#af0f868d67e9dc08b4867c02a06c23ee2">More...</a><br /></td></tr>
+<tr class="separator:af0f868d67e9dc08b4867c02a06c23ee2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f92db538f25fce908d2cb3e5590944c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="avl_8h.html#a2f92db538f25fce908d2cb3e5590944c">ucx_avl_free</a> (<a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *tree)</td></tr>
+<tr class="memdesc:a2f92db538f25fce908d2cb3e5590944c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys a <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a>.  <a href="#a2f92db538f25fce908d2cb3e5590944c">More...</a><br /></td></tr>
+<tr class="separator:a2f92db538f25fce908d2cb3e5590944c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a31ad7fb196ca211f1fc39f4e15f72279"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="avl_8h.html#a31ad7fb196ca211f1fc39f4e15f72279">ucx_avl_free_content</a> (<a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *tree, <a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a> destr)</td></tr>
+<tr class="memdesc:a31ad7fb196ca211f1fc39f4e15f72279"><td class="mdescLeft">&#160;</td><td class="mdescRight">Frees the contents of a <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a>.  <a href="#a31ad7fb196ca211f1fc39f4e15f72279">More...</a><br /></td></tr>
+<tr class="separator:a31ad7fb196ca211f1fc39f4e15f72279"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acf42da9a4168e47dc10b4ba0d27ceb4e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxAVLNode.html">UcxAVLNode</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="avl_8h.html#acf42da9a4168e47dc10b4ba0d27ceb4e">ucx_avl_get_node</a> (<a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *tree, intptr_t key)</td></tr>
+<tr class="memdesc:acf42da9a4168e47dc10b4ba0d27ceb4e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Gets the node from the tree, that is associated with the specified key.  <a href="#acf42da9a4168e47dc10b4ba0d27ceb4e">More...</a><br /></td></tr>
+<tr class="separator:acf42da9a4168e47dc10b4ba0d27ceb4e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adbcf7ceb3f014a30c7214f7304519efe"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="avl_8h.html#adbcf7ceb3f014a30c7214f7304519efe">ucx_avl_get</a> (<a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *tree, intptr_t key)</td></tr>
+<tr class="memdesc:adbcf7ceb3f014a30c7214f7304519efe"><td class="mdescLeft">&#160;</td><td class="mdescRight">Gets the value from the tree, that is associated with the specified key.  <a href="#adbcf7ceb3f014a30c7214f7304519efe">More...</a><br /></td></tr>
+<tr class="separator:adbcf7ceb3f014a30c7214f7304519efe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a664986f64d6865605199fbff06e19cd5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxAVLNode.html">UcxAVLNode</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="avl_8h.html#a664986f64d6865605199fbff06e19cd5">ucx_avl_find_node</a> (<a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *tree, intptr_t key, <a class="el" href="ucx_8h.html#a0bc5bf89e556c1d45d10863d52728ac9">distance_func</a> dfnc, int mode)</td></tr>
+<tr class="memdesc:a664986f64d6865605199fbff06e19cd5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Finds a node within the tree.  <a href="#a664986f64d6865605199fbff06e19cd5">More...</a><br /></td></tr>
+<tr class="separator:a664986f64d6865605199fbff06e19cd5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a51770e1614b28d7d22dea096c3704f83"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="avl_8h.html#a51770e1614b28d7d22dea096c3704f83">ucx_avl_find</a> (<a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *tree, intptr_t key, <a class="el" href="ucx_8h.html#a0bc5bf89e556c1d45d10863d52728ac9">distance_func</a> dfnc, int mode)</td></tr>
+<tr class="memdesc:a51770e1614b28d7d22dea096c3704f83"><td class="mdescLeft">&#160;</td><td class="mdescRight">Finds a value within the tree.  <a href="#a51770e1614b28d7d22dea096c3704f83">More...</a><br /></td></tr>
+<tr class="separator:a51770e1614b28d7d22dea096c3704f83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aec401fab4a24a7edffa734f9baf88577"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="avl_8h.html#aec401fab4a24a7edffa734f9baf88577">ucx_avl_put</a> (<a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *tree, intptr_t key, void *value)</td></tr>
+<tr class="memdesc:aec401fab4a24a7edffa734f9baf88577"><td class="mdescLeft">&#160;</td><td class="mdescRight">Puts a key/value pair into the tree.  <a href="#aec401fab4a24a7edffa734f9baf88577">More...</a><br /></td></tr>
+<tr class="separator:aec401fab4a24a7edffa734f9baf88577"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a32cf8955cc0226a82bacfc7b76d6474c"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="avl_8h.html#a32cf8955cc0226a82bacfc7b76d6474c">ucx_avl_put_s</a> (<a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *tree, intptr_t key, void *value, void **oldvalue)</td></tr>
+<tr class="memdesc:a32cf8955cc0226a82bacfc7b76d6474c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Puts a key/value pair into the tree.  <a href="#a32cf8955cc0226a82bacfc7b76d6474c">More...</a><br /></td></tr>
+<tr class="separator:a32cf8955cc0226a82bacfc7b76d6474c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9a792b7d9e58073deef74a341f8bc720"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="avl_8h.html#a9a792b7d9e58073deef74a341f8bc720">ucx_avl_remove_node</a> (<a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *tree, <a class="el" href="structUcxAVLNode.html">UcxAVLNode</a> *node)</td></tr>
+<tr class="memdesc:a9a792b7d9e58073deef74a341f8bc720"><td class="mdescLeft">&#160;</td><td class="mdescRight">Removes a node from the AVL tree.  <a href="#a9a792b7d9e58073deef74a341f8bc720">More...</a><br /></td></tr>
+<tr class="separator:a9a792b7d9e58073deef74a341f8bc720"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1d821119c805d7fbb7e424bc3effeba9"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="avl_8h.html#a1d821119c805d7fbb7e424bc3effeba9">ucx_avl_remove</a> (<a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *tree, intptr_t key)</td></tr>
+<tr class="memdesc:a1d821119c805d7fbb7e424bc3effeba9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Removes an element from the AVL tree.  <a href="#a1d821119c805d7fbb7e424bc3effeba9">More...</a><br /></td></tr>
+<tr class="separator:a1d821119c805d7fbb7e424bc3effeba9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a01aeeecd6415f0cc2b623486eb28f254"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="avl_8h.html#a01aeeecd6415f0cc2b623486eb28f254">ucx_avl_remove_s</a> (<a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *tree, intptr_t key, intptr_t *oldkey, void **oldvalue)</td></tr>
+<tr class="memdesc:a01aeeecd6415f0cc2b623486eb28f254"><td class="mdescLeft">&#160;</td><td class="mdescRight">Removes an element from the AVL tree.  <a href="#a01aeeecd6415f0cc2b623486eb28f254">More...</a><br /></td></tr>
+<tr class="separator:a01aeeecd6415f0cc2b623486eb28f254"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a92c1d41c2b22fe4a029a486ab2153e35"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="avl_8h.html#a92c1d41c2b22fe4a029a486ab2153e35">ucx_avl_count</a> (<a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *tree)</td></tr>
+<tr class="memdesc:a92c1d41c2b22fe4a029a486ab2153e35"><td class="mdescLeft">&#160;</td><td class="mdescRight">Counts the nodes in the specified <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a>.  <a href="#a92c1d41c2b22fe4a029a486ab2153e35">More...</a><br /></td></tr>
+<tr class="separator:a92c1d41c2b22fe4a029a486ab2153e35"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0e739aeb66dda6a6a3f6eb51b50cf346"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxAVLNode.html">UcxAVLNode</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="avl_8h.html#a0e739aeb66dda6a6a3f6eb51b50cf346">ucx_avl_pred</a> (<a class="el" href="structUcxAVLNode.html">UcxAVLNode</a> *node)</td></tr>
+<tr class="memdesc:a0e739aeb66dda6a6a3f6eb51b50cf346"><td class="mdescLeft">&#160;</td><td class="mdescRight">Finds the in-order predecessor of the given node.  <a href="#a0e739aeb66dda6a6a3f6eb51b50cf346">More...</a><br /></td></tr>
+<tr class="separator:a0e739aeb66dda6a6a3f6eb51b50cf346"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aab1ad9b027ff5e50671aa0ee84e2d541"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxAVLNode.html">UcxAVLNode</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="avl_8h.html#aab1ad9b027ff5e50671aa0ee84e2d541">ucx_avl_succ</a> (<a class="el" href="structUcxAVLNode.html">UcxAVLNode</a> *node)</td></tr>
+<tr class="memdesc:aab1ad9b027ff5e50671aa0ee84e2d541"><td class="mdescLeft">&#160;</td><td class="mdescRight">Finds the in-order successor of the given node.  <a href="#aab1ad9b027ff5e50671aa0ee84e2d541">More...</a><br /></td></tr>
+<tr class="separator:aab1ad9b027ff5e50671aa0ee84e2d541"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>AVL tree implementation. </p>
+<p>This binary search tree implementation allows average O(1) insertion and removal of elements (excluding binary search time).</p>
+<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
+<dd>
+Olaf Wintermann </dd></dl>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="ac2886d4b79b48c9fabf6408873f84cd2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac2886d4b79b48c9fabf6408873f84cd2">&#9670;&nbsp;</a></span>ucx_avl_default_new</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_avl_default_new</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="avl_8h.html#af0f868d67e9dc08b4867c02a06c23ee2">ucx_avl_new_a</a>(<a class="el" href="utils_8h.html#aa174d539de3ea59be4f9640f17ce53d8">ucx_cmp_ptr</a>, <a class="el" href="allocator_8h.html#a98d2f1b341118b7a0e341fda5d8b2ebf">ucx_default_allocator</a>())</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Macro for initializing a new <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> with the default allocator and a <a class="el" href="utils_8h.html#aa174d539de3ea59be4f9640f17ce53d8" title="Compares two pointers. ">ucx_cmp_ptr()</a> compare function. </p>
+<dl class="section return"><dt>Returns</dt><dd>a new default <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> object </dd></dl>
+
+</div>
+</div>
+<a id="af16f24d74fd6af0154de041566c6603b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af16f24d74fd6af0154de041566c6603b">&#9670;&nbsp;</a></span>UCX_AVL_FIND_CLOSEST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UCX_AVL_FIND_CLOSEST&#160;&#160;&#160;3</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>A mode for <a class="el" href="avl_8h.html#a664986f64d6865605199fbff06e19cd5" title="Finds a node within the tree. ">ucx_avl_find_node()</a> finding the node with a key that is as close to the specified key as possible. </p>
+<p>If the key is present, the behavior is like <a class="el" href="avl_8h.html#acf42da9a4168e47dc10b4ba0d27ceb4e" title="Gets the node from the tree, that is associated with the specified key. ">ucx_avl_get_node()</a>. This mode only returns <code>NULL</code> on empty trees. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="a08ba2496c2316df58548c3cc29712add"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a08ba2496c2316df58548c3cc29712add">&#9670;&nbsp;</a></span>UcxAVLNode</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structUcxAVLNode.html">UcxAVLNode</a> <a class="el" href="structUcxAVLNode.html">UcxAVLNode</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>UCX AVL Node type. </p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="structUcxAVLNode.html" title="UCX AVL Node. ">UcxAVLNode</a> </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a92c1d41c2b22fe4a029a486ab2153e35"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a92c1d41c2b22fe4a029a486ab2153e35">&#9670;&nbsp;</a></span>ucx_avl_count()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t ucx_avl_count </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
+          <td class="paramname"><em>tree</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Counts the nodes in the specified <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a>. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">tree</td><td>the AVL tree </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the node count </dd></dl>
+
+</div>
+</div>
+<a id="a51770e1614b28d7d22dea096c3704f83"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a51770e1614b28d7d22dea096c3704f83">&#9670;&nbsp;</a></span>ucx_avl_find()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* ucx_avl_find </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
+          <td class="paramname"><em>tree</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">intptr_t&#160;</td>
+          <td class="paramname"><em>key</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#a0bc5bf89e556c1d45d10863d52728ac9">distance_func</a>&#160;</td>
+          <td class="paramname"><em>dfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>mode</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Finds a value within the tree. </p>
+<p>See <a class="el" href="avl_8h.html#a664986f64d6865605199fbff06e19cd5" title="Finds a node within the tree. ">ucx_avl_find_node()</a> for details.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">tree</td><td>the <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> </td></tr>
+    <tr><td class="paramname">key</td><td>the key </td></tr>
+    <tr><td class="paramname">dfnc</td><td>the distance function </td></tr>
+    <tr><td class="paramname">mode</td><td>the find mode </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the value (or <code>NULL</code>, if no value can be found) </dd></dl>
+
+</div>
+</div>
+<a id="a664986f64d6865605199fbff06e19cd5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a664986f64d6865605199fbff06e19cd5">&#9670;&nbsp;</a></span>ucx_avl_find_node()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxAVLNode.html">UcxAVLNode</a>* ucx_avl_find_node </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
+          <td class="paramname"><em>tree</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">intptr_t&#160;</td>
+          <td class="paramname"><em>key</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#a0bc5bf89e556c1d45d10863d52728ac9">distance_func</a>&#160;</td>
+          <td class="paramname"><em>dfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>mode</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Finds a node within the tree. </p>
+<p>The following modes are supported: </p><ul>
+<li>
+<a class="el" href="avl_8h.html#aaaf4a6f6f661cda7791db239212285d9" title="A mode for ucx_avl_find_node() with the same behavior as ucx_avl_get_node(). ">UCX_AVL_FIND_EXACT</a>: the same behavior as <a class="el" href="avl_8h.html#acf42da9a4168e47dc10b4ba0d27ceb4e" title="Gets the node from the tree, that is associated with the specified key. ">ucx_avl_get_node()</a> </li>
+<li>
+<a class="el" href="avl_8h.html#abd2446d544d5412b6997ee8a17bd368c" title="A mode for ucx_avl_find_node() finding the node whose key is at least as large as the specified key...">UCX_AVL_FIND_LOWER_BOUNDED</a>: finds the node whose key is at least as large as the specified key </li>
+<li>
+<a class="el" href="avl_8h.html#ac74ee7649c1e206b08b31f37dd68ca5e" title="A mode for ucx_avl_find_node() finding the node whose key is at most as large as the specified key...">UCX_AVL_FIND_UPPER_BOUNDED</a>: finds the node whose key is at most as large as the specified key </li>
+<li>
+<a class="el" href="avl_8h.html#af16f24d74fd6af0154de041566c6603b" title="A mode for ucx_avl_find_node() finding the node with a key that is as close to the specified key as p...">UCX_AVL_FIND_CLOSEST</a>: finds the node with a key that is as close to the specified key as possible. If the key is present, the behavior is like <a class="el" href="avl_8h.html#acf42da9a4168e47dc10b4ba0d27ceb4e" title="Gets the node from the tree, that is associated with the specified key. ">ucx_avl_get_node()</a>. This mode only returns <code>NULL</code> on empty trees. </li>
+</ul>
+<p>The distance function provided MUST agree with the compare function of the AVL tree.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">tree</td><td>the <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> </td></tr>
+    <tr><td class="paramname">key</td><td>the key </td></tr>
+    <tr><td class="paramname">dfnc</td><td>the distance function </td></tr>
+    <tr><td class="paramname">mode</td><td>the find mode </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the node (or <code>NULL</code>, if no node can be found) </dd></dl>
+
+</div>
+</div>
+<a id="a2f92db538f25fce908d2cb3e5590944c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2f92db538f25fce908d2cb3e5590944c">&#9670;&nbsp;</a></span>ucx_avl_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_avl_free </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
+          <td class="paramname"><em>tree</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Destroys a <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a>. </p>
+<p>Note, that the contents are not automatically freed. Use may use <a class="el" href="avl_8h.html#a31ad7fb196ca211f1fc39f4e15f72279" title="Frees the contents of a UcxAVLTree. ">ucx_avl_free_content()</a> before calling this function.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">tree</td><td>the tree to destroy </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="avl_8h.html#a31ad7fb196ca211f1fc39f4e15f72279" title="Frees the contents of a UcxAVLTree. ">ucx_avl_free_content()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a31ad7fb196ca211f1fc39f4e15f72279"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a31ad7fb196ca211f1fc39f4e15f72279">&#9670;&nbsp;</a></span>ucx_avl_free_content()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_avl_free_content </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
+          <td class="paramname"><em>tree</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a>&#160;</td>
+          <td class="paramname"><em>destr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Frees the contents of a <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a>. </p>
+<p>This is a convenience function that iterates over the tree and passes all values to the specified destructor function.</p>
+<p>If no destructor is specified (<code>NULL</code>), the free() function of the tree's own allocator is used.</p>
+<p>You must ensure, that it is valid to pass each value in the map to the same destructor function.</p>
+<p>You should free the entire tree afterwards, as the contents will be invalid.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">tree</td><td>for which the contents shall be freed </td></tr>
+    <tr><td class="paramname">destr</td><td>optional pointer to a destructor function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="avl_8h.html#a2f92db538f25fce908d2cb3e5590944c" title="Destroys a UcxAVLTree. ">ucx_avl_free()</a> </dd></dl>
+
+</div>
+</div>
+<a id="adbcf7ceb3f014a30c7214f7304519efe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adbcf7ceb3f014a30c7214f7304519efe">&#9670;&nbsp;</a></span>ucx_avl_get()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* ucx_avl_get </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
+          <td class="paramname"><em>tree</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">intptr_t&#160;</td>
+          <td class="paramname"><em>key</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Gets the value from the tree, that is associated with the specified key. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">tree</td><td>the <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> </td></tr>
+    <tr><td class="paramname">key</td><td>the key </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the value (or <code>NULL</code>, if the key is not present) </dd></dl>
+
+</div>
+</div>
+<a id="acf42da9a4168e47dc10b4ba0d27ceb4e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acf42da9a4168e47dc10b4ba0d27ceb4e">&#9670;&nbsp;</a></span>ucx_avl_get_node()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxAVLNode.html">UcxAVLNode</a>* ucx_avl_get_node </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
+          <td class="paramname"><em>tree</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">intptr_t&#160;</td>
+          <td class="paramname"><em>key</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Gets the node from the tree, that is associated with the specified key. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">tree</td><td>the <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> </td></tr>
+    <tr><td class="paramname">key</td><td>the key </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the node (or <code>NULL</code>, if the key is not present) </dd></dl>
+
+</div>
+</div>
+<a id="a11b043d65a11b7092d5d98b298e5ede3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a11b043d65a11b7092d5d98b298e5ede3">&#9670;&nbsp;</a></span>ucx_avl_new()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a>* ucx_avl_new </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
+          <td class="paramname"><em>cmpfunc</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Initializes a new <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> with a default allocator. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">cmpfunc</td><td>the compare function that shall be used </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> object </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="avl_8h.html#af0f868d67e9dc08b4867c02a06c23ee2" title="Initializes a new UcxAVLTree with the specified allocator. ">ucx_avl_new_a()</a> </dd></dl>
+
+</div>
+</div>
+<a id="af0f868d67e9dc08b4867c02a06c23ee2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af0f868d67e9dc08b4867c02a06c23ee2">&#9670;&nbsp;</a></span>ucx_avl_new_a()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a>* ucx_avl_new_a </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
+          <td class="paramname"><em>cmpfunc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Initializes a new <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> with the specified allocator. </p>
+<p>The cmpfunc should be capable of comparing two keys within this AVL tree. So if you want to use null terminated strings as keys, you could use the <a class="el" href="utils_8h.html#aa6a37b9d172b6a5b2803d152f9e1b258" title="Wraps the strcmp function. ">ucx_cmp_str()</a> function here.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">cmpfunc</td><td>the compare function that shall be used </td></tr>
+    <tr><td class="paramname">allocator</td><td>the <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a> that shall be used </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> object </dd></dl>
+
+</div>
+</div>
+<a id="a0e739aeb66dda6a6a3f6eb51b50cf346"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0e739aeb66dda6a6a3f6eb51b50cf346">&#9670;&nbsp;</a></span>ucx_avl_pred()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxAVLNode.html">UcxAVLNode</a>* ucx_avl_pred </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAVLNode.html">UcxAVLNode</a> *&#160;</td>
+          <td class="paramname"><em>node</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Finds the in-order predecessor of the given node. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">node</td><td>an AVL node </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the in-order predecessor of the given node, or <code>NULL</code> if the given node is the in-order minimum </dd></dl>
+
+</div>
+</div>
+<a id="aec401fab4a24a7edffa734f9baf88577"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aec401fab4a24a7edffa734f9baf88577">&#9670;&nbsp;</a></span>ucx_avl_put()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_avl_put </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
+          <td class="paramname"><em>tree</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">intptr_t&#160;</td>
+          <td class="paramname"><em>key</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>value</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Puts a key/value pair into the tree. </p>
+<p>Attention: use this function only, if a possible old value does not need to be preserved.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">tree</td><td>the <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> </td></tr>
+    <tr><td class="paramname">key</td><td>the key </td></tr>
+    <tr><td class="paramname">value</td><td>the new value </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>zero, if and only if the operation succeeded </dd></dl>
+
+</div>
+</div>
+<a id="a32cf8955cc0226a82bacfc7b76d6474c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a32cf8955cc0226a82bacfc7b76d6474c">&#9670;&nbsp;</a></span>ucx_avl_put_s()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_avl_put_s </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
+          <td class="paramname"><em>tree</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">intptr_t&#160;</td>
+          <td class="paramname"><em>key</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>value</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void **&#160;</td>
+          <td class="paramname"><em>oldvalue</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Puts a key/value pair into the tree. </p>
+<p>This is a secure function which saves the old value to the variable pointed at by oldvalue.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">tree</td><td>the <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> </td></tr>
+    <tr><td class="paramname">key</td><td>the key </td></tr>
+    <tr><td class="paramname">value</td><td>the new value </td></tr>
+    <tr><td class="paramname">oldvalue</td><td>optional: a pointer to the location where a possible old value shall be stored </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>zero, if and only if the operation succeeded </dd></dl>
+
+</div>
+</div>
+<a id="a1d821119c805d7fbb7e424bc3effeba9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1d821119c805d7fbb7e424bc3effeba9">&#9670;&nbsp;</a></span>ucx_avl_remove()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_avl_remove </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
+          <td class="paramname"><em>tree</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">intptr_t&#160;</td>
+          <td class="paramname"><em>key</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Removes an element from the AVL tree. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">tree</td><td>the <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> </td></tr>
+    <tr><td class="paramname">key</td><td>the key </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>zero, if and only if an element has been removed </dd></dl>
+
+</div>
+</div>
+<a id="a9a792b7d9e58073deef74a341f8bc720"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9a792b7d9e58073deef74a341f8bc720">&#9670;&nbsp;</a></span>ucx_avl_remove_node()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_avl_remove_node </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
+          <td class="paramname"><em>tree</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structUcxAVLNode.html">UcxAVLNode</a> *&#160;</td>
+          <td class="paramname"><em>node</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Removes a node from the AVL tree. </p>
+<p>Note: the specified node is logically removed. The tree implementation decides which memory area is freed. In most cases the here provided node is freed, so its further use is generally undefined.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">tree</td><td>the <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> </td></tr>
+    <tr><td class="paramname">node</td><td>the node to remove </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>zero, if and only if an element has been removed </dd></dl>
+
+</div>
+</div>
+<a id="a01aeeecd6415f0cc2b623486eb28f254"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a01aeeecd6415f0cc2b623486eb28f254">&#9670;&nbsp;</a></span>ucx_avl_remove_s()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_avl_remove_s </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a> *&#160;</td>
+          <td class="paramname"><em>tree</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">intptr_t&#160;</td>
+          <td class="paramname"><em>key</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">intptr_t *&#160;</td>
+          <td class="paramname"><em>oldkey</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void **&#160;</td>
+          <td class="paramname"><em>oldvalue</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Removes an element from the AVL tree. </p>
+<p>This is a secure function which saves the old key and value data from node to the variables at the location of oldkey and oldvalue (if specified), so they can be freed afterwards (if necessary).</p>
+<p>Note: the returned key in oldkey is possibly not the same as the provided key for the lookup (in terms of memory location).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">tree</td><td>the <a class="el" href="structUcxAVLTree.html" title="UCX AVL Tree. ">UcxAVLTree</a> </td></tr>
+    <tr><td class="paramname">key</td><td>the key of the element to remove </td></tr>
+    <tr><td class="paramname">oldkey</td><td>optional: a pointer to the location where the old key shall be stored </td></tr>
+    <tr><td class="paramname">oldvalue</td><td>optional: a pointer to the location where the old value shall be stored </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>zero, if and only if an element has been removed </dd></dl>
+
+</div>
+</div>
+<a id="aab1ad9b027ff5e50671aa0ee84e2d541"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aab1ad9b027ff5e50671aa0ee84e2d541">&#9670;&nbsp;</a></span>ucx_avl_succ()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxAVLNode.html">UcxAVLNode</a>* ucx_avl_succ </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAVLNode.html">UcxAVLNode</a> *&#160;</td>
+          <td class="paramname"><em>node</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Finds the in-order successor of the given node. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">node</td><td>an AVL node </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the in-order successor of the given node, or <code>NULL</code> if the given node is the in-order maximum </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/avl_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,113 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/avl.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">avl.h</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a href="avl_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment"> * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"> * Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment"> * modification, are permitted provided that the following conditions are met:</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> *   1. Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> *   2. Redistributions in binary form must reproduce the above copyright</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer in the</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment"> *      documentation and/or other materials provided with the distribution.</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment"> * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment"> * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment"> * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"> * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment"> * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment"> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment"> * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE</span></div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> * POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;</div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;</div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;<span class="preprocessor">#ifndef UCX_AVL_H</span></div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;<span class="preprocessor">#define UCX_AVL_H</span></div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;</div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ucx_8h.html">ucx.h</a>&quot;</span></div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="allocator_8h.html">allocator.h</a>&quot;</span></div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;<span class="preprocessor">#include &lt;inttypes.h&gt;</span></div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;</div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;</div><div class="line"><a name="l00058"></a><span class="lineno"><a class="line" href="avl_8h.html#a08ba2496c2316df58548c3cc29712add">   58</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structUcxAVLNode.html">UcxAVLNode</a> <a class="code" href="structUcxAVLNode.html">UcxAVLNode</a>;</div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;</div><div class="line"><a name="l00063"></a><span class="lineno"><a class="line" href="structUcxAVLNode.html">   63</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structUcxAVLNode.html">UcxAVLNode</a> {</div><div class="line"><a name="l00067"></a><span class="lineno"><a class="line" href="structUcxAVLNode.html#ab65a31010d26a3df898e6ba534702af6">   67</a></span>&#160;    intptr_t <a class="code" href="structUcxAVLNode.html#ab65a31010d26a3df898e6ba534702af6">key</a>;</div><div class="line"><a name="l00071"></a><span class="lineno"><a class="line" href="structUcxAVLNode.html#a302501b8c04c3fde668fe72249871258">   71</a></span>&#160;    <span class="keywordtype">void</span> *<a class="code" href="structUcxAVLNode.html#a302501b8c04c3fde668fe72249871258">value</a>;</div><div class="line"><a name="l00075"></a><span class="lineno"><a class="line" href="structUcxAVLNode.html#af129fd32863a7c35e82c5cd9d11dc95a">   75</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="structUcxAVLNode.html#af129fd32863a7c35e82c5cd9d11dc95a">height</a>;</div><div class="line"><a name="l00079"></a><span class="lineno"><a class="line" href="structUcxAVLNode.html#afc4e3b4f452aa2d91cabb2135b9d42f7">   79</a></span>&#160;    <a class="code" href="structUcxAVLNode.html">UcxAVLNode</a> *<a class="code" href="structUcxAVLNode.html#afc4e3b4f452aa2d91cabb2135b9d42f7">parent</a>;</div><div class="line"><a name="l00083"></a><span class="lineno"><a class="line" href="structUcxAVLNode.html#ad3a1c733f2c1cc81ac527f846fc24b9c">   83</a></span>&#160;    <a class="code" href="structUcxAVLNode.html">UcxAVLNode</a> *<a class="code" href="structUcxAVLNode.html#ad3a1c733f2c1cc81ac527f846fc24b9c">left</a>;</div><div class="line"><a name="l00087"></a><span class="lineno"><a class="line" href="structUcxAVLNode.html#a7cbaa31dba8c7a89f4f8f7905f6fd238">   87</a></span>&#160;    <a class="code" href="structUcxAVLNode.html">UcxAVLNode</a> *<a class="code" href="structUcxAVLNode.html#a7cbaa31dba8c7a89f4f8f7905f6fd238">right</a>;</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;};</div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;</div><div class="line"><a name="l00093"></a><span class="lineno"><a class="line" href="structUcxAVLTree.html">   93</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span>{</div><div class="line"><a name="l00097"></a><span class="lineno"><a class="line" href="structUcxAVLTree.html#a30652776b540156ad54c7d52833e4e28">   97</a></span>&#160;    <a class="code" href="structUcxAllocator.html">UcxAllocator</a> *<a class="code" href="structUcxAVLTree.html#a30652776b540156ad54c7d52833e4e28">allocator</a>;</div><div class="line"><a name="l00101"></a><span class="lineno"><a class="line" href="structUcxAVLTree.html#a393a8fc99eb2c290d3cb67170081d742">  101</a></span>&#160;    <a class="code" href="structUcxAVLNode.html">UcxAVLNode</a> *<a class="code" href="structUcxAVLTree.html#a393a8fc99eb2c290d3cb67170081d742">root</a>;</div><div class="line"><a name="l00106"></a><span class="lineno"><a class="line" href="structUcxAVLTree.html#a87aff25cb726cb9eb88eb815a10d1004">  106</a></span>&#160;    <a class="code" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> <a class="code" href="structUcxAVLTree.html#a87aff25cb726cb9eb88eb815a10d1004">cmpfunc</a>;</div><div class="line"><a name="l00111"></a><span class="lineno"><a class="line" href="structUcxAVLTree.html#ae92a3bfad3fe33c8dcbdad85112f83fd">  111</a></span>&#160;    <span class="keywordtype">void</span> *<a class="code" href="structUcxAVLTree.html#ae92a3bfad3fe33c8dcbdad85112f83fd">userdata</a>;</div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;} <a class="code" href="structUcxAVLTree.html">UcxAVLTree</a>;</div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;</div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;<a class="code" href="structUcxAVLTree.html">UcxAVLTree</a> *<a class="code" href="avl_8h.html#a11b043d65a11b7092d5d98b298e5ede3">ucx_avl_new</a>(<a class="code" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfunc);</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;</div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;<a class="code" href="structUcxAVLTree.html">UcxAVLTree</a> *<a class="code" href="avl_8h.html#af0f868d67e9dc08b4867c02a06c23ee2">ucx_avl_new_a</a>(<a class="code" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfunc, <a class="code" href="structUcxAllocator.html">UcxAllocator</a> *allocator);</div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;<span class="keywordtype">void</span> <a class="code" href="avl_8h.html#a2f92db538f25fce908d2cb3e5590944c">ucx_avl_free</a>(<a class="code" href="structUcxAVLTree.html">UcxAVLTree</a> *tree);</div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;</div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;<span class="keywordtype">void</span> <a class="code" href="avl_8h.html#a31ad7fb196ca211f1fc39f4e15f72279">ucx_avl_free_content</a>(<a class="code" href="structUcxAVLTree.html">UcxAVLTree</a> *tree, <a class="code" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a> destr);</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;</div><div class="line"><a name="l00173"></a><span class="lineno"><a class="line" href="avl_8h.html#ac2886d4b79b48c9fabf6408873f84cd2">  173</a></span>&#160;<span class="preprocessor">#define ucx_avl_default_new() \</span></div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;<span class="preprocessor">    ucx_avl_new_a(ucx_cmp_ptr, ucx_default_allocator())</span></div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;</div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;<a class="code" href="structUcxAVLNode.html">UcxAVLNode</a> *<a class="code" href="avl_8h.html#acf42da9a4168e47dc10b4ba0d27ceb4e">ucx_avl_get_node</a>(<a class="code" href="structUcxAVLTree.html">UcxAVLTree</a> *tree, intptr_t <a class="code" href="structUcxAVLNode.html#ab65a31010d26a3df898e6ba534702af6">key</a>);</div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;</div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;<span class="keywordtype">void</span> *<a class="code" href="avl_8h.html#adbcf7ceb3f014a30c7214f7304519efe">ucx_avl_get</a>(<a class="code" href="structUcxAVLTree.html">UcxAVLTree</a> *tree, intptr_t <a class="code" href="structUcxAVLNode.html#ab65a31010d26a3df898e6ba534702af6">key</a>);</div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;</div><div class="line"><a name="l00196"></a><span class="lineno"><a class="line" href="avl_8h.html#aaaf4a6f6f661cda7791db239212285d9">  196</a></span>&#160;<span class="preprocessor">#define UCX_AVL_FIND_EXACT         0</span></div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;</div><div class="line"><a name="l00201"></a><span class="lineno"><a class="line" href="avl_8h.html#abd2446d544d5412b6997ee8a17bd368c">  201</a></span>&#160;<span class="preprocessor">#define UCX_AVL_FIND_LOWER_BOUNDED 1</span></div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;</div><div class="line"><a name="l00206"></a><span class="lineno"><a class="line" href="avl_8h.html#ac74ee7649c1e206b08b31f37dd68ca5e">  206</a></span>&#160;<span class="preprocessor">#define UCX_AVL_FIND_UPPER_BOUNDED 2</span></div><div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;</div><div class="line"><a name="l00213"></a><span class="lineno"><a class="line" href="avl_8h.html#af16f24d74fd6af0154de041566c6603b">  213</a></span>&#160;<span class="preprocessor">#define UCX_AVL_FIND_CLOSEST       3</span></div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;</div><div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;<a class="code" href="structUcxAVLNode.html">UcxAVLNode</a> *<a class="code" href="avl_8h.html#a664986f64d6865605199fbff06e19cd5">ucx_avl_find_node</a>(<a class="code" href="structUcxAVLTree.html">UcxAVLTree</a> *tree, intptr_t <a class="code" href="structUcxAVLNode.html#ab65a31010d26a3df898e6ba534702af6">key</a>,</div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;        <a class="code" href="ucx_8h.html#a0bc5bf89e556c1d45d10863d52728ac9">distance_func</a> dfnc, <span class="keywordtype">int</span> mode);</div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;</div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;<span class="keywordtype">void</span> *<a class="code" href="avl_8h.html#a51770e1614b28d7d22dea096c3704f83">ucx_avl_find</a>(<a class="code" href="structUcxAVLTree.html">UcxAVLTree</a> *tree, intptr_t <a class="code" href="structUcxAVLNode.html#ab65a31010d26a3df898e6ba534702af6">key</a>,</div><div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;        <a class="code" href="ucx_8h.html#a0bc5bf89e556c1d45d10863d52728ac9">distance_func</a> dfnc, <span class="keywordtype">int</span> mode);</div><div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;</div><div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;<span class="keywordtype">int</span> <a class="code" href="avl_8h.html#aec401fab4a24a7edffa734f9baf88577">ucx_avl_put</a>(<a class="code" href="structUcxAVLTree.html">UcxAVLTree</a> *tree, intptr_t <a class="code" href="structUcxAVLNode.html#ab65a31010d26a3df898e6ba534702af6">key</a>, <span class="keywordtype">void</span> *<a class="code" href="structUcxAVLNode.html#a302501b8c04c3fde668fe72249871258">value</a>);</div><div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;</div><div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;<span class="keywordtype">int</span> <a class="code" href="avl_8h.html#a32cf8955cc0226a82bacfc7b76d6474c">ucx_avl_put_s</a>(<a class="code" href="structUcxAVLTree.html">UcxAVLTree</a> *tree, intptr_t <a class="code" href="structUcxAVLNode.html#ab65a31010d26a3df898e6ba534702af6">key</a>, <span class="keywordtype">void</span> *<a class="code" href="structUcxAVLNode.html#a302501b8c04c3fde668fe72249871258">value</a>, <span class="keywordtype">void</span> **oldvalue);</div><div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;</div><div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;<span class="keywordtype">int</span> <a class="code" href="avl_8h.html#a9a792b7d9e58073deef74a341f8bc720">ucx_avl_remove_node</a>(<a class="code" href="structUcxAVLTree.html">UcxAVLTree</a> *tree, <a class="code" href="structUcxAVLNode.html">UcxAVLNode</a> *node);</div><div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;</div><div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;<span class="keywordtype">int</span> <a class="code" href="avl_8h.html#a1d821119c805d7fbb7e424bc3effeba9">ucx_avl_remove</a>(<a class="code" href="structUcxAVLTree.html">UcxAVLTree</a> *tree, intptr_t <a class="code" href="structUcxAVLNode.html#ab65a31010d26a3df898e6ba534702af6">key</a>);</div><div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;</div><div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;<span class="keywordtype">int</span> <a class="code" href="avl_8h.html#a01aeeecd6415f0cc2b623486eb28f254">ucx_avl_remove_s</a>(<a class="code" href="structUcxAVLTree.html">UcxAVLTree</a> *tree, intptr_t <a class="code" href="structUcxAVLNode.html#ab65a31010d26a3df898e6ba534702af6">key</a>,</div><div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;        intptr_t *oldkey, <span class="keywordtype">void</span> **oldvalue);</div><div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;</div><div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;<span class="keywordtype">size_t</span> <a class="code" href="avl_8h.html#a92c1d41c2b22fe4a029a486ab2153e35">ucx_avl_count</a>(<a class="code" href="structUcxAVLTree.html">UcxAVLTree</a> *tree);</div><div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;</div><div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;<a class="code" href="structUcxAVLNode.html">UcxAVLNode</a>* <a class="code" href="avl_8h.html#a0e739aeb66dda6a6a3f6eb51b50cf346">ucx_avl_pred</a>(<a class="code" href="structUcxAVLNode.html">UcxAVLNode</a>* node);</div><div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;</div><div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;<a class="code" href="structUcxAVLNode.html">UcxAVLNode</a>* <a class="code" href="avl_8h.html#aab1ad9b027ff5e50671aa0ee84e2d541">ucx_avl_succ</a>(<a class="code" href="structUcxAVLNode.html">UcxAVLNode</a>* node);</div><div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;</div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;}</div><div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;</div><div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;<span class="preprocessor">#endif  </span><span class="comment">/* UCX_AVL_H */</span><span class="preprocessor"></span></div><div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;</div><div class="ttc" id="avl_8h_html_a11b043d65a11b7092d5d98b298e5ede3"><div class="ttname"><a href="avl_8h.html#a11b043d65a11b7092d5d98b298e5ede3">ucx_avl_new</a></div><div class="ttdeci">UcxAVLTree * ucx_avl_new(cmp_func cmpfunc)</div><div class="ttdoc">Initializes a new UcxAVLTree with a default allocator. </div><div class="ttdef"><b>Definition:</b> avl.c:109</div></div>
+<div class="ttc" id="avl_8h_html_a1d821119c805d7fbb7e424bc3effeba9"><div class="ttname"><a href="avl_8h.html#a1d821119c805d7fbb7e424bc3effeba9">ucx_avl_remove</a></div><div class="ttdeci">int ucx_avl_remove(UcxAVLTree *tree, intptr_t key)</div><div class="ttdoc">Removes an element from the AVL tree. </div><div class="ttdef"><b>Definition:</b> avl.c:266</div></div>
+<div class="ttc" id="structUcxAVLNode_html"><div class="ttname"><a href="structUcxAVLNode.html">UcxAVLNode</a></div><div class="ttdoc">UCX AVL Node. </div><div class="ttdef"><b>Definition:</b> avl.h:63</div></div>
+<div class="ttc" id="ucx_8h_html_afe5e2d5dbf34778e0e97852051570791"><div class="ttname"><a href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a></div><div class="ttdeci">int(* cmp_func)(const void *, const void *, void *)</div><div class="ttdoc">Function pointer to a compare function. </div><div class="ttdef"><b>Definition:</b> ucx.h:84</div></div>
+<div class="ttc" id="structUcxAVLNode_html_afc4e3b4f452aa2d91cabb2135b9d42f7"><div class="ttname"><a href="structUcxAVLNode.html#afc4e3b4f452aa2d91cabb2135b9d42f7">UcxAVLNode::parent</a></div><div class="ttdeci">UcxAVLNode * parent</div><div class="ttdoc">Parent node. </div><div class="ttdef"><b>Definition:</b> avl.h:79</div></div>
+<div class="ttc" id="avl_8h_html_a0e739aeb66dda6a6a3f6eb51b50cf346"><div class="ttname"><a href="avl_8h.html#a0e739aeb66dda6a6a3f6eb51b50cf346">ucx_avl_pred</a></div><div class="ttdeci">UcxAVLNode * ucx_avl_pred(UcxAVLNode *node)</div><div class="ttdoc">Finds the in-order predecessor of the given node. </div><div class="ttdef"><b>Definition:</b> avl.c:335</div></div>
+<div class="ttc" id="avl_8h_html_aec401fab4a24a7edffa734f9baf88577"><div class="ttname"><a href="avl_8h.html#aec401fab4a24a7edffa734f9baf88577">ucx_avl_put</a></div><div class="ttdeci">int ucx_avl_put(UcxAVLTree *tree, intptr_t key, void *value)</div><div class="ttdoc">Puts a key/value pair into the tree. </div><div class="ttdef"><b>Definition:</b> avl.c:211</div></div>
+<div class="ttc" id="ucx_8h_html"><div class="ttname"><a href="ucx_8h.html">ucx.h</a></div><div class="ttdoc">Main UCX Header providing most common definitions. </div></div>
+<div class="ttc" id="structUcxAVLTree_html"><div class="ttname"><a href="structUcxAVLTree.html">UcxAVLTree</a></div><div class="ttdoc">UCX AVL Tree. </div><div class="ttdef"><b>Definition:</b> avl.h:93</div></div>
+<div class="ttc" id="avl_8h_html_a92c1d41c2b22fe4a029a486ab2153e35"><div class="ttname"><a href="avl_8h.html#a92c1d41c2b22fe4a029a486ab2153e35">ucx_avl_count</a></div><div class="ttdeci">size_t ucx_avl_count(UcxAVLTree *tree)</div><div class="ttdoc">Counts the nodes in the specified UcxAVLTree. </div><div class="ttdef"><b>Definition:</b> avl.c:331</div></div>
+<div class="ttc" id="avl_8h_html_af0f868d67e9dc08b4867c02a06c23ee2"><div class="ttname"><a href="avl_8h.html#af0f868d67e9dc08b4867c02a06c23ee2">ucx_avl_new_a</a></div><div class="ttdeci">UcxAVLTree * ucx_avl_new_a(cmp_func cmpfunc, UcxAllocator *allocator)</div><div class="ttdoc">Initializes a new UcxAVLTree with the specified allocator. </div><div class="ttdef"><b>Definition:</b> avl.c:113</div></div>
+<div class="ttc" id="structUcxAVLTree_html_ae92a3bfad3fe33c8dcbdad85112f83fd"><div class="ttname"><a href="structUcxAVLTree.html#ae92a3bfad3fe33c8dcbdad85112f83fd">UcxAVLTree::userdata</a></div><div class="ttdeci">void * userdata</div><div class="ttdoc">Custom user data. </div><div class="ttdef"><b>Definition:</b> avl.h:111</div></div>
+<div class="ttc" id="avl_8h_html_a9a792b7d9e58073deef74a341f8bc720"><div class="ttname"><a href="avl_8h.html#a9a792b7d9e58073deef74a341f8bc720">ucx_avl_remove_node</a></div><div class="ttdeci">int ucx_avl_remove_node(UcxAVLTree *tree, UcxAVLNode *node)</div><div class="ttdoc">Removes a node from the AVL tree. </div><div class="ttdef"><b>Definition:</b> avl.c:270</div></div>
+<div class="ttc" id="structUcxAVLTree_html_a87aff25cb726cb9eb88eb815a10d1004"><div class="ttname"><a href="structUcxAVLTree.html#a87aff25cb726cb9eb88eb815a10d1004">UcxAVLTree::cmpfunc</a></div><div class="ttdeci">cmp_func cmpfunc</div><div class="ttdoc">Compare function that shall be used to compare the UcxAVLNode keys. </div><div class="ttdef"><b>Definition:</b> avl.h:106</div></div>
+<div class="ttc" id="avl_8h_html_aab1ad9b027ff5e50671aa0ee84e2d541"><div class="ttname"><a href="avl_8h.html#aab1ad9b027ff5e50671aa0ee84e2d541">ucx_avl_succ</a></div><div class="ttdeci">UcxAVLNode * ucx_avl_succ(UcxAVLNode *node)</div><div class="ttdoc">Finds the in-order successor of the given node. </div><div class="ttdef"><b>Definition:</b> avl.c:355</div></div>
+<div class="ttc" id="avl_8h_html_a31ad7fb196ca211f1fc39f4e15f72279"><div class="ttname"><a href="avl_8h.html#a31ad7fb196ca211f1fc39f4e15f72279">ucx_avl_free_content</a></div><div class="ttdeci">void ucx_avl_free_content(UcxAVLTree *tree, ucx_destructor destr)</div><div class="ttdoc">Frees the contents of a UcxAVLTree. </div><div class="ttdef"><b>Definition:</b> avl.c:152</div></div>
+<div class="ttc" id="structUcxAVLTree_html_a30652776b540156ad54c7d52833e4e28"><div class="ttname"><a href="structUcxAVLTree.html#a30652776b540156ad54c7d52833e4e28">UcxAVLTree::allocator</a></div><div class="ttdeci">UcxAllocator * allocator</div><div class="ttdoc">The UcxAllocator that shall be used to manage the memory for node data. </div><div class="ttdef"><b>Definition:</b> avl.h:97</div></div>
+<div class="ttc" id="avl_8h_html_a01aeeecd6415f0cc2b623486eb28f254"><div class="ttname"><a href="avl_8h.html#a01aeeecd6415f0cc2b623486eb28f254">ucx_avl_remove_s</a></div><div class="ttdeci">int ucx_avl_remove_s(UcxAVLTree *tree, intptr_t key, intptr_t *oldkey, void **oldvalue)</div><div class="ttdoc">Removes an element from the AVL tree. </div><div class="ttdef"><b>Definition:</b> avl.c:274</div></div>
+<div class="ttc" id="avl_8h_html_a51770e1614b28d7d22dea096c3704f83"><div class="ttname"><a href="avl_8h.html#a51770e1614b28d7d22dea096c3704f83">ucx_avl_find</a></div><div class="ttdeci">void * ucx_avl_find(UcxAVLTree *tree, intptr_t key, distance_func dfnc, int mode)</div><div class="ttdoc">Finds a value within the tree. </div><div class="ttdef"><b>Definition:</b> avl.c:205</div></div>
+<div class="ttc" id="structUcxAllocator_html"><div class="ttname"><a href="structUcxAllocator.html">UcxAllocator</a></div><div class="ttdoc">UCX allocator data structure containing memory management functions. </div><div class="ttdef"><b>Definition:</b> allocator.h:88</div></div>
+<div class="ttc" id="avl_8h_html_a32cf8955cc0226a82bacfc7b76d6474c"><div class="ttname"><a href="avl_8h.html#a32cf8955cc0226a82bacfc7b76d6474c">ucx_avl_put_s</a></div><div class="ttdeci">int ucx_avl_put_s(UcxAVLTree *tree, intptr_t key, void *value, void **oldvalue)</div><div class="ttdoc">Puts a key/value pair into the tree. </div><div class="ttdef"><b>Definition:</b> avl.c:215</div></div>
+<div class="ttc" id="structUcxAVLTree_html_a393a8fc99eb2c290d3cb67170081d742"><div class="ttname"><a href="structUcxAVLTree.html#a393a8fc99eb2c290d3cb67170081d742">UcxAVLTree::root</a></div><div class="ttdeci">UcxAVLNode * root</div><div class="ttdoc">Root node of the tree. </div><div class="ttdef"><b>Definition:</b> avl.h:101</div></div>
+<div class="ttc" id="ucx_8h_html_a0bc5bf89e556c1d45d10863d52728ac9"><div class="ttname"><a href="ucx_8h.html#a0bc5bf89e556c1d45d10863d52728ac9">distance_func</a></div><div class="ttdeci">intmax_t(* distance_func)(const void *, const void *, void *)</div><div class="ttdoc">Function pointer to a distance function. </div><div class="ttdef"><b>Definition:</b> ucx.h:93</div></div>
+<div class="ttc" id="allocator_8h_html"><div class="ttname"><a href="allocator_8h.html">allocator.h</a></div><div class="ttdoc">Allocator for custom memory management. </div></div>
+<div class="ttc" id="avl_8h_html_adbcf7ceb3f014a30c7214f7304519efe"><div class="ttname"><a href="avl_8h.html#adbcf7ceb3f014a30c7214f7304519efe">ucx_avl_get</a></div><div class="ttdeci">void * ucx_avl_get(UcxAVLTree *tree, intptr_t key)</div><div class="ttdoc">Gets the value from the tree, that is associated with the specified key. </div><div class="ttdef"><b>Definition:</b> avl.c:166</div></div>
+<div class="ttc" id="structUcxAVLNode_html_ad3a1c733f2c1cc81ac527f846fc24b9c"><div class="ttname"><a href="structUcxAVLNode.html#ad3a1c733f2c1cc81ac527f846fc24b9c">UcxAVLNode::left</a></div><div class="ttdeci">UcxAVLNode * left</div><div class="ttdoc">Root node of left subtree. </div><div class="ttdef"><b>Definition:</b> avl.h:83</div></div>
+<div class="ttc" id="avl_8h_html_a2f92db538f25fce908d2cb3e5590944c"><div class="ttname"><a href="avl_8h.html#a2f92db538f25fce908d2cb3e5590944c">ucx_avl_free</a></div><div class="ttdeci">void ucx_avl_free(UcxAVLTree *tree)</div><div class="ttdoc">Destroys a UcxAVLTree. </div><div class="ttdef"><b>Definition:</b> avl.c:133</div></div>
+<div class="ttc" id="structUcxAVLNode_html_a302501b8c04c3fde668fe72249871258"><div class="ttname"><a href="structUcxAVLNode.html#a302501b8c04c3fde668fe72249871258">UcxAVLNode::value</a></div><div class="ttdeci">void * value</div><div class="ttdoc">Data contained by this node. </div><div class="ttdef"><b>Definition:</b> avl.h:71</div></div>
+<div class="ttc" id="avl_8h_html_a664986f64d6865605199fbff06e19cd5"><div class="ttname"><a href="avl_8h.html#a664986f64d6865605199fbff06e19cd5">ucx_avl_find_node</a></div><div class="ttdeci">UcxAVLNode * ucx_avl_find_node(UcxAVLTree *tree, intptr_t key, distance_func dfnc, int mode)</div><div class="ttdoc">Finds a node within the tree. </div><div class="ttdef"><b>Definition:</b> avl.c:171</div></div>
+<div class="ttc" id="structUcxAVLNode_html_ab65a31010d26a3df898e6ba534702af6"><div class="ttname"><a href="structUcxAVLNode.html#ab65a31010d26a3df898e6ba534702af6">UcxAVLNode::key</a></div><div class="ttdeci">intptr_t key</div><div class="ttdoc">The key for this node. </div><div class="ttdef"><b>Definition:</b> avl.h:67</div></div>
+<div class="ttc" id="structUcxAVLNode_html_a7cbaa31dba8c7a89f4f8f7905f6fd238"><div class="ttname"><a href="structUcxAVLNode.html#a7cbaa31dba8c7a89f4f8f7905f6fd238">UcxAVLNode::right</a></div><div class="ttdeci">UcxAVLNode * right</div><div class="ttdoc">Root node of right subtree. </div><div class="ttdef"><b>Definition:</b> avl.h:87</div></div>
+<div class="ttc" id="avl_8h_html_acf42da9a4168e47dc10b4ba0d27ceb4e"><div class="ttname"><a href="avl_8h.html#acf42da9a4168e47dc10b4ba0d27ceb4e">ucx_avl_get_node</a></div><div class="ttdeci">UcxAVLNode * ucx_avl_get_node(UcxAVLTree *tree, intptr_t key)</div><div class="ttdoc">Gets the node from the tree, that is associated with the specified key. </div><div class="ttdef"><b>Definition:</b> avl.c:156</div></div>
+<div class="ttc" id="structUcxAVLNode_html_af129fd32863a7c35e82c5cd9d11dc95a"><div class="ttname"><a href="structUcxAVLNode.html#af129fd32863a7c35e82c5cd9d11dc95a">UcxAVLNode::height</a></div><div class="ttdeci">size_t height</div><div class="ttdoc">The height of this (sub)-tree. </div><div class="ttdef"><b>Definition:</b> avl.h:75</div></div>
+<div class="ttc" id="ucx_8h_html_ad2b370c2809914c8b7fedab163c266b3"><div class="ttname"><a href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a></div><div class="ttdeci">void(* ucx_destructor)(void *)</div><div class="ttdoc">A function pointer to a destructor function. </div><div class="ttdef"><b>Definition:</b> ucx.h:72</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
Binary file docs/api-2.1/bc_s.png has changed
Binary file docs/api-2.1/bdwn.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/buffer_8h.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,844 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/buffer.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">buffer.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Advanced buffer implementation.  
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
+<code>#include &lt;sys/types.h&gt;</code><br />
+<code>#include &lt;stdio.h&gt;</code><br />
+</div>
+<p><a href="buffer_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxBuffer.html">UcxBuffer</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">UCX Buffer.  <a href="structUcxBuffer.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:acc77c8ed7b26854f555d4a5d11e49ea2"><td class="memItemLeft" align="right" valign="top"><a id="acc77c8ed7b26854f555d4a5d11e49ea2"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="buffer_8h.html#acc77c8ed7b26854f555d4a5d11e49ea2">UCX_BUFFER_DEFAULT</a>&#160;&#160;&#160;0x00</td></tr>
+<tr class="memdesc:acc77c8ed7b26854f555d4a5d11e49ea2"><td class="mdescLeft">&#160;</td><td class="mdescRight">No buffer features enabled (all flags cleared). <br /></td></tr>
+<tr class="separator:acc77c8ed7b26854f555d4a5d11e49ea2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8bab11ad8a76719228b9ee91e2e45535"><td class="memItemLeft" align="right" valign="top"><a id="a8bab11ad8a76719228b9ee91e2e45535"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="buffer_8h.html#a8bab11ad8a76719228b9ee91e2e45535">UCX_BUFFER_AUTOFREE</a>&#160;&#160;&#160;0x01</td></tr>
+<tr class="memdesc:a8bab11ad8a76719228b9ee91e2e45535"><td class="mdescLeft">&#160;</td><td class="mdescRight">If this flag is enabled, the buffer will automatically free its contents. <br /></td></tr>
+<tr class="separator:a8bab11ad8a76719228b9ee91e2e45535"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a05f9565f2d04399168c3b1c152a632be"><td class="memItemLeft" align="right" valign="top"><a id="a05f9565f2d04399168c3b1c152a632be"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="buffer_8h.html#a05f9565f2d04399168c3b1c152a632be">UCX_BUFFER_AUTOEXTEND</a>&#160;&#160;&#160;0x02</td></tr>
+<tr class="memdesc:a05f9565f2d04399168c3b1c152a632be"><td class="mdescLeft">&#160;</td><td class="mdescRight">If this flag is enabled, the buffer will automatically extends its capacity. <br /></td></tr>
+<tr class="separator:a05f9565f2d04399168c3b1c152a632be"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a828353846428c2c2f695f9938f059e52"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="buffer_8h.html#a828353846428c2c2f695f9938f059e52">ucx_buffer_clone</a>(src,  flags)&#160;&#160;&#160;<a class="el" href="buffer_8h.html#a33fa7bb35fe08bbb3542f227514332ef">ucx_buffer_extract</a>(src, 0, (src)-&gt;capacity, flags)</td></tr>
+<tr class="memdesc:a828353846428c2c2f695f9938f059e52"><td class="mdescLeft">&#160;</td><td class="mdescRight">A shorthand macro for the full extraction of the buffer.  <a href="#a828353846428c2c2f695f9938f059e52">More...</a><br /></td></tr>
+<tr class="separator:a828353846428c2c2f695f9938f059e52"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a374abd5aabfcc3ee0777a79d5fe651ab"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="buffer_8h.html#a374abd5aabfcc3ee0777a79d5fe651ab">ucx_buffer_clear</a>(buffer)</td></tr>
+<tr class="memdesc:a374abd5aabfcc3ee0777a79d5fe651ab"><td class="mdescLeft">&#160;</td><td class="mdescRight">Clears the buffer by resetting the position and deleting the data.  <a href="#a374abd5aabfcc3ee0777a79d5fe651ab">More...</a><br /></td></tr>
+<tr class="separator:a374abd5aabfcc3ee0777a79d5fe651ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0f4b64f1b3a74c4f6c5d9409d6b6086a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="buffer_8h.html#a0f4b64f1b3a74c4f6c5d9409d6b6086a">ucx_buffer_to_sstr</a>(buffer)&#160;&#160;&#160;<a class="el" href="string_8h.html#a2744c38ac44abf3e01fa059056dcf36c">sstrn</a>((buffer)-&gt;space, (buffer)-&gt;size)</td></tr>
+<tr class="memdesc:a0f4b64f1b3a74c4f6c5d9409d6b6086a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the complete buffer content as <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a>.  <a href="#a0f4b64f1b3a74c4f6c5d9409d6b6086a">More...</a><br /></td></tr>
+<tr class="separator:a0f4b64f1b3a74c4f6c5d9409d6b6086a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aacea876d692193ec6f859ce98da7351c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="buffer_8h.html#aacea876d692193ec6f859ce98da7351c">ucx_buffer_new</a> (void *space, size_t capacity, int flags)</td></tr>
+<tr class="memdesc:aacea876d692193ec6f859ce98da7351c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new buffer.  <a href="#aacea876d692193ec6f859ce98da7351c">More...</a><br /></td></tr>
+<tr class="separator:aacea876d692193ec6f859ce98da7351c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2af8646d8905c22c7322e7540b0440af"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="buffer_8h.html#a2af8646d8905c22c7322e7540b0440af">ucx_buffer_free</a> (<a class="el" href="structUcxBuffer.html">UcxBuffer</a> *buffer)</td></tr>
+<tr class="memdesc:a2af8646d8905c22c7322e7540b0440af"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys a buffer.  <a href="#a2af8646d8905c22c7322e7540b0440af">More...</a><br /></td></tr>
+<tr class="separator:a2af8646d8905c22c7322e7540b0440af"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a33fa7bb35fe08bbb3542f227514332ef"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="buffer_8h.html#a33fa7bb35fe08bbb3542f227514332ef">ucx_buffer_extract</a> (<a class="el" href="structUcxBuffer.html">UcxBuffer</a> *src, size_t start, size_t length, int flags)</td></tr>
+<tr class="memdesc:a33fa7bb35fe08bbb3542f227514332ef"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new buffer and fills it with extracted content from another buffer.  <a href="#a33fa7bb35fe08bbb3542f227514332ef">More...</a><br /></td></tr>
+<tr class="separator:a33fa7bb35fe08bbb3542f227514332ef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a12a0c6a2379ef080043e6286bb8bad69"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="buffer_8h.html#a12a0c6a2379ef080043e6286bb8bad69">ucx_buffer_shift</a> (<a class="el" href="structUcxBuffer.html">UcxBuffer</a> *buffer, off_t shift)</td></tr>
+<tr class="memdesc:a12a0c6a2379ef080043e6286bb8bad69"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shifts the contents of the buffer by the given offset.  <a href="#a12a0c6a2379ef080043e6286bb8bad69">More...</a><br /></td></tr>
+<tr class="separator:a12a0c6a2379ef080043e6286bb8bad69"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4fa10b6471495547eb981248fd4f1bc2"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="buffer_8h.html#a4fa10b6471495547eb981248fd4f1bc2">ucx_buffer_shift_right</a> (<a class="el" href="structUcxBuffer.html">UcxBuffer</a> *buffer, size_t shift)</td></tr>
+<tr class="memdesc:a4fa10b6471495547eb981248fd4f1bc2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shifts the buffer to the right.  <a href="#a4fa10b6471495547eb981248fd4f1bc2">More...</a><br /></td></tr>
+<tr class="separator:a4fa10b6471495547eb981248fd4f1bc2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a20431dd0ed6a6fe9f15333bd72afe4db"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="buffer_8h.html#a20431dd0ed6a6fe9f15333bd72afe4db">ucx_buffer_shift_left</a> (<a class="el" href="structUcxBuffer.html">UcxBuffer</a> *buffer, size_t shift)</td></tr>
+<tr class="memdesc:a20431dd0ed6a6fe9f15333bd72afe4db"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shifts the buffer to the left.  <a href="#a20431dd0ed6a6fe9f15333bd72afe4db">More...</a><br /></td></tr>
+<tr class="separator:a20431dd0ed6a6fe9f15333bd72afe4db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a47d98482662073c74f35deb0957d15d1"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="buffer_8h.html#a47d98482662073c74f35deb0957d15d1">ucx_buffer_seek</a> (<a class="el" href="structUcxBuffer.html">UcxBuffer</a> *buffer, off_t offset, int whence)</td></tr>
+<tr class="memdesc:a47d98482662073c74f35deb0957d15d1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Moves the position of the buffer.  <a href="#a47d98482662073c74f35deb0957d15d1">More...</a><br /></td></tr>
+<tr class="separator:a47d98482662073c74f35deb0957d15d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abad7fd9ad5061224c780b8d1d4c55f09"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="buffer_8h.html#abad7fd9ad5061224c780b8d1d4c55f09">ucx_buffer_eof</a> (<a class="el" href="structUcxBuffer.html">UcxBuffer</a> *buffer)</td></tr>
+<tr class="memdesc:abad7fd9ad5061224c780b8d1d4c55f09"><td class="mdescLeft">&#160;</td><td class="mdescRight">Tests, if the buffer position has exceeded the buffer capacity.  <a href="#abad7fd9ad5061224c780b8d1d4c55f09">More...</a><br /></td></tr>
+<tr class="separator:abad7fd9ad5061224c780b8d1d4c55f09"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afaf97d2cd7e9faad79a9d35fe33e30c6"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="buffer_8h.html#afaf97d2cd7e9faad79a9d35fe33e30c6">ucx_buffer_extend</a> (<a class="el" href="structUcxBuffer.html">UcxBuffer</a> *buffer, size_t additional_bytes)</td></tr>
+<tr class="memdesc:afaf97d2cd7e9faad79a9d35fe33e30c6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extends the capacity of the buffer.  <a href="#afaf97d2cd7e9faad79a9d35fe33e30c6">More...</a><br /></td></tr>
+<tr class="separator:afaf97d2cd7e9faad79a9d35fe33e30c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af8aacc7401814392b58c1b7b81bffc05"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="buffer_8h.html#af8aacc7401814392b58c1b7b81bffc05">ucx_buffer_write</a> (const void *ptr, size_t size, size_t nitems, <a class="el" href="structUcxBuffer.html">UcxBuffer</a> *buffer)</td></tr>
+<tr class="memdesc:af8aacc7401814392b58c1b7b81bffc05"><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes data to a <a class="el" href="structUcxBuffer.html" title="UCX Buffer. ">UcxBuffer</a>.  <a href="#af8aacc7401814392b58c1b7b81bffc05">More...</a><br /></td></tr>
+<tr class="separator:af8aacc7401814392b58c1b7b81bffc05"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae5c3430759f0059547b35d5a254d4da5"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="buffer_8h.html#ae5c3430759f0059547b35d5a254d4da5">ucx_buffer_read</a> (void *ptr, size_t size, size_t nitems, <a class="el" href="structUcxBuffer.html">UcxBuffer</a> *buffer)</td></tr>
+<tr class="memdesc:ae5c3430759f0059547b35d5a254d4da5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Reads data from a <a class="el" href="structUcxBuffer.html" title="UCX Buffer. ">UcxBuffer</a>.  <a href="#ae5c3430759f0059547b35d5a254d4da5">More...</a><br /></td></tr>
+<tr class="separator:ae5c3430759f0059547b35d5a254d4da5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7d6f01b9d631b0123475dfb98fb849ac"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="buffer_8h.html#a7d6f01b9d631b0123475dfb98fb849ac">ucx_buffer_putc</a> (<a class="el" href="structUcxBuffer.html">UcxBuffer</a> *buffer, int c)</td></tr>
+<tr class="memdesc:a7d6f01b9d631b0123475dfb98fb849ac"><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes a character to a buffer.  <a href="#a7d6f01b9d631b0123475dfb98fb849ac">More...</a><br /></td></tr>
+<tr class="separator:a7d6f01b9d631b0123475dfb98fb849ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a396339022159ce4ca6d069de9f9209b0"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="buffer_8h.html#a396339022159ce4ca6d069de9f9209b0">ucx_buffer_getc</a> (<a class="el" href="structUcxBuffer.html">UcxBuffer</a> *buffer)</td></tr>
+<tr class="memdesc:a396339022159ce4ca6d069de9f9209b0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Gets a character from a buffer.  <a href="#a396339022159ce4ca6d069de9f9209b0">More...</a><br /></td></tr>
+<tr class="separator:a396339022159ce4ca6d069de9f9209b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af1d4b478e04b3ae0bf30e7c2ea964ea2"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="buffer_8h.html#af1d4b478e04b3ae0bf30e7c2ea964ea2">ucx_buffer_puts</a> (<a class="el" href="structUcxBuffer.html">UcxBuffer</a> *buffer, const char *str)</td></tr>
+<tr class="memdesc:af1d4b478e04b3ae0bf30e7c2ea964ea2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Writes a string to a buffer.  <a href="#af1d4b478e04b3ae0bf30e7c2ea964ea2">More...</a><br /></td></tr>
+<tr class="separator:af1d4b478e04b3ae0bf30e7c2ea964ea2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Advanced buffer implementation. </p>
+<p>Instances of <a class="el" href="structUcxBuffer.html" title="UCX Buffer. ">UcxBuffer</a> can be used to read from or to write to like one would do with a stream. This allows the use of <a class="el" href="utils_8h.html#a41ca1344f781c0d3bf7a414a6e811392" title="Shorthand for an unbounded ucx_stream_bncopy call using a default buffer. ">ucx_stream_copy()</a> to copy contents from one buffer to another.</p>
+<p>Some features for convenient use of the buffer can be enabled. See the documentation of the macro constants for more information.</p>
+<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
+<dd>
+Olaf Wintermann </dd></dl>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a374abd5aabfcc3ee0777a79d5fe651ab"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a374abd5aabfcc3ee0777a79d5fe651ab">&#9670;&nbsp;</a></span>ucx_buffer_clear</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_buffer_clear</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">buffer</td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">memset((buffer)-&gt;space, 0, (buffer)-&gt;size); \</div><div class="line">        (buffer)-&gt;size = 0; (buffer)-&gt;pos = 0;</div></div><!-- fragment -->
+<p>Clears the buffer by resetting the position and deleting the data. </p>
+<p>The data is deleted by a zeroing it with call to <code>memset()</code>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buffer</td><td>the buffer to be cleared </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a828353846428c2c2f695f9938f059e52"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a828353846428c2c2f695f9938f059e52">&#9670;&nbsp;</a></span>ucx_buffer_clone</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_buffer_clone</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">flags&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="buffer_8h.html#a33fa7bb35fe08bbb3542f227514332ef">ucx_buffer_extract</a>(src, 0, (src)-&gt;capacity, flags)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>A shorthand macro for the full extraction of the buffer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">src</td><td>the source buffer </td></tr>
+    <tr><td class="paramname">flags</td><td>feature mask for the new buffer </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new buffer with the extracted content </dd></dl>
+
+</div>
+</div>
+<a id="a0f4b64f1b3a74c4f6c5d9409d6b6086a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0f4b64f1b3a74c4f6c5d9409d6b6086a">&#9670;&nbsp;</a></span>ucx_buffer_to_sstr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_buffer_to_sstr</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">buffer</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="string_8h.html#a2744c38ac44abf3e01fa059056dcf36c">sstrn</a>((buffer)-&gt;space, (buffer)-&gt;size)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns the complete buffer content as <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a>. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buffer</td><td>the buffer </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the result of <code><a class="el" href="string_8h.html#a2744c38ac44abf3e01fa059056dcf36c" title="Creates a new sstr_t of the specified length based on a C string. ">sstrn()</a></code> with the buffer space and size as arguments </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="abad7fd9ad5061224c780b8d1d4c55f09"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abad7fd9ad5061224c780b8d1d4c55f09">&#9670;&nbsp;</a></span>ucx_buffer_eof()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_buffer_eof </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
+          <td class="paramname"><em>buffer</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Tests, if the buffer position has exceeded the buffer capacity. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buffer</td><td>the buffer to test </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>non-zero, if the current buffer position has exceeded the last available byte of the buffer. </dd></dl>
+
+</div>
+</div>
+<a id="afaf97d2cd7e9faad79a9d35fe33e30c6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afaf97d2cd7e9faad79a9d35fe33e30c6">&#9670;&nbsp;</a></span>ucx_buffer_extend()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_buffer_extend </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
+          <td class="paramname"><em>buffer</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>additional_bytes</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Extends the capacity of the buffer. </p>
+<p><b>Note:</b> The buffer capacity increased by a power of two. I.e. the buffer capacity is doubled, as long as it would not hold the current content plus the additional required bytes.</p>
+<p><b>Attention:</b> the argument provided is the number of <em>additional</em> bytes the buffer shall hold. It is <b>NOT</b> the total number of bytes the buffer shall hold.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buffer</td><td>the buffer to extend </td></tr>
+    <tr><td class="paramname">additional_bytes</td><td>the number of additional bytes the buffer shall <em>at least</em> hold </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>0 on success or a non-zero value on failure </dd></dl>
+
+</div>
+</div>
+<a id="a33fa7bb35fe08bbb3542f227514332ef"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a33fa7bb35fe08bbb3542f227514332ef">&#9670;&nbsp;</a></span>ucx_buffer_extract()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxBuffer.html">UcxBuffer</a>* ucx_buffer_extract </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
+          <td class="paramname"><em>src</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>start</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>length</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>flags</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Creates a new buffer and fills it with extracted content from another buffer. </p>
+<p><b>Note:</b> the <a class="el" href="buffer_8h.html#a8bab11ad8a76719228b9ee91e2e45535" title="If this flag is enabled, the buffer will automatically free its contents. ">UCX_BUFFER_AUTOFREE</a> feature is enforced for the new buffer.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">src</td><td>the source buffer </td></tr>
+    <tr><td class="paramname">start</td><td>the start position of extraction </td></tr>
+    <tr><td class="paramname">length</td><td>the count of bytes to extract (must not be zero) </td></tr>
+    <tr><td class="paramname">flags</td><td>feature mask for the new buffer </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new buffer containing the extraction </dd></dl>
+
+</div>
+</div>
+<a id="a2af8646d8905c22c7322e7540b0440af"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2af8646d8905c22c7322e7540b0440af">&#9670;&nbsp;</a></span>ucx_buffer_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_buffer_free </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
+          <td class="paramname"><em>buffer</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Destroys a buffer. </p>
+<p>If the <a class="el" href="buffer_8h.html#a8bab11ad8a76719228b9ee91e2e45535" title="If this flag is enabled, the buffer will automatically free its contents. ">UCX_BUFFER_AUTOFREE</a> feature is enabled, the contents of the buffer are also freed.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buffer</td><td>the buffer to destroy </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a396339022159ce4ca6d069de9f9209b0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a396339022159ce4ca6d069de9f9209b0">&#9670;&nbsp;</a></span>ucx_buffer_getc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_buffer_getc </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
+          <td class="paramname"><em>buffer</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Gets a character from a buffer. </p>
+<p>The current position of the buffer is increased after a successful read.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buffer</td><td>the buffer to read from </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the character as <code>int</code> value or <code>EOF</code>, if the end of the buffer is reached </dd></dl>
+
+</div>
+</div>
+<a id="aacea876d692193ec6f859ce98da7351c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aacea876d692193ec6f859ce98da7351c">&#9670;&nbsp;</a></span>ucx_buffer_new()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxBuffer.html">UcxBuffer</a>* ucx_buffer_new </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>space</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>capacity</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>flags</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Creates a new buffer. </p>
+<p><b>Note:</b> you may provide <code>NULL</code> as argument for <code>space</code>. Then this function will allocate the space and enforce the <a class="el" href="buffer_8h.html#a8bab11ad8a76719228b9ee91e2e45535" title="If this flag is enabled, the buffer will automatically free its contents. ">UCX_BUFFER_AUTOFREE</a> flag.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">space</td><td>pointer to the memory area, or <code>NULL</code> to allocate new memory </td></tr>
+    <tr><td class="paramname">capacity</td><td>the capacity of the buffer </td></tr>
+    <tr><td class="paramname">flags</td><td>buffer features (see <a class="el" href="structUcxBuffer.html#ac642e07b0a03be5aac48eb4aa5bec2f7" title="Flag register for buffer features. ">UcxBuffer.flags</a>) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the new buffer </dd></dl>
+
+</div>
+</div>
+<a id="a7d6f01b9d631b0123475dfb98fb849ac"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7d6f01b9d631b0123475dfb98fb849ac">&#9670;&nbsp;</a></span>ucx_buffer_putc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_buffer_putc </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
+          <td class="paramname"><em>buffer</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>c</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Writes a character to a buffer. </p>
+<p>The least significant byte of the argument is written to the buffer. If the end of the buffer is reached and <a class="el" href="buffer_8h.html#a05f9565f2d04399168c3b1c152a632be" title="If this flag is enabled, the buffer will automatically extends its capacity. ">UCX_BUFFER_AUTOEXTEND</a> feature is enabled, the buffer capacity is extended by <a class="el" href="buffer_8h.html#afaf97d2cd7e9faad79a9d35fe33e30c6" title="Extends the capacity of the buffer. ">ucx_buffer_extend()</a>. If the feature is disabled or buffer extension fails, <code>EOF</code> is returned.</p>
+<p>On successful write the position of the buffer is increased.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buffer</td><td>the buffer to write to </td></tr>
+    <tr><td class="paramname">c</td><td>the character to write as <code>int</code> value </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the byte that has bean written as <code>int</code> value or <code>EOF</code> when the end of the stream is reached and automatic extension is not enabled or not possible </dd></dl>
+
+</div>
+</div>
+<a id="af1d4b478e04b3ae0bf30e7c2ea964ea2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af1d4b478e04b3ae0bf30e7c2ea964ea2">&#9670;&nbsp;</a></span>ucx_buffer_puts()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t ucx_buffer_puts </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
+          <td class="paramname"><em>buffer</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>str</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Writes a string to a buffer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buffer</td><td>the buffer </td></tr>
+    <tr><td class="paramname">str</td><td>the string </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the number of bytes written </dd></dl>
+
+</div>
+</div>
+<a id="ae5c3430759f0059547b35d5a254d4da5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae5c3430759f0059547b35d5a254d4da5">&#9670;&nbsp;</a></span>ucx_buffer_read()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t ucx_buffer_read </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>ptr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>size</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>nitems</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
+          <td class="paramname"><em>buffer</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Reads data from a <a class="el" href="structUcxBuffer.html" title="UCX Buffer. ">UcxBuffer</a>. </p>
+<p>The position of the buffer is increased by the number of bytes read.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ptr</td><td>a pointer to the memory area where to store the read data </td></tr>
+    <tr><td class="paramname">size</td><td>the length of one element </td></tr>
+    <tr><td class="paramname">nitems</td><td>the element count </td></tr>
+    <tr><td class="paramname">buffer</td><td>the <a class="el" href="structUcxBuffer.html" title="UCX Buffer. ">UcxBuffer</a> to read from </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the total number of elements read </dd></dl>
+
+</div>
+</div>
+<a id="a47d98482662073c74f35deb0957d15d1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a47d98482662073c74f35deb0957d15d1">&#9670;&nbsp;</a></span>ucx_buffer_seek()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_buffer_seek </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
+          <td class="paramname"><em>buffer</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">off_t&#160;</td>
+          <td class="paramname"><em>offset</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>whence</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Moves the position of the buffer. </p>
+<p>The new position is relative to the <code>whence</code> argument.</p>
+<p>SEEK_SET marks the start of the buffer. SEEK_CUR marks the current position. SEEK_END marks the end of the buffer.</p>
+<p>With an offset of zero, this function sets the buffer position to zero (SEEK_SET), the buffer size (SEEK_END) or leaves the buffer position unchanged (SEEK_CUR).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buffer</td><td></td></tr>
+    <tr><td class="paramname">offset</td><td>position offset relative to <code>whence</code> </td></tr>
+    <tr><td class="paramname">whence</td><td>one of SEEK_SET, SEEK_CUR or SEEK_END </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>0 on success, non-zero if the position is invalid </dd></dl>
+
+</div>
+</div>
+<a id="a12a0c6a2379ef080043e6286bb8bad69"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a12a0c6a2379ef080043e6286bb8bad69">&#9670;&nbsp;</a></span>ucx_buffer_shift()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_buffer_shift </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
+          <td class="paramname"><em>buffer</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">off_t&#160;</td>
+          <td class="paramname"><em>shift</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shifts the contents of the buffer by the given offset. </p>
+<p>If the offset is positive, the contents are shifted to the right. If auto extension is enabled, the buffer grows, if necessary. In case the auto extension fails, this function returns a non-zero value and no contents are changed. If auto extension is disabled, the contents that do not fit into the buffer are discarded.</p>
+<p>If the offset is negative, the contents are shifted to the left where the first <code>shift</code> bytes are discarded. The new size of the buffer is the old size minus the absolute shift value. If this value is larger than the buffer size, the buffer is emptied (but not cleared, see the security note below).</p>
+<p>The buffer position gets shifted alongside with the content but is kept within the boundaries of the buffer.</p>
+<p><b>Security note:</b> the shifting operation does <em>not</em> erase the previously occupied memory cells. You can easily do that manually, e.g. by calling <code>memset(buffer-&gt;space, 0, shift)</code> for a right shift or <code>memset(buffer-&gt;size, 0, buffer-&gt;capacity-buffer-&gt;size)</code> for a left shift.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buffer</td><td>the buffer </td></tr>
+    <tr><td class="paramname">shift</td><td>the shift offset (negative means left shift) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>0 on success, non-zero if a required auto-extension fails </dd></dl>
+
+</div>
+</div>
+<a id="a20431dd0ed6a6fe9f15333bd72afe4db"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a20431dd0ed6a6fe9f15333bd72afe4db">&#9670;&nbsp;</a></span>ucx_buffer_shift_left()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_buffer_shift_left </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
+          <td class="paramname"><em>buffer</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>shift</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shifts the buffer to the left. </p>
+<p>See <a class="el" href="buffer_8h.html#a12a0c6a2379ef080043e6286bb8bad69" title="Shifts the contents of the buffer by the given offset. ">ucx_buffer_shift()</a> for details. Note, however, that this method expects a positive shift offset.</p>
+<p>Since a left shift cannot fail due to memory allocation problems, this function always returns zero.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buffer</td><td>the buffer </td></tr>
+    <tr><td class="paramname">shift</td><td>the shift offset </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>always zero </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="buffer_8h.html#a12a0c6a2379ef080043e6286bb8bad69" title="Shifts the contents of the buffer by the given offset. ">ucx_buffer_shift()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a4fa10b6471495547eb981248fd4f1bc2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4fa10b6471495547eb981248fd4f1bc2">&#9670;&nbsp;</a></span>ucx_buffer_shift_right()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_buffer_shift_right </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
+          <td class="paramname"><em>buffer</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>shift</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shifts the buffer to the right. </p>
+<p>See <a class="el" href="buffer_8h.html#a12a0c6a2379ef080043e6286bb8bad69" title="Shifts the contents of the buffer by the given offset. ">ucx_buffer_shift()</a> for details.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buffer</td><td>the buffer </td></tr>
+    <tr><td class="paramname">shift</td><td>the shift offset </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>0 on success, non-zero if a required auto-extension fails </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="buffer_8h.html#a12a0c6a2379ef080043e6286bb8bad69" title="Shifts the contents of the buffer by the given offset. ">ucx_buffer_shift()</a> </dd></dl>
+
+</div>
+</div>
+<a id="af8aacc7401814392b58c1b7b81bffc05"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af8aacc7401814392b58c1b7b81bffc05">&#9670;&nbsp;</a></span>ucx_buffer_write()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t ucx_buffer_write </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>ptr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>size</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>nitems</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structUcxBuffer.html">UcxBuffer</a> *&#160;</td>
+          <td class="paramname"><em>buffer</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Writes data to a <a class="el" href="structUcxBuffer.html" title="UCX Buffer. ">UcxBuffer</a>. </p>
+<p>The position of the buffer is increased by the number of bytes written.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ptr</td><td>a pointer to the memory area containing the bytes to be written </td></tr>
+    <tr><td class="paramname">size</td><td>the length of one element </td></tr>
+    <tr><td class="paramname">nitems</td><td>the element count </td></tr>
+    <tr><td class="paramname">buffer</td><td>the <a class="el" href="structUcxBuffer.html" title="UCX Buffer. ">UcxBuffer</a> to write to </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the total count of bytes written </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/buffer_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,100 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/buffer.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">buffer.h</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a href="buffer_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment"> * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"> * Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment"> * modification, are permitted provided that the following conditions are met:</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> *   1. Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> *   2. Redistributions in binary form must reproduce the above copyright</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer in the</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment"> *      documentation and/or other materials provided with the distribution.</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment"> * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment"> * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment"> * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"> * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment"> * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment"> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment"> * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE</span></div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> * POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;</div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;<span class="preprocessor">#ifndef UCX_BUFFER_H</span></div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;<span class="preprocessor">#define UCX_BUFFER_H</span></div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;</div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ucx_8h.html">ucx.h</a>&quot;</span></div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;<span class="preprocessor">#include &lt;sys/types.h&gt;</span></div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;<span class="preprocessor">#include &lt;stdio.h&gt;</span></div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;</div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;</div><div class="line"><a name="l00060"></a><span class="lineno"><a class="line" href="buffer_8h.html#acc77c8ed7b26854f555d4a5d11e49ea2">   60</a></span>&#160;<span class="preprocessor">#define UCX_BUFFER_DEFAULT      0x00</span></div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;</div><div class="line"><a name="l00065"></a><span class="lineno"><a class="line" href="buffer_8h.html#a8bab11ad8a76719228b9ee91e2e45535">   65</a></span>&#160;<span class="preprocessor">#define UCX_BUFFER_AUTOFREE     0x01</span></div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;</div><div class="line"><a name="l00070"></a><span class="lineno"><a class="line" href="buffer_8h.html#a05f9565f2d04399168c3b1c152a632be">   70</a></span>&#160;<span class="preprocessor">#define UCX_BUFFER_AUTOEXTEND   0x02</span></div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;</div><div class="line"><a name="l00073"></a><span class="lineno"><a class="line" href="structUcxBuffer.html">   73</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span>{</div><div class="line"><a name="l00075"></a><span class="lineno"><a class="line" href="structUcxBuffer.html#a1a5076e85acb84b715a53bc0f37fb721">   75</a></span>&#160;    <span class="keywordtype">char</span> *<a class="code" href="structUcxBuffer.html#a1a5076e85acb84b715a53bc0f37fb721">space</a>;</div><div class="line"><a name="l00077"></a><span class="lineno"><a class="line" href="structUcxBuffer.html#a7a64288f002cf62b492e2ea49c79615c">   77</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="structUcxBuffer.html#a7a64288f002cf62b492e2ea49c79615c">pos</a>;</div><div class="line"><a name="l00079"></a><span class="lineno"><a class="line" href="structUcxBuffer.html#a385661894f3cee9c549bfe07a8b316bf">   79</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="structUcxBuffer.html#a385661894f3cee9c549bfe07a8b316bf">capacity</a>;</div><div class="line"><a name="l00081"></a><span class="lineno"><a class="line" href="structUcxBuffer.html#aec0aea8325394951d5ad4a9fbb8e1ac7">   81</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="structUcxBuffer.html#aec0aea8325394951d5ad4a9fbb8e1ac7">size</a>;</div><div class="line"><a name="l00088"></a><span class="lineno"><a class="line" href="structUcxBuffer.html#ac642e07b0a03be5aac48eb4aa5bec2f7">   88</a></span>&#160;    <span class="keywordtype">int</span> <a class="code" href="structUcxBuffer.html#ac642e07b0a03be5aac48eb4aa5bec2f7">flags</a>;</div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;} <a class="code" href="structUcxBuffer.html">UcxBuffer</a>;</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;</div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;<a class="code" href="structUcxBuffer.html">UcxBuffer</a> *<a class="code" href="buffer_8h.html#aacea876d692193ec6f859ce98da7351c">ucx_buffer_new</a>(<span class="keywordtype">void</span> *space, <span class="keywordtype">size_t</span> capacity, <span class="keywordtype">int</span> flags);</div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;<span class="keywordtype">void</span> <a class="code" href="buffer_8h.html#a2af8646d8905c22c7322e7540b0440af">ucx_buffer_free</a>(<a class="code" href="structUcxBuffer.html">UcxBuffer</a>* buffer);</div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;<a class="code" href="structUcxBuffer.html">UcxBuffer</a>* <a class="code" href="buffer_8h.html#a33fa7bb35fe08bbb3542f227514332ef">ucx_buffer_extract</a>(<a class="code" href="structUcxBuffer.html">UcxBuffer</a> *src,</div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;        <span class="keywordtype">size_t</span> start, <span class="keywordtype">size_t</span> length, <span class="keywordtype">int</span> flags);</div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;</div><div class="line"><a name="l00137"></a><span class="lineno"><a class="line" href="buffer_8h.html#a828353846428c2c2f695f9938f059e52">  137</a></span>&#160;<span class="preprocessor">#define ucx_buffer_clone(src,flags) \</span></div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;<span class="preprocessor">    ucx_buffer_extract(src, 0, (src)-&gt;capacity, flags)</span></div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;</div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;</div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;<span class="keywordtype">int</span> <a class="code" href="buffer_8h.html#a12a0c6a2379ef080043e6286bb8bad69">ucx_buffer_shift</a>(<a class="code" href="structUcxBuffer.html">UcxBuffer</a>* buffer, off_t shift);</div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;</div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;<span class="keywordtype">int</span> <a class="code" href="buffer_8h.html#a4fa10b6471495547eb981248fd4f1bc2">ucx_buffer_shift_right</a>(<a class="code" href="structUcxBuffer.html">UcxBuffer</a>* buffer, <span class="keywordtype">size_t</span> shift);</div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;</div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;<span class="keywordtype">int</span> <a class="code" href="buffer_8h.html#a20431dd0ed6a6fe9f15333bd72afe4db">ucx_buffer_shift_left</a>(<a class="code" href="structUcxBuffer.html">UcxBuffer</a>* buffer, <span class="keywordtype">size_t</span> shift);</div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;</div><div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;</div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;<span class="keywordtype">int</span> <a class="code" href="buffer_8h.html#a47d98482662073c74f35deb0957d15d1">ucx_buffer_seek</a>(<a class="code" href="structUcxBuffer.html">UcxBuffer</a> *buffer, off_t offset, <span class="keywordtype">int</span> whence);</div><div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;</div><div class="line"><a name="l00229"></a><span class="lineno"><a class="line" href="buffer_8h.html#a374abd5aabfcc3ee0777a79d5fe651ab">  229</a></span>&#160;<span class="preprocessor">#define ucx_buffer_clear(buffer) memset((buffer)-&gt;space, 0, (buffer)-&gt;size); \</span></div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;<span class="preprocessor">        (buffer)-&gt;size = 0; (buffer)-&gt;pos = 0;</span></div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;</div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;<span class="keywordtype">int</span> <a class="code" href="buffer_8h.html#abad7fd9ad5061224c780b8d1d4c55f09">ucx_buffer_eof</a>(<a class="code" href="structUcxBuffer.html">UcxBuffer</a> *buffer);</div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;</div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;</div><div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;<span class="keywordtype">int</span> <a class="code" href="buffer_8h.html#afaf97d2cd7e9faad79a9d35fe33e30c6">ucx_buffer_extend</a>(<a class="code" href="structUcxBuffer.html">UcxBuffer</a> *buffer, <span class="keywordtype">size_t</span> additional_bytes);</div><div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;</div><div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;<span class="keywordtype">size_t</span> <a class="code" href="buffer_8h.html#af8aacc7401814392b58c1b7b81bffc05">ucx_buffer_write</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *ptr, <span class="keywordtype">size_t</span> size, <span class="keywordtype">size_t</span> nitems,</div><div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;        <a class="code" href="structUcxBuffer.html">UcxBuffer</a> *buffer);</div><div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;</div><div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;<span class="keywordtype">size_t</span> <a class="code" href="buffer_8h.html#ae5c3430759f0059547b35d5a254d4da5">ucx_buffer_read</a>(<span class="keywordtype">void</span> *ptr, <span class="keywordtype">size_t</span> size, <span class="keywordtype">size_t</span> nitems,</div><div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;        <a class="code" href="structUcxBuffer.html">UcxBuffer</a> *buffer);</div><div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;</div><div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;<span class="keywordtype">int</span> <a class="code" href="buffer_8h.html#a7d6f01b9d631b0123475dfb98fb849ac">ucx_buffer_putc</a>(<a class="code" href="structUcxBuffer.html">UcxBuffer</a> *buffer, <span class="keywordtype">int</span> c);</div><div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;</div><div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;<span class="keywordtype">int</span> <a class="code" href="buffer_8h.html#a396339022159ce4ca6d069de9f9209b0">ucx_buffer_getc</a>(<a class="code" href="structUcxBuffer.html">UcxBuffer</a> *buffer);</div><div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;</div><div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;<span class="keywordtype">size_t</span> <a class="code" href="buffer_8h.html#af1d4b478e04b3ae0bf30e7c2ea964ea2">ucx_buffer_puts</a>(<a class="code" href="structUcxBuffer.html">UcxBuffer</a> *buffer, <span class="keyword">const</span> <span class="keywordtype">char</span> *str);</div><div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;</div><div class="line"><a name="l00332"></a><span class="lineno"><a class="line" href="buffer_8h.html#a0f4b64f1b3a74c4f6c5d9409d6b6086a">  332</a></span>&#160;<span class="preprocessor">#define ucx_buffer_to_sstr(buffer) sstrn((buffer)-&gt;space, (buffer)-&gt;size)</span></div><div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;</div><div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;}</div><div class="line"><a name="l00336"></a><span class="lineno">  336</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;</div><div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;<span class="preprocessor">#endif  </span><span class="comment">/* UCX_BUFFER_H */</span><span class="preprocessor"></span></div><div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;</div><div class="ttc" id="structUcxBuffer_html_ac642e07b0a03be5aac48eb4aa5bec2f7"><div class="ttname"><a href="structUcxBuffer.html#ac642e07b0a03be5aac48eb4aa5bec2f7">UcxBuffer::flags</a></div><div class="ttdeci">int flags</div><div class="ttdoc">Flag register for buffer features. </div><div class="ttdef"><b>Definition:</b> buffer.h:88</div></div>
+<div class="ttc" id="buffer_8h_html_a47d98482662073c74f35deb0957d15d1"><div class="ttname"><a href="buffer_8h.html#a47d98482662073c74f35deb0957d15d1">ucx_buffer_seek</a></div><div class="ttdeci">int ucx_buffer_seek(UcxBuffer *buffer, off_t offset, int whence)</div><div class="ttdoc">Moves the position of the buffer. </div><div class="ttdef"><b>Definition:</b> buffer.c:90</div></div>
+<div class="ttc" id="buffer_8h_html_ae5c3430759f0059547b35d5a254d4da5"><div class="ttname"><a href="buffer_8h.html#ae5c3430759f0059547b35d5a254d4da5">ucx_buffer_read</a></div><div class="ttdeci">size_t ucx_buffer_read(void *ptr, size_t size, size_t nitems, UcxBuffer *buffer)</div><div class="ttdoc">Reads data from a UcxBuffer. </div><div class="ttdef"><b>Definition:</b> buffer.c:189</div></div>
+<div class="ttc" id="buffer_8h_html_a20431dd0ed6a6fe9f15333bd72afe4db"><div class="ttname"><a href="buffer_8h.html#a20431dd0ed6a6fe9f15333bd72afe4db">ucx_buffer_shift_left</a></div><div class="ttdeci">int ucx_buffer_shift_left(UcxBuffer *buffer, size_t shift)</div><div class="ttdoc">Shifts the buffer to the left. </div><div class="ttdef"><b>Definition:</b> buffer.c:244</div></div>
+<div class="ttc" id="ucx_8h_html"><div class="ttname"><a href="ucx_8h.html">ucx.h</a></div><div class="ttdoc">Main UCX Header providing most common definitions. </div></div>
+<div class="ttc" id="buffer_8h_html_afaf97d2cd7e9faad79a9d35fe33e30c6"><div class="ttname"><a href="buffer_8h.html#afaf97d2cd7e9faad79a9d35fe33e30c6">ucx_buffer_extend</a></div><div class="ttdeci">int ucx_buffer_extend(UcxBuffer *buffer, size_t additional_bytes)</div><div class="ttdoc">Extends the capacity of the buffer. </div><div class="ttdef"><b>Definition:</b> buffer.c:126</div></div>
+<div class="ttc" id="buffer_8h_html_a2af8646d8905c22c7322e7540b0440af"><div class="ttname"><a href="buffer_8h.html#a2af8646d8905c22c7322e7540b0440af">ucx_buffer_free</a></div><div class="ttdeci">void ucx_buffer_free(UcxBuffer *buffer)</div><div class="ttdoc">Destroys a buffer. </div><div class="ttdef"><b>Definition:</b> buffer.c:59</div></div>
+<div class="ttc" id="structUcxBuffer_html_a7a64288f002cf62b492e2ea49c79615c"><div class="ttname"><a href="structUcxBuffer.html#a7a64288f002cf62b492e2ea49c79615c">UcxBuffer::pos</a></div><div class="ttdeci">size_t pos</div><div class="ttdoc">Current position of the buffer. </div><div class="ttdef"><b>Definition:</b> buffer.h:77</div></div>
+<div class="ttc" id="buffer_8h_html_af8aacc7401814392b58c1b7b81bffc05"><div class="ttname"><a href="buffer_8h.html#af8aacc7401814392b58c1b7b81bffc05">ucx_buffer_write</a></div><div class="ttdeci">size_t ucx_buffer_write(const void *ptr, size_t size, size_t nitems, UcxBuffer *buffer)</div><div class="ttdoc">Writes data to a UcxBuffer. </div><div class="ttdef"><b>Definition:</b> buffer.c:152</div></div>
+<div class="ttc" id="structUcxBuffer_html_a385661894f3cee9c549bfe07a8b316bf"><div class="ttname"><a href="structUcxBuffer.html#a385661894f3cee9c549bfe07a8b316bf">UcxBuffer::capacity</a></div><div class="ttdeci">size_t capacity</div><div class="ttdoc">Current capacity (i.e. </div><div class="ttdef"><b>Definition:</b> buffer.h:79</div></div>
+<div class="ttc" id="structUcxBuffer_html_a1a5076e85acb84b715a53bc0f37fb721"><div class="ttname"><a href="structUcxBuffer.html#a1a5076e85acb84b715a53bc0f37fb721">UcxBuffer::space</a></div><div class="ttdeci">char * space</div><div class="ttdoc">A pointer to the buffer contents. </div><div class="ttdef"><b>Definition:</b> buffer.h:75</div></div>
+<div class="ttc" id="buffer_8h_html_abad7fd9ad5061224c780b8d1d4c55f09"><div class="ttname"><a href="buffer_8h.html#abad7fd9ad5061224c780b8d1d4c55f09">ucx_buffer_eof</a></div><div class="ttdeci">int ucx_buffer_eof(UcxBuffer *buffer)</div><div class="ttdoc">Tests, if the buffer position has exceeded the buffer capacity. </div><div class="ttdef"><b>Definition:</b> buffer.c:122</div></div>
+<div class="ttc" id="structUcxBuffer_html"><div class="ttname"><a href="structUcxBuffer.html">UcxBuffer</a></div><div class="ttdoc">UCX Buffer. </div><div class="ttdef"><b>Definition:</b> buffer.h:73</div></div>
+<div class="ttc" id="buffer_8h_html_af1d4b478e04b3ae0bf30e7c2ea964ea2"><div class="ttname"><a href="buffer_8h.html#af1d4b478e04b3ae0bf30e7c2ea964ea2">ucx_buffer_puts</a></div><div class="ttdeci">size_t ucx_buffer_puts(UcxBuffer *buffer, const char *str)</div><div class="ttdoc">Writes a string to a buffer. </div><div class="ttdef"><b>Definition:</b> buffer.c:240</div></div>
+<div class="ttc" id="buffer_8h_html_a7d6f01b9d631b0123475dfb98fb849ac"><div class="ttname"><a href="buffer_8h.html#a7d6f01b9d631b0123475dfb98fb849ac">ucx_buffer_putc</a></div><div class="ttdeci">int ucx_buffer_putc(UcxBuffer *buffer, int c)</div><div class="ttdoc">Writes a character to a buffer. </div><div class="ttdef"><b>Definition:</b> buffer.c:210</div></div>
+<div class="ttc" id="buffer_8h_html_a12a0c6a2379ef080043e6286bb8bad69"><div class="ttname"><a href="buffer_8h.html#a12a0c6a2379ef080043e6286bb8bad69">ucx_buffer_shift</a></div><div class="ttdeci">int ucx_buffer_shift(UcxBuffer *buffer, off_t shift)</div><div class="ttdoc">Shifts the contents of the buffer by the given offset. </div><div class="ttdef"><b>Definition:</b> buffer.c:289</div></div>
+<div class="ttc" id="buffer_8h_html_aacea876d692193ec6f859ce98da7351c"><div class="ttname"><a href="buffer_8h.html#aacea876d692193ec6f859ce98da7351c">ucx_buffer_new</a></div><div class="ttdeci">UcxBuffer * ucx_buffer_new(void *space, size_t capacity, int flags)</div><div class="ttdoc">Creates a new buffer. </div><div class="ttdef"><b>Definition:</b> buffer.c:35</div></div>
+<div class="ttc" id="buffer_8h_html_a33fa7bb35fe08bbb3542f227514332ef"><div class="ttname"><a href="buffer_8h.html#a33fa7bb35fe08bbb3542f227514332ef">ucx_buffer_extract</a></div><div class="ttdeci">UcxBuffer * ucx_buffer_extract(UcxBuffer *src, size_t start, size_t length, int flags)</div><div class="ttdoc">Creates a new buffer and fills it with extracted content from another buffer. </div><div class="ttdef"><b>Definition:</b> buffer.c:66</div></div>
+<div class="ttc" id="structUcxBuffer_html_aec0aea8325394951d5ad4a9fbb8e1ac7"><div class="ttname"><a href="structUcxBuffer.html#aec0aea8325394951d5ad4a9fbb8e1ac7">UcxBuffer::size</a></div><div class="ttdeci">size_t size</div><div class="ttdoc">Current size of the buffer content. </div><div class="ttdef"><b>Definition:</b> buffer.h:81</div></div>
+<div class="ttc" id="buffer_8h_html_a396339022159ce4ca6d069de9f9209b0"><div class="ttname"><a href="buffer_8h.html#a396339022159ce4ca6d069de9f9209b0">ucx_buffer_getc</a></div><div class="ttdeci">int ucx_buffer_getc(UcxBuffer *buffer)</div><div class="ttdoc">Gets a character from a buffer. </div><div class="ttdef"><b>Definition:</b> buffer.c:230</div></div>
+<div class="ttc" id="buffer_8h_html_a4fa10b6471495547eb981248fd4f1bc2"><div class="ttname"><a href="buffer_8h.html#a4fa10b6471495547eb981248fd4f1bc2">ucx_buffer_shift_right</a></div><div class="ttdeci">int ucx_buffer_shift_right(UcxBuffer *buffer, size_t shift)</div><div class="ttdoc">Shifts the buffer to the right. </div><div class="ttdef"><b>Definition:</b> buffer.c:260</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/classes.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,89 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: Data Structure Index</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">Data Structure Index</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="qindex"><a class="qindex" href="#letter_s">s</a>&#160;|&#160;<a class="qindex" href="#letter_u">u</a></div>
+<table class="classindex">
+<tr><td rowspan="2" valign="bottom"><a name="letter_s"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;s&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="structucx__regdestr.html">ucx_regdestr</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structUcxBuffer.html">UcxBuffer</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structUcxMapIterator.html">UcxMapIterator</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structUcxTestSuite.html">UcxTestSuite</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="structucx__stack__metadata.html">ucx_stack_metadata</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structUcxKey.html">UcxKey</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structUcxMapKey.html">UcxMapKey</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structUcxAllocator.html">UcxAllocator</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structUcxList.html">UcxList</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structUcxMempool.html">UcxMempool</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structUcxArray.html">UcxArray</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structUcxLogger.html">UcxLogger</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structUcxProperties.html">UcxProperties</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td rowspan="2" valign="bottom"><a name="letter_u"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;u&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="structUcxAVLNode.html">UcxAVLNode</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structUcxMap.html">UcxMap</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structUcxStack.html">UcxStack</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="structUcxAVLTree.html">UcxAVLTree</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structUcxMapElement.html">UcxMapElement</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structUcxTestList.html">UcxTestList</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="structucx__memchunk.html">ucx_memchunk</a>&#160;&#160;&#160;</td><td></td><td></td><td></td><td></td></tr>
+<tr><td></td><td></td><td></td><td></td><td></td></tr>
+</table>
+<div class="qindex"><a class="qindex" href="#letter_s">s</a>&#160;|&#160;<a class="qindex" href="#letter_u">u</a></div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
Binary file docs/api-2.1/closed.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/dir_68267d1309a1af8e8297ef4c3efbcdba.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">src Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/dir_69f4ea29401808fe6229564976cde3ce.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,125 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">ucx Directory Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:allocator_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="allocator_8h.html">allocator.h</a> <a href="allocator_8h_source.html">[code]</a></td></tr>
+<tr class="memdesc:allocator_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Allocator for custom memory management. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:array_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="array_8h.html">array.h</a> <a href="array_8h_source.html">[code]</a></td></tr>
+<tr class="memdesc:array_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Dynamically allocated array implementation. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:avl_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="avl_8h.html">avl.h</a> <a href="avl_8h_source.html">[code]</a></td></tr>
+<tr class="memdesc:avl_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">AVL tree implementation. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:buffer_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="buffer_8h.html">buffer.h</a> <a href="buffer_8h_source.html">[code]</a></td></tr>
+<tr class="memdesc:buffer_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Advanced buffer implementation. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:list_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html">list.h</a> <a href="list_8h_source.html">[code]</a></td></tr>
+<tr class="memdesc:list_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Doubly linked list implementation. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:logging_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="logging_8h.html">logging.h</a> <a href="logging_8h_source.html">[code]</a></td></tr>
+<tr class="memdesc:logging_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Logging API. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:map_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html">map.h</a> <a href="map_8h_source.html">[code]</a></td></tr>
+<tr class="memdesc:map_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Hash map implementation. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mempool_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mempool_8h.html">mempool.h</a> <a href="mempool_8h_source.html">[code]</a></td></tr>
+<tr class="memdesc:mempool_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Memory pool implementation. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:properties_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="properties_8h.html">properties.h</a> <a href="properties_8h_source.html">[code]</a></td></tr>
+<tr class="memdesc:properties_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Load / store utilities for properties files. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:stack_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stack_8h.html">stack.h</a> <a href="stack_8h_source.html">[code]</a></td></tr>
+<tr class="memdesc:stack_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Default stack memory allocation implementation. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:string_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html">string.h</a> <a href="string_8h_source.html">[code]</a></td></tr>
+<tr class="memdesc:string_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Bounded string implementation. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:test_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="test_8h.html">test.h</a> <a href="test_8h_source.html">[code]</a></td></tr>
+<tr class="memdesc:test_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">UCX Test Framework. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ucx_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ucx_8h.html">ucx.h</a> <a href="ucx_8h_source.html">[code]</a></td></tr>
+<tr class="memdesc:ucx_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Main UCX Header providing most common definitions. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:utils_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html">utils.h</a> <a href="utils_8h_source.html">[code]</a></td></tr>
+<tr class="memdesc:utils_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compare, copy and printf functions. <br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
Binary file docs/api-2.1/doc.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/doxygen.css	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,1596 @@
+/* The standard CSS for doxygen 1.8.13 */
+
+body, table, div, p, dl {
+	font: 400 14px/22px Roboto,sans-serif;
+}
+
+p.reference, p.definition {
+	font: 400 14px/22px Roboto,sans-serif;
+}
+
+/* @group Heading Levels */
+
+h1.groupheader {
+	font-size: 150%;
+}
+
+.title {
+	font: 400 14px/28px Roboto,sans-serif;
+	font-size: 150%;
+	font-weight: bold;
+	margin: 10px 2px;
+}
+
+h2.groupheader {
+	border-bottom: 1px solid #879ECB;
+	color: #354C7B;
+	font-size: 150%;
+	font-weight: normal;
+	margin-top: 1.75em;
+	padding-top: 8px;
+	padding-bottom: 4px;
+	width: 100%;
+}
+
+h3.groupheader {
+	font-size: 100%;
+}
+
+h1, h2, h3, h4, h5, h6 {
+	-webkit-transition: text-shadow 0.5s linear;
+	-moz-transition: text-shadow 0.5s linear;
+	-ms-transition: text-shadow 0.5s linear;
+	-o-transition: text-shadow 0.5s linear;
+	transition: text-shadow 0.5s linear;
+	margin-right: 15px;
+}
+
+h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
+	text-shadow: 0 0 15px cyan;
+}
+
+dt {
+	font-weight: bold;
+}
+
+div.multicol {
+	-moz-column-gap: 1em;
+	-webkit-column-gap: 1em;
+	-moz-column-count: 3;
+	-webkit-column-count: 3;
+}
+
+p.startli, p.startdd {
+	margin-top: 2px;
+}
+
+p.starttd {
+	margin-top: 0px;
+}
+
+p.endli {
+	margin-bottom: 0px;
+}
+
+p.enddd {
+	margin-bottom: 4px;
+}
+
+p.endtd {
+	margin-bottom: 2px;
+}
+
+/* @end */
+
+caption {
+	font-weight: bold;
+}
+
+span.legend {
+        font-size: 70%;
+        text-align: center;
+}
+
+h3.version {
+        font-size: 90%;
+        text-align: center;
+}
+
+div.qindex, div.navtab{
+	background-color: #EBEFF6;
+	border: 1px solid #A3B4D7;
+	text-align: center;
+}
+
+div.qindex, div.navpath {
+	width: 100%;
+	line-height: 140%;
+}
+
+div.navtab {
+	margin-right: 15px;
+}
+
+/* @group Link Styling */
+
+a {
+	color: #3D578C;
+	font-weight: normal;
+	text-decoration: none;
+}
+
+.contents a:visited {
+	color: #4665A2;
+}
+
+a:hover {
+	text-decoration: underline;
+}
+
+a.qindex {
+	font-weight: bold;
+}
+
+a.qindexHL {
+	font-weight: bold;
+	background-color: #9CAFD4;
+	color: #ffffff;
+	border: 1px double #869DCA;
+}
+
+.contents a.qindexHL:visited {
+        color: #ffffff;
+}
+
+a.el {
+	font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code, a.code:visited, a.line, a.line:visited {
+	color: #4665A2; 
+}
+
+a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {
+	color: #4665A2; 
+}
+
+/* @end */
+
+dl.el {
+	margin-left: -1cm;
+}
+
+pre.fragment {
+        border: 1px solid #C4CFE5;
+        background-color: #FBFCFD;
+        padding: 4px 6px;
+        margin: 4px 8px 4px 2px;
+        overflow: auto;
+        word-wrap: break-word;
+        font-size:  9pt;
+        line-height: 125%;
+        font-family: monospace, fixed;
+        font-size: 105%;
+}
+
+div.fragment {
+        padding: 0px;
+        margin: 4px 8px 4px 2px;
+	background-color: #FBFCFD;
+	border: 1px solid #C4CFE5;
+}
+
+div.line {
+	font-family: monospace, fixed;
+        font-size: 13px;
+	min-height: 13px;
+	line-height: 1.0;
+	text-wrap: unrestricted;
+	white-space: -moz-pre-wrap; /* Moz */
+	white-space: -pre-wrap;     /* Opera 4-6 */
+	white-space: -o-pre-wrap;   /* Opera 7 */
+	white-space: pre-wrap;      /* CSS3  */
+	word-wrap: break-word;      /* IE 5.5+ */
+	text-indent: -53px;
+	padding-left: 53px;
+	padding-bottom: 0px;
+	margin: 0px;
+	-webkit-transition-property: background-color, box-shadow;
+	-webkit-transition-duration: 0.5s;
+	-moz-transition-property: background-color, box-shadow;
+	-moz-transition-duration: 0.5s;
+	-ms-transition-property: background-color, box-shadow;
+	-ms-transition-duration: 0.5s;
+	-o-transition-property: background-color, box-shadow;
+	-o-transition-duration: 0.5s;
+	transition-property: background-color, box-shadow;
+	transition-duration: 0.5s;
+}
+
+div.line:after {
+    content:"\000A";
+    white-space: pre;
+}
+
+div.line.glow {
+	background-color: cyan;
+	box-shadow: 0 0 10px cyan;
+}
+
+
+span.lineno {
+	padding-right: 4px;
+	text-align: right;
+	border-right: 2px solid #0F0;
+	background-color: #E8E8E8;
+        white-space: pre;
+}
+span.lineno a {
+	background-color: #D8D8D8;
+}
+
+span.lineno a:hover {
+	background-color: #C8C8C8;
+}
+
+.lineno {
+	-webkit-touch-callout: none;
+	-webkit-user-select: none;
+	-khtml-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	user-select: none;
+}
+
+div.ah, span.ah {
+	background-color: black;
+	font-weight: bold;
+	color: #ffffff;
+	margin-bottom: 3px;
+	margin-top: 3px;
+	padding: 0.2em;
+	border: solid thin #333;
+	border-radius: 0.5em;
+	-webkit-border-radius: .5em;
+	-moz-border-radius: .5em;
+	box-shadow: 2px 2px 3px #999;
+	-webkit-box-shadow: 2px 2px 3px #999;
+	-moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+	background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
+	background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%);
+}
+
+div.classindex ul {
+        list-style: none;
+        padding-left: 0;
+}
+
+div.classindex span.ai {
+        display: inline-block;
+}
+
+div.groupHeader {
+	margin-left: 16px;
+	margin-top: 12px;
+	font-weight: bold;
+}
+
+div.groupText {
+	margin-left: 16px;
+	font-style: italic;
+}
+
+body {
+	background-color: white;
+	color: black;
+        margin: 0;
+}
+
+div.contents {
+	margin-top: 10px;
+	margin-left: 12px;
+	margin-right: 8px;
+}
+
+td.indexkey {
+	background-color: #EBEFF6;
+	font-weight: bold;
+	border: 1px solid #C4CFE5;
+	margin: 2px 0px 2px 0;
+	padding: 2px 10px;
+        white-space: nowrap;
+        vertical-align: top;
+}
+
+td.indexvalue {
+	background-color: #EBEFF6;
+	border: 1px solid #C4CFE5;
+	padding: 2px 10px;
+	margin: 2px 0px;
+}
+
+tr.memlist {
+	background-color: #EEF1F7;
+}
+
+p.formulaDsp {
+	text-align: center;
+}
+
+img.formulaDsp {
+	
+}
+
+img.formulaInl {
+	vertical-align: middle;
+}
+
+div.center {
+	text-align: center;
+        margin-top: 0px;
+        margin-bottom: 0px;
+        padding: 0px;
+}
+
+div.center img {
+	border: 0px;
+}
+
+address.footer {
+	text-align: right;
+	padding-right: 12px;
+}
+
+img.footer {
+	border: 0px;
+	vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+	color: #008000
+}
+
+span.keywordtype {
+	color: #604020
+}
+
+span.keywordflow {
+	color: #e08000
+}
+
+span.comment {
+	color: #800000
+}
+
+span.preprocessor {
+	color: #806020
+}
+
+span.stringliteral {
+	color: #002080
+}
+
+span.charliteral {
+	color: #008080
+}
+
+span.vhdldigit { 
+	color: #ff00ff 
+}
+
+span.vhdlchar { 
+	color: #000000 
+}
+
+span.vhdlkeyword { 
+	color: #700070 
+}
+
+span.vhdllogic { 
+	color: #ff0000 
+}
+
+blockquote {
+        background-color: #F7F8FB;
+        border-left: 2px solid #9CAFD4;
+        margin: 0 24px 0 4px;
+        padding: 0 12px 0 16px;
+}
+
+/* @end */
+
+/*
+.search {
+	color: #003399;
+	font-weight: bold;
+}
+
+form.search {
+	margin-bottom: 0px;
+	margin-top: 0px;
+}
+
+input.search {
+	font-size: 75%;
+	color: #000080;
+	font-weight: normal;
+	background-color: #e8eef2;
+}
+*/
+
+td.tiny {
+	font-size: 75%;
+}
+
+.dirtab {
+	padding: 4px;
+	border-collapse: collapse;
+	border: 1px solid #A3B4D7;
+}
+
+th.dirtab {
+	background: #EBEFF6;
+	font-weight: bold;
+}
+
+hr {
+	height: 0px;
+	border: none;
+	border-top: 1px solid #4A6AAA;
+}
+
+hr.footer {
+	height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+	border-spacing: 0px;
+	padding: 0px;
+}
+
+.memberdecls td, .fieldtable tr {
+	-webkit-transition-property: background-color, box-shadow;
+	-webkit-transition-duration: 0.5s;
+	-moz-transition-property: background-color, box-shadow;
+	-moz-transition-duration: 0.5s;
+	-ms-transition-property: background-color, box-shadow;
+	-ms-transition-duration: 0.5s;
+	-o-transition-property: background-color, box-shadow;
+	-o-transition-duration: 0.5s;
+	transition-property: background-color, box-shadow;
+	transition-duration: 0.5s;
+}
+
+.memberdecls td.glow, .fieldtable tr.glow {
+	background-color: cyan;
+	box-shadow: 0 0 15px cyan;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+	background-color: #F9FAFC;
+	border: none;
+	margin: 4px;
+	padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+	padding: 0px 8px 4px 8px;
+	color: #555;
+}
+
+.memSeparator {
+        border-bottom: 1px solid #DEE4F0;
+        line-height: 1px;
+        margin: 0px;
+        padding: 0px;
+}
+
+.memItemLeft, .memTemplItemLeft {
+        white-space: nowrap;
+}
+
+.memItemRight {
+	width: 100%;
+}
+
+.memTemplParams {
+	color: #4665A2;
+        white-space: nowrap;
+	font-size: 80%;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtitle {
+	padding: 8px;
+	border-top: 1px solid #A8B8D9;
+	border-left: 1px solid #A8B8D9;
+	border-right: 1px solid #A8B8D9;
+	border-top-right-radius: 4px;
+	border-top-left-radius: 4px;
+	margin-bottom: -1px;
+	background-image: url('nav_f.png');
+	background-repeat: repeat-x;
+	background-color: #E2E8F2;
+	line-height: 1.25;
+	font-weight: 300;
+	float:left;
+}
+
+.permalink
+{
+        font-size: 65%;
+        display: inline-block;
+        vertical-align: middle;
+}
+
+.memtemplate {
+	font-size: 80%;
+	color: #4665A2;
+	font-weight: normal;
+	margin-left: 9px;
+}
+
+.memnav {
+	background-color: #EBEFF6;
+	border: 1px solid #A3B4D7;
+	text-align: center;
+	margin: 2px;
+	margin-right: 15px;
+	padding: 2px;
+}
+
+.mempage {
+	width: 100%;
+}
+
+.memitem {
+	padding: 0;
+	margin-bottom: 10px;
+	margin-right: 5px;
+        -webkit-transition: box-shadow 0.5s linear;
+        -moz-transition: box-shadow 0.5s linear;
+        -ms-transition: box-shadow 0.5s linear;
+        -o-transition: box-shadow 0.5s linear;
+        transition: box-shadow 0.5s linear;
+        display: table !important;
+        width: 100%;
+}
+
+.memitem.glow {
+         box-shadow: 0 0 15px cyan;
+}
+
+.memname {
+        font-weight: 400;
+        margin-left: 6px;
+}
+
+.memname td {
+	vertical-align: bottom;
+}
+
+.memproto, dl.reflist dt {
+        border-top: 1px solid #A8B8D9;
+        border-left: 1px solid #A8B8D9;
+        border-right: 1px solid #A8B8D9;
+        padding: 6px 0px 6px 0px;
+        color: #253555;
+        font-weight: bold;
+        text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+        background-color: #DFE5F1;
+        /* opera specific markup */
+        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        border-top-right-radius: 4px;
+        /* firefox specific markup */
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+        -moz-border-radius-topright: 4px;
+        /* webkit specific markup */
+        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        -webkit-border-top-right-radius: 4px;
+
+}
+
+.overload {
+        font-family: "courier new",courier,monospace;
+	font-size: 65%;
+}
+
+.memdoc, dl.reflist dd {
+        border-bottom: 1px solid #A8B8D9;      
+        border-left: 1px solid #A8B8D9;      
+        border-right: 1px solid #A8B8D9; 
+        padding: 6px 10px 2px 10px;
+        background-color: #FBFCFD;
+        border-top-width: 0;
+        background-image:url('nav_g.png');
+        background-repeat:repeat-x;
+        background-color: #FFFFFF;
+        /* opera specific markup */
+        border-bottom-left-radius: 4px;
+        border-bottom-right-radius: 4px;
+        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        /* firefox specific markup */
+        -moz-border-radius-bottomleft: 4px;
+        -moz-border-radius-bottomright: 4px;
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+        /* webkit specific markup */
+        -webkit-border-bottom-left-radius: 4px;
+        -webkit-border-bottom-right-radius: 4px;
+        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+dl.reflist dt {
+        padding: 5px;
+}
+
+dl.reflist dd {
+        margin: 0px 0px 10px 0px;
+        padding: 5px;
+}
+
+.paramkey {
+	text-align: right;
+}
+
+.paramtype {
+	white-space: nowrap;
+}
+
+.paramname {
+	color: #602020;
+	white-space: nowrap;
+}
+.paramname em {
+	font-style: normal;
+}
+.paramname code {
+        line-height: 14px;
+}
+
+.params, .retval, .exception, .tparams {
+        margin-left: 0px;
+        padding-left: 0px;
+}       
+
+.params .paramname, .retval .paramname {
+        font-weight: bold;
+        vertical-align: top;
+}
+        
+.params .paramtype {
+        font-style: italic;
+        vertical-align: top;
+}       
+        
+.params .paramdir {
+        font-family: "courier new",courier,monospace;
+        vertical-align: top;
+}
+
+table.mlabels {
+	border-spacing: 0px;
+}
+
+td.mlabels-left {
+	width: 100%;
+	padding: 0px;
+}
+
+td.mlabels-right {
+	vertical-align: bottom;
+	padding: 0px;
+	white-space: nowrap;
+}
+
+span.mlabels {
+        margin-left: 8px;
+}
+
+span.mlabel {
+        background-color: #728DC1;
+        border-top:1px solid #5373B4;
+        border-left:1px solid #5373B4;
+        border-right:1px solid #C4CFE5;
+        border-bottom:1px solid #C4CFE5;
+	text-shadow: none;
+	color: white;
+	margin-right: 4px;
+	padding: 2px 3px;
+	border-radius: 3px;
+	font-size: 7pt;
+	white-space: nowrap;
+	vertical-align: middle;
+}
+
+
+
+/* @end */
+
+/* these are for tree view inside a (index) page */
+
+div.directory {
+        margin: 10px 0px;
+        border-top: 1px solid #9CAFD4;
+        border-bottom: 1px solid #9CAFD4;
+        width: 100%;
+}
+
+.directory table {
+        border-collapse:collapse;
+}
+
+.directory td {
+        margin: 0px;
+        padding: 0px;
+	vertical-align: top;
+}
+
+.directory td.entry {
+        white-space: nowrap;
+        padding-right: 6px;
+	padding-top: 3px;
+}
+
+.directory td.entry a {
+        outline:none;
+}
+
+.directory td.entry a img {
+        border: none;
+}
+
+.directory td.desc {
+        width: 100%;
+        padding-left: 6px;
+	padding-right: 6px;
+	padding-top: 3px;
+	border-left: 1px solid rgba(0,0,0,0.05);
+}
+
+.directory tr.even {
+	padding-left: 6px;
+	background-color: #F7F8FB;
+}
+
+.directory img {
+	vertical-align: -30%;
+}
+
+.directory .levels {
+        white-space: nowrap;
+        width: 100%;
+        text-align: right;
+        font-size: 9pt;
+}
+
+.directory .levels span {
+        cursor: pointer;
+        padding-left: 2px;
+        padding-right: 2px;
+	color: #3D578C;
+}
+
+.arrow {
+    color: #9CAFD4;
+    -webkit-user-select: none;
+    -khtml-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+    cursor: pointer;
+    font-size: 80%;
+    display: inline-block;
+    width: 16px;
+    height: 22px;
+}
+
+.icon {
+    font-family: Arial, Helvetica;
+    font-weight: bold;
+    font-size: 12px;
+    height: 14px;
+    width: 16px;
+    display: inline-block;
+    background-color: #728DC1;
+    color: white;
+    text-align: center;
+    border-radius: 4px;
+    margin-left: 2px;
+    margin-right: 2px;
+}
+
+.icona {
+    width: 24px;
+    height: 22px;
+    display: inline-block;
+}
+
+.iconfopen {
+    width: 24px;
+    height: 18px;
+    margin-bottom: 4px;
+    background-image:url('folderopen.png');
+    background-position: 0px -4px;
+    background-repeat: repeat-y;
+    vertical-align:top;
+    display: inline-block;
+}
+
+.iconfclosed {
+    width: 24px;
+    height: 18px;
+    margin-bottom: 4px;
+    background-image:url('folderclosed.png');
+    background-position: 0px -4px;
+    background-repeat: repeat-y;
+    vertical-align:top;
+    display: inline-block;
+}
+
+.icondoc {
+    width: 24px;
+    height: 18px;
+    margin-bottom: 4px;
+    background-image:url('doc.png');
+    background-position: 0px -4px;
+    background-repeat: repeat-y;
+    vertical-align:top;
+    display: inline-block;
+}
+
+table.directory {
+    font: 400 14px Roboto,sans-serif;
+}
+
+/* @end */
+
+div.dynheader {
+        margin-top: 8px;
+	-webkit-touch-callout: none;
+	-webkit-user-select: none;
+	-khtml-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	user-select: none;
+}
+
+address {
+	font-style: normal;
+	color: #2A3D61;
+}
+
+table.doxtable caption {
+	caption-side: top;
+}
+
+table.doxtable {
+	border-collapse:collapse;
+        margin-top: 4px;
+        margin-bottom: 4px;
+}
+
+table.doxtable td, table.doxtable th {
+	border: 1px solid #2D4068;
+	padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+	background-color: #374F7F;
+	color: #FFFFFF;
+	font-size: 110%;
+	padding-bottom: 4px;
+	padding-top: 5px;
+}
+
+table.fieldtable {
+        /*width: 100%;*/
+        margin-bottom: 10px;
+        border: 1px solid #A8B8D9;
+        border-spacing: 0px;
+        -moz-border-radius: 4px;
+        -webkit-border-radius: 4px;
+        border-radius: 4px;
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+        -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+        box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+}
+
+.fieldtable td, .fieldtable th {
+        padding: 3px 7px 2px;
+}
+
+.fieldtable td.fieldtype, .fieldtable td.fieldname {
+        white-space: nowrap;
+        border-right: 1px solid #A8B8D9;
+        border-bottom: 1px solid #A8B8D9;
+        vertical-align: top;
+}
+
+.fieldtable td.fieldname {
+        padding-top: 3px;
+}
+
+.fieldtable td.fielddoc {
+        border-bottom: 1px solid #A8B8D9;
+        /*width: 100%;*/
+}
+
+.fieldtable td.fielddoc p:first-child {
+        margin-top: 0px;
+}       
+        
+.fieldtable td.fielddoc p:last-child {
+        margin-bottom: 2px;
+}
+
+.fieldtable tr:last-child td {
+        border-bottom: none;
+}
+
+.fieldtable th {
+        background-image:url('nav_f.png');
+        background-repeat:repeat-x;
+        background-color: #E2E8F2;
+        font-size: 90%;
+        color: #253555;
+        padding-bottom: 4px;
+        padding-top: 5px;
+        text-align:left;
+        font-weight: 400;
+        -moz-border-radius-topleft: 4px;
+        -moz-border-radius-topright: 4px;
+        -webkit-border-top-left-radius: 4px;
+        -webkit-border-top-right-radius: 4px;
+        border-top-left-radius: 4px;
+        border-top-right-radius: 4px;
+        border-bottom: 1px solid #A8B8D9;
+}
+
+
+.tabsearch {
+	top: 0px;
+	left: 10px;
+	height: 36px;
+	background-image: url('tab_b.png');
+	z-index: 101;
+	overflow: hidden;
+	font-size: 13px;
+}
+
+.navpath ul
+{
+	font-size: 11px;
+	background-image:url('tab_b.png');
+	background-repeat:repeat-x;
+	background-position: 0 -5px;
+	height:30px;
+	line-height:30px;
+	color:#8AA0CC;
+	border:solid 1px #C2CDE4;
+	overflow:hidden;
+	margin:0px;
+	padding:0px;
+}
+
+.navpath li
+{
+	list-style-type:none;
+	float:left;
+	padding-left:10px;
+	padding-right:15px;
+	background-image:url('bc_s.png');
+	background-repeat:no-repeat;
+	background-position:right;
+	color:#364D7C;
+}
+
+.navpath li.navelem a
+{
+	height:32px;
+	display:block;
+	text-decoration: none;
+	outline: none;
+	color: #283A5D;
+	font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+	text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+	text-decoration: none;        
+}
+
+.navpath li.navelem a:hover
+{
+	color:#6884BD;
+}
+
+.navpath li.footer
+{
+        list-style-type:none;
+        float:right;
+        padding-left:10px;
+        padding-right:15px;
+        background-image:none;
+        background-repeat:no-repeat;
+        background-position:right;
+        color:#364D7C;
+        font-size: 8pt;
+}
+
+
+div.summary
+{
+	float: right;
+	font-size: 8pt;
+	padding-right: 5px;
+	width: 50%;
+	text-align: right;
+}       
+
+div.summary a
+{
+	white-space: nowrap;
+}
+
+table.classindex
+{
+        margin: 10px;
+        white-space: nowrap;
+        margin-left: 3%;
+        margin-right: 3%;
+        width: 94%;
+        border: 0;
+        border-spacing: 0; 
+        padding: 0;
+}
+
+div.ingroups
+{
+	font-size: 8pt;
+	width: 50%;
+	text-align: left;
+}
+
+div.ingroups a
+{
+	white-space: nowrap;
+}
+
+div.header
+{
+        background-image:url('nav_h.png');
+        background-repeat:repeat-x;
+	background-color: #F9FAFC;
+	margin:  0px;
+	border-bottom: 1px solid #C4CFE5;
+}
+
+div.headertitle
+{
+	padding: 5px 5px 5px 10px;
+}
+
+dl
+{
+        padding: 0 0 0 10px;
+}
+
+/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */
+dl.section
+{
+	margin-left: 0px;
+	padding-left: 0px;
+}
+
+dl.note
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #D0C000;
+}
+
+dl.warning, dl.attention
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #FF0000;
+}
+
+dl.pre, dl.post, dl.invariant
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #00D000;
+}
+
+dl.deprecated
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #505050;
+}
+
+dl.todo
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #00C0E0;
+}
+
+dl.test
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #3030E0;
+}
+
+dl.bug
+{
+        margin-left:-7px;
+        padding-left: 3px;
+        border-left:4px solid;
+        border-color: #C08050;
+}
+
+dl.section dd {
+	margin-bottom: 6px;
+}
+
+
+#projectlogo
+{
+	text-align: center;
+	vertical-align: bottom;
+	border-collapse: separate;
+}
+ 
+#projectlogo img
+{ 
+	border: 0px none;
+}
+ 
+#projectalign
+{
+        vertical-align: middle;
+}
+
+#projectname
+{
+	font: 300% Tahoma, Arial,sans-serif;
+	margin: 0px;
+	padding: 2px 0px;
+}
+    
+#projectbrief
+{
+	font: 120% Tahoma, Arial,sans-serif;
+	margin: 0px;
+	padding: 0px;
+}
+
+#projectnumber
+{
+	font: 50% Tahoma, Arial,sans-serif;
+	margin: 0px;
+	padding: 0px;
+}
+
+#titlearea
+{
+	padding: 0px;
+	margin: 0px;
+	width: 100%;
+	border-bottom: 1px solid #5373B4;
+}
+
+.image
+{
+        text-align: center;
+}
+
+.dotgraph
+{
+        text-align: center;
+}
+
+.mscgraph
+{
+        text-align: center;
+}
+
+.plantumlgraph
+{
+        text-align: center;
+}
+
+.diagraph
+{
+        text-align: center;
+}
+
+.caption
+{
+	font-weight: bold;
+}
+
+div.zoom
+{
+	border: 1px solid #90A5CE;
+}
+
+dl.citelist {
+        margin-bottom:50px;
+}
+
+dl.citelist dt {
+        color:#334975;
+        float:left;
+        font-weight:bold;
+        margin-right:10px;
+        padding:5px;
+}
+
+dl.citelist dd {
+        margin:2px 0;
+        padding:5px 0;
+}
+
+div.toc {
+        padding: 14px 25px;
+        background-color: #F4F6FA;
+        border: 1px solid #D8DFEE;
+        border-radius: 7px 7px 7px 7px;
+        float: right;
+        height: auto;
+        margin: 0 8px 10px 10px;
+        width: 200px;
+}
+
+div.toc li {
+        background: url("bdwn.png") no-repeat scroll 0 5px transparent;
+        font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;
+        margin-top: 5px;
+        padding-left: 10px;
+        padding-top: 2px;
+}
+
+div.toc h3 {
+        font: bold 12px/1.2 Arial,FreeSans,sans-serif;
+	color: #4665A2;
+        border-bottom: 0 none;
+        margin: 0;
+}
+
+div.toc ul {
+        list-style: none outside none;
+        border: medium none;
+        padding: 0px;
+}       
+
+div.toc li.level1 {
+        margin-left: 0px;
+}
+
+div.toc li.level2 {
+        margin-left: 15px;
+}
+
+div.toc li.level3 {
+        margin-left: 30px;
+}
+
+div.toc li.level4 {
+        margin-left: 45px;
+}
+
+.inherit_header {
+        font-weight: bold;
+        color: gray;
+        cursor: pointer;
+	-webkit-touch-callout: none;
+	-webkit-user-select: none;
+	-khtml-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	user-select: none;
+}
+
+.inherit_header td {
+        padding: 6px 0px 2px 5px;
+}
+
+.inherit {
+        display: none;
+}
+
+tr.heading h2 {
+        margin-top: 12px;
+        margin-bottom: 4px;
+}
+
+/* tooltip related style info */
+
+.ttc {
+        position: absolute;
+        display: none;
+}
+
+#powerTip {
+	cursor: default;
+	white-space: nowrap;
+	background-color: white;
+	border: 1px solid gray;
+	border-radius: 4px 4px 4px 4px;
+	box-shadow: 1px 1px 7px gray;
+	display: none;
+	font-size: smaller;
+	max-width: 80%;
+	opacity: 0.9;
+	padding: 1ex 1em 1em;
+	position: absolute;
+	z-index: 2147483647;
+}
+
+#powerTip div.ttdoc {
+        color: grey;
+	font-style: italic;
+}
+
+#powerTip div.ttname a {
+        font-weight: bold;
+}
+
+#powerTip div.ttname {
+        font-weight: bold;
+}
+
+#powerTip div.ttdeci {
+        color: #006318;
+}
+
+#powerTip div {
+        margin: 0px;
+        padding: 0px;
+        font: 12px/16px Roboto,sans-serif;
+}
+
+#powerTip:before, #powerTip:after {
+	content: "";
+	position: absolute;
+	margin: 0px;
+}
+
+#powerTip.n:after,  #powerTip.n:before,
+#powerTip.s:after,  #powerTip.s:before,
+#powerTip.w:after,  #powerTip.w:before,
+#powerTip.e:after,  #powerTip.e:before,
+#powerTip.ne:after, #powerTip.ne:before,
+#powerTip.se:after, #powerTip.se:before,
+#powerTip.nw:after, #powerTip.nw:before,
+#powerTip.sw:after, #powerTip.sw:before {
+	border: solid transparent;
+	content: " ";
+	height: 0;
+	width: 0;
+	position: absolute;
+}
+
+#powerTip.n:after,  #powerTip.s:after,
+#powerTip.w:after,  #powerTip.e:after,
+#powerTip.nw:after, #powerTip.ne:after,
+#powerTip.sw:after, #powerTip.se:after {
+	border-color: rgba(255, 255, 255, 0);
+}
+
+#powerTip.n:before,  #powerTip.s:before,
+#powerTip.w:before,  #powerTip.e:before,
+#powerTip.nw:before, #powerTip.ne:before,
+#powerTip.sw:before, #powerTip.se:before {
+	border-color: rgba(128, 128, 128, 0);
+}
+
+#powerTip.n:after,  #powerTip.n:before,
+#powerTip.ne:after, #powerTip.ne:before,
+#powerTip.nw:after, #powerTip.nw:before {
+	top: 100%;
+}
+
+#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after {
+	border-top-color: #ffffff;
+	border-width: 10px;
+	margin: 0px -10px;
+}
+#powerTip.n:before {
+	border-top-color: #808080;
+	border-width: 11px;
+	margin: 0px -11px;
+}
+#powerTip.n:after, #powerTip.n:before {
+	left: 50%;
+}
+
+#powerTip.nw:after, #powerTip.nw:before {
+	right: 14px;
+}
+
+#powerTip.ne:after, #powerTip.ne:before {
+	left: 14px;
+}
+
+#powerTip.s:after,  #powerTip.s:before,
+#powerTip.se:after, #powerTip.se:before,
+#powerTip.sw:after, #powerTip.sw:before {
+	bottom: 100%;
+}
+
+#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after {
+	border-bottom-color: #ffffff;
+	border-width: 10px;
+	margin: 0px -10px;
+}
+
+#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before {
+	border-bottom-color: #808080;
+	border-width: 11px;
+	margin: 0px -11px;
+}
+
+#powerTip.s:after, #powerTip.s:before {
+	left: 50%;
+}
+
+#powerTip.sw:after, #powerTip.sw:before {
+	right: 14px;
+}
+
+#powerTip.se:after, #powerTip.se:before {
+	left: 14px;
+}
+
+#powerTip.e:after, #powerTip.e:before {
+	left: 100%;
+}
+#powerTip.e:after {
+	border-left-color: #ffffff;
+	border-width: 10px;
+	top: 50%;
+	margin-top: -10px;
+}
+#powerTip.e:before {
+	border-left-color: #808080;
+	border-width: 11px;
+	top: 50%;
+	margin-top: -11px;
+}
+
+#powerTip.w:after, #powerTip.w:before {
+	right: 100%;
+}
+#powerTip.w:after {
+	border-right-color: #ffffff;
+	border-width: 10px;
+	top: 50%;
+	margin-top: -10px;
+}
+#powerTip.w:before {
+	border-right-color: #808080;
+	border-width: 11px;
+	top: 50%;
+	margin-top: -11px;
+}
+
+@media print
+{
+  #top { display: none; }
+  #side-nav { display: none; }
+  #nav-path { display: none; }
+  body { overflow:visible; }
+  h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
+  .summary { display: none; }
+  .memitem { page-break-inside: avoid; }
+  #doc-content
+  {
+    margin-left:0 !important;
+    height:auto !important;
+    width:auto !important;
+    overflow:inherit;
+    display:inline;
+  }
+}
+
+/* @group Markdown */
+
+/*
+table.markdownTable {
+	border-collapse:collapse;
+        margin-top: 4px;
+        margin-bottom: 4px;
+}
+
+table.markdownTable td, table.markdownTable th {
+	border: 1px solid #2D4068;
+	padding: 3px 7px 2px;
+}
+
+table.markdownTableHead tr {
+}
+
+table.markdownTableBodyLeft td, table.markdownTable th {
+	border: 1px solid #2D4068;
+	padding: 3px 7px 2px;
+}
+
+th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone {
+	background-color: #374F7F;
+	color: #FFFFFF;
+	font-size: 110%;
+	padding-bottom: 4px;
+	padding-top: 5px;
+}
+
+th.markdownTableHeadLeft {
+	text-align: left
+}
+
+th.markdownTableHeadRight {
+	text-align: right
+}
+
+th.markdownTableHeadCenter {
+	text-align: center
+}
+*/
+
+table.markdownTable {
+	border-collapse:collapse;
+        margin-top: 4px;
+        margin-bottom: 4px;
+}
+
+table.markdownTable td, table.markdownTable th {
+	border: 1px solid #2D4068;
+	padding: 3px 7px 2px;
+}
+
+table.markdownTable tr {
+}
+
+th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone {
+	background-color: #374F7F;
+	color: #FFFFFF;
+	font-size: 110%;
+	padding-bottom: 4px;
+	padding-top: 5px;
+}
+
+th.markdownTableHeadLeft, td.markdownTableBodyLeft {
+	text-align: left
+}
+
+th.markdownTableHeadRight, td.markdownTableBodyRight {
+	text-align: right
+}
+
+th.markdownTableHeadCenter, td.markdownTableBodyCenter {
+	text-align: center
+}
+
+
+/* @end */
Binary file docs/api-2.1/doxygen.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/dynsections.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,97 @@
+function toggleVisibility(linkObj)
+{
+ var base = $(linkObj).attr('id');
+ var summary = $('#'+base+'-summary');
+ var content = $('#'+base+'-content');
+ var trigger = $('#'+base+'-trigger');
+ var src=$(trigger).attr('src');
+ if (content.is(':visible')===true) {
+   content.hide();
+   summary.show();
+   $(linkObj).addClass('closed').removeClass('opened');
+   $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
+ } else {
+   content.show();
+   summary.hide();
+   $(linkObj).removeClass('closed').addClass('opened');
+   $(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
+ } 
+ return false;
+}
+
+function updateStripes()
+{
+  $('table.directory tr').
+       removeClass('even').filter(':visible:even').addClass('even');
+}
+
+function toggleLevel(level)
+{
+  $('table.directory tr').each(function() {
+    var l = this.id.split('_').length-1;
+    var i = $('#img'+this.id.substring(3));
+    var a = $('#arr'+this.id.substring(3));
+    if (l<level+1) {
+      i.removeClass('iconfopen iconfclosed').addClass('iconfopen');
+      a.html('&#9660;');
+      $(this).show();
+    } else if (l==level+1) {
+      i.removeClass('iconfclosed iconfopen').addClass('iconfclosed');
+      a.html('&#9658;');
+      $(this).show();
+    } else {
+      $(this).hide();
+    }
+  });
+  updateStripes();
+}
+
+function toggleFolder(id)
+{
+  // the clicked row
+  var currentRow = $('#row_'+id);
+
+  // all rows after the clicked row
+  var rows = currentRow.nextAll("tr");
+
+  var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
+
+  // only match elements AFTER this one (can't hide elements before)
+  var childRows = rows.filter(function() { return this.id.match(re); });
+
+  // first row is visible we are HIDING
+  if (childRows.filter(':first').is(':visible')===true) {
+    // replace down arrow by right arrow for current row
+    var currentRowSpans = currentRow.find("span");
+    currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
+    currentRowSpans.filter(".arrow").html('&#9658;');
+    rows.filter("[id^=row_"+id+"]").hide(); // hide all children
+  } else { // we are SHOWING
+    // replace right arrow by down arrow for current row
+    var currentRowSpans = currentRow.find("span");
+    currentRowSpans.filter(".iconfclosed").removeClass("iconfclosed").addClass("iconfopen");
+    currentRowSpans.filter(".arrow").html('&#9660;');
+    // replace down arrows by right arrows for child rows
+    var childRowsSpans = childRows.find("span");
+    childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
+    childRowsSpans.filter(".arrow").html('&#9658;');
+    childRows.show(); //show all children
+  }
+  updateStripes();
+}
+
+
+function toggleInherit(id)
+{
+  var rows = $('tr.inherit.'+id);
+  var img = $('tr.inherit_header.'+id+' img');
+  var src = $(img).attr('src');
+  if (rows.filter(':first').is(':visible')===true) {
+    rows.css('display','none');
+    $(img).attr('src',src.substring(0,src.length-8)+'closed.png');
+  } else {
+    rows.css('display','table-row'); // using show() causes jump in firefox
+    $(img).attr('src',src.substring(0,src.length-10)+'open.png');
+  }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/files.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,95 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: File List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">File List</div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all documented files with brief descriptions:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span><span onclick="javascript:toggleLevel(3);">3</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_0_" class="arrow" onclick="toggleFolder('0_')">&#9660;</span><span id="img_0_" class="iconfopen" onclick="toggleFolder('0_')">&#160;</span><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html" target="_self">src</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_0_" class="arrow" onclick="toggleFolder('0_0_')">&#9660;</span><span id="img_0_0_" class="iconfopen" onclick="toggleFolder('0_0_')">&#160;</span><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html" target="_self">ucx</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="allocator_8h_source.html"><span class="icondoc"></span></a><a class="el" href="allocator_8h.html" target="_self">allocator.h</a></td><td class="desc">Allocator for custom memory management </td></tr>
+<tr id="row_0_0_1_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="array_8h_source.html"><span class="icondoc"></span></a><a class="el" href="array_8h.html" target="_self">array.h</a></td><td class="desc">Dynamically allocated array implementation </td></tr>
+<tr id="row_0_0_2_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="avl_8h_source.html"><span class="icondoc"></span></a><a class="el" href="avl_8h.html" target="_self">avl.h</a></td><td class="desc">AVL tree implementation </td></tr>
+<tr id="row_0_0_3_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="buffer_8h_source.html"><span class="icondoc"></span></a><a class="el" href="buffer_8h.html" target="_self">buffer.h</a></td><td class="desc">Advanced buffer implementation </td></tr>
+<tr id="row_0_0_4_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="list_8h_source.html"><span class="icondoc"></span></a><a class="el" href="list_8h.html" target="_self">list.h</a></td><td class="desc">Doubly linked list implementation </td></tr>
+<tr id="row_0_0_5_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="logging_8h_source.html"><span class="icondoc"></span></a><a class="el" href="logging_8h.html" target="_self">logging.h</a></td><td class="desc">Logging API </td></tr>
+<tr id="row_0_0_6_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="map_8h_source.html"><span class="icondoc"></span></a><a class="el" href="map_8h.html" target="_self">map.h</a></td><td class="desc">Hash map implementation </td></tr>
+<tr id="row_0_0_7_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="mempool_8h_source.html"><span class="icondoc"></span></a><a class="el" href="mempool_8h.html" target="_self">mempool.h</a></td><td class="desc">Memory pool implementation </td></tr>
+<tr id="row_0_0_8_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="properties_8h_source.html"><span class="icondoc"></span></a><a class="el" href="properties_8h.html" target="_self">properties.h</a></td><td class="desc">Load / store utilities for properties files </td></tr>
+<tr id="row_0_0_9_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="stack_8h_source.html"><span class="icondoc"></span></a><a class="el" href="stack_8h.html" target="_self">stack.h</a></td><td class="desc">Default stack memory allocation implementation </td></tr>
+<tr id="row_0_0_10_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="string_8h_source.html"><span class="icondoc"></span></a><a class="el" href="string_8h.html" target="_self">string.h</a></td><td class="desc">Bounded string implementation </td></tr>
+<tr id="row_0_0_11_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="test_8h_source.html"><span class="icondoc"></span></a><a class="el" href="test_8h.html" target="_self">test.h</a></td><td class="desc">UCX Test Framework </td></tr>
+<tr id="row_0_0_12_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="ucx_8h_source.html"><span class="icondoc"></span></a><a class="el" href="ucx_8h.html" target="_self">ucx.h</a></td><td class="desc">Main UCX Header providing most common definitions </td></tr>
+<tr id="row_0_0_13_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="utils_8h_source.html"><span class="icondoc"></span></a><a class="el" href="utils_8h.html" target="_self">utils.h</a></td><td class="desc">Compare, copy and printf functions </td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
Binary file docs/api-2.1/folderclosed.png has changed
Binary file docs/api-2.1/folderopen.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/functions.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,343 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div>
+
+<h3><a id="index_a"></a>- a -</h3><ul>
+<li>allocator
+: <a class="el" href="structUcxArray.html#a2ef31303b7548b9aa8e2b9187e295212">UcxArray</a>
+, <a class="el" href="structUcxAVLTree.html#a30652776b540156ad54c7d52833e4e28">UcxAVLTree</a>
+, <a class="el" href="structUcxMap.html#a531f3e481c1c331cf037b916192e974d">UcxMap</a>
+, <a class="el" href="structUcxMempool.html#ac45fd1e9269399e4c434d6bdaa770d92">UcxMempool</a>
+, <a class="el" href="structUcxStack.html#a33cda4f6890ac56ab31701598bc1ae10">UcxStack</a>
+</li>
+</ul>
+
+
+<h3><a id="index_b"></a>- b -</h3><ul>
+<li>buffer
+: <a class="el" href="structUcxProperties.html#a6bb4d29686df41a0f42641ee15232bfd">UcxProperties</a>
+</li>
+<li>buflen
+: <a class="el" href="structUcxProperties.html#a4e7524434525267e29f493a25dcca6b5">UcxProperties</a>
+</li>
+</ul>
+
+
+<h3><a id="index_c"></a>- c -</h3><ul>
+<li>c
+: <a class="el" href="structucx__memchunk.html#ab86550503e5f019bfa61a1e91f1c40da">ucx_memchunk</a>
+</li>
+<li>calloc
+: <a class="el" href="structUcxAllocator.html#ab94ec1cba45cc4e7d81e1588a11cbb62">UcxAllocator</a>
+</li>
+<li>capacity
+: <a class="el" href="structUcxArray.html#a7ed074887908e45bde7e1fbc67b31c18">UcxArray</a>
+, <a class="el" href="structUcxBuffer.html#a385661894f3cee9c549bfe07a8b316bf">UcxBuffer</a>
+</li>
+<li>cmpfunc
+: <a class="el" href="structUcxAVLTree.html#a87aff25cb726cb9eb88eb815a10d1004">UcxAVLTree</a>
+</li>
+<li>comment1
+: <a class="el" href="structUcxProperties.html#afaa2e6a289fa6949b7b01df35fa5def8">UcxProperties</a>
+</li>
+<li>comment2
+: <a class="el" href="structUcxProperties.html#a9ea7ecb414ca8bc7bef62cdd19cc6363">UcxProperties</a>
+</li>
+<li>comment3
+: <a class="el" href="structUcxProperties.html#a5f3e561e32bac03e36a191a6940cca92">UcxProperties</a>
+</li>
+<li>count
+: <a class="el" href="structUcxMap.html#a14e9163f71f6c014dfa2103de70ae9cd">UcxMap</a>
+</li>
+<li>cur
+: <a class="el" href="structUcxMapIterator.html#af1fc40f899f37280adb5b85acf6e742f">UcxMapIterator</a>
+</li>
+</ul>
+
+
+<h3><a id="index_d"></a>- d -</h3><ul>
+<li>data
+: <a class="el" href="structUcxArray.html#a04d2b03d0a45af1fab19b4216602075a">UcxArray</a>
+, <a class="el" href="structUcxKey.html#a6176109f25b34f3fa92bcfbc8ae7a88c">UcxKey</a>
+, <a class="el" href="structUcxList.html#a4a44905121b6fc2a088084ce578a9ea2">UcxList</a>
+, <a class="el" href="structUcxMapElement.html#abbd7f3bf5beef370f702d2d5bb07733c">UcxMapElement</a>
+, <a class="el" href="structUcxMapKey.html#ab71d1841e4f538628c00f782267fb6d5">UcxMapKey</a>
+, <a class="el" href="structUcxMempool.html#ae98c1b0150bb119ee0a8506a6f310d6e">UcxMempool</a>
+</li>
+<li>dateformat
+: <a class="el" href="structUcxLogger.html#a086f75df0f6c81ec491f25c0a4d9262b">UcxLogger</a>
+</li>
+<li>delimiter
+: <a class="el" href="structUcxProperties.html#af6adb3f69616cf9d2bb5ea7b4d837ca5">UcxProperties</a>
+</li>
+<li>destructor
+: <a class="el" href="structucx__memchunk.html#ac7b5e3fda47b917d6fb2a1d7ea28447b">ucx_memchunk</a>
+, <a class="el" href="structucx__regdestr.html#acea2a3bb66909aa800a931ac8b0cce56">ucx_regdestr</a>
+</li>
+</ul>
+
+
+<h3><a id="index_e"></a>- e -</h3><ul>
+<li>elemsize
+: <a class="el" href="structUcxArray.html#ac4e9ecdf8a8d010644f6e44dfef8190f">UcxArray</a>
+</li>
+<li>error
+: <a class="el" href="structUcxProperties.html#a34f71a6ab6dcb6892e3b4eb802e75bff">UcxProperties</a>
+</li>
+</ul>
+
+
+<h3><a id="index_f"></a>- f -</h3><ul>
+<li>failure
+: <a class="el" href="structUcxTestSuite.html#abfd240541d1e956e49cde0ac36286951">UcxTestSuite</a>
+</li>
+<li>flags
+: <a class="el" href="structUcxBuffer.html#ac642e07b0a03be5aac48eb4aa5bec2f7">UcxBuffer</a>
+</li>
+<li>free
+: <a class="el" href="structUcxAllocator.html#aecce1840378ed53f1002190f4f87026f">UcxAllocator</a>
+</li>
+</ul>
+
+
+<h3><a id="index_h"></a>- h -</h3><ul>
+<li>hash
+: <a class="el" href="structUcxKey.html#aac9d372ac34a4cbd8459e2b04e505752">UcxKey</a>
+, <a class="el" href="structUcxMapKey.html#a34c1f8fec98174583944fffd30e7c913">UcxMapKey</a>
+</li>
+<li>height
+: <a class="el" href="structUcxAVLNode.html#af129fd32863a7c35e82c5cd9d11dc95a">UcxAVLNode</a>
+</li>
+</ul>
+
+
+<h3><a id="index_i"></a>- i -</h3><ul>
+<li>index
+: <a class="el" href="structUcxMapIterator.html#ac2376545c8816dd6895de4995e558c65">UcxMapIterator</a>
+</li>
+</ul>
+
+
+<h3><a id="index_k"></a>- k -</h3><ul>
+<li>key
+: <a class="el" href="structUcxAVLNode.html#ab65a31010d26a3df898e6ba534702af6">UcxAVLNode</a>
+, <a class="el" href="structUcxMapElement.html#aa446141b708e106e2c8de1303318187c">UcxMapElement</a>
+</li>
+</ul>
+
+
+<h3><a id="index_l"></a>- l -</h3><ul>
+<li>left
+: <a class="el" href="structUcxAVLNode.html#ad3a1c733f2c1cc81ac527f846fc24b9c">UcxAVLNode</a>
+</li>
+<li>len
+: <a class="el" href="structUcxKey.html#abef01de37f355688f2ac797d2c280683">UcxKey</a>
+, <a class="el" href="structUcxMapKey.html#a504d46caa45c79cd87ff8cd835654270">UcxMapKey</a>
+</li>
+<li>length
+: <a class="el" href="structscstr__t.html#aaa0229f64f1057b6f65adededaa5a172">scstr_t</a>
+, <a class="el" href="structsstr__t.html#a5cf571708cdff92e45f08458f2b98229">sstr_t</a>
+</li>
+<li>level
+: <a class="el" href="structUcxLogger.html#a2e0ee94c25b2307096c7970280d189cd">UcxLogger</a>
+</li>
+<li>levels
+: <a class="el" href="structUcxLogger.html#a187129f7bc6e5064b3d92a5f1217f396">UcxLogger</a>
+</li>
+</ul>
+
+
+<h3><a id="index_m"></a>- m -</h3><ul>
+<li>malloc
+: <a class="el" href="structUcxAllocator.html#a013376172be39ed54f77c4be6898845a">UcxAllocator</a>
+</li>
+<li>map
+: <a class="el" href="structUcxMap.html#a5792b5037c4f77ea3cb144b66c9b8790">UcxMap</a>
+, <a class="el" href="structUcxMapIterator.html#af88d6e22547d09fe1d665dd650dcdb95">UcxMapIterator</a>
+</li>
+<li>mask
+: <a class="el" href="structUcxLogger.html#a1de0db2e02dcf03366268f6943f8b97c">UcxLogger</a>
+</li>
+</ul>
+
+
+<h3><a id="index_n"></a>- n -</h3><ul>
+<li>ndata
+: <a class="el" href="structUcxMempool.html#aa3a73ab231e1bc207d526f46f1c1e23a">UcxMempool</a>
+</li>
+<li>next
+: <a class="el" href="structUcxList.html#a82a1818f1abf765b026fa91478569a8f">UcxList</a>
+, <a class="el" href="structUcxMapElement.html#a99fe8188b0889201d70ff5f922deef51">UcxMapElement</a>
+, <a class="el" href="structUcxTestList.html#aeebb80ff75d9f6f82ab6dc2641a3c74e">UcxTestList</a>
+</li>
+</ul>
+
+
+<h3><a id="index_p"></a>- p -</h3><ul>
+<li>parent
+: <a class="el" href="structUcxAVLNode.html#afc4e3b4f452aa2d91cabb2135b9d42f7">UcxAVLNode</a>
+</li>
+<li>pool
+: <a class="el" href="structUcxAllocator.html#a1b78012998d1c28be86dc595f8f0aac9">UcxAllocator</a>
+</li>
+<li>pos
+: <a class="el" href="structUcxBuffer.html#a7a64288f002cf62b492e2ea49c79615c">UcxBuffer</a>
+, <a class="el" href="structUcxProperties.html#addd36ac8e5e42241c0a57453633970db">UcxProperties</a>
+</li>
+<li>prev
+: <a class="el" href="structucx__stack__metadata.html#ad46d2e8e5b0acf05f2def41d451c5579">ucx_stack_metadata</a>
+, <a class="el" href="structUcxList.html#a0f1fddce9088b9c1414745d0b1b5c08b">UcxList</a>
+</li>
+<li>ptr
+: <a class="el" href="structscstr__t.html#a305fd48934b474a9bf4a40869030e391">scstr_t</a>
+, <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0">sstr_t</a>
+, <a class="el" href="structucx__regdestr.html#aac0e9ec8df4aab08728b4f8292b5f5e7">ucx_regdestr</a>
+</li>
+</ul>
+
+
+<h3><a id="index_r"></a>- r -</h3><ul>
+<li>realloc
+: <a class="el" href="structUcxAllocator.html#a3550e3847f31d9e9ce3ffcb0d3440c15">UcxAllocator</a>
+</li>
+<li>right
+: <a class="el" href="structUcxAVLNode.html#a7cbaa31dba8c7a89f4f8f7905f6fd238">UcxAVLNode</a>
+</li>
+<li>root
+: <a class="el" href="structUcxAVLTree.html#a393a8fc99eb2c290d3cb67170081d742">UcxAVLTree</a>
+</li>
+</ul>
+
+
+<h3><a id="index_s"></a>- s -</h3><ul>
+<li>size
+: <a class="el" href="structucx__stack__metadata.html#ae2a2848b721cfa44a7e963484c5e4b28">ucx_stack_metadata</a>
+, <a class="el" href="structUcxArray.html#a20c11f2c9048cda80062842b7c094e20">UcxArray</a>
+, <a class="el" href="structUcxBuffer.html#aec0aea8325394951d5ad4a9fbb8e1ac7">UcxBuffer</a>
+, <a class="el" href="structUcxMap.html#afe120846b26d99580a7ff1276464e838">UcxMap</a>
+, <a class="el" href="structUcxMempool.html#a304729986f2894971d0469e71e196bf0">UcxMempool</a>
+, <a class="el" href="structUcxStack.html#a4df86b1917bfc3bbf760220870638143">UcxStack</a>
+</li>
+<li>space
+: <a class="el" href="structUcxBuffer.html#a1a5076e85acb84b715a53bc0f37fb721">UcxBuffer</a>
+, <a class="el" href="structUcxStack.html#af64d528744bf3a47fec87d2e45d2992f">UcxStack</a>
+</li>
+<li>stream
+: <a class="el" href="structUcxLogger.html#a33fddf4791e8d49e479ecc78bf5d1b9e">UcxLogger</a>
+</li>
+<li>success
+: <a class="el" href="structUcxTestSuite.html#a6cefa870a3c2e38d6ee682e38643dbbb">UcxTestSuite</a>
+</li>
+</ul>
+
+
+<h3><a id="index_t"></a>- t -</h3><ul>
+<li>test
+: <a class="el" href="structUcxTestList.html#a6022faa52e772b073141ca0a2f5a56c9">UcxTestList</a>
+</li>
+<li>tests
+: <a class="el" href="structUcxTestSuite.html#a630677a70ebc2c3296704cda3196492b">UcxTestSuite</a>
+</li>
+<li>tmp
+: <a class="el" href="structUcxProperties.html#a68556d4260153f58dde44e4c365edce6">UcxProperties</a>
+</li>
+<li>tmpcap
+: <a class="el" href="structUcxProperties.html#a5af10131ea9f679b4ee174499f92e210">UcxProperties</a>
+</li>
+<li>tmplen
+: <a class="el" href="structUcxProperties.html#a8a81853d5903bee2f4e1fa53fdffae6e">UcxProperties</a>
+</li>
+<li>top
+: <a class="el" href="structUcxStack.html#af0ff6f58edce469f17683013b86ade27">UcxStack</a>
+</li>
+</ul>
+
+
+<h3><a id="index_u"></a>- u -</h3><ul>
+<li>userdata
+: <a class="el" href="structUcxAVLTree.html#ae92a3bfad3fe33c8dcbdad85112f83fd">UcxAVLTree</a>
+</li>
+</ul>
+
+
+<h3><a id="index_v"></a>- v -</h3><ul>
+<li>value
+: <a class="el" href="structUcxAVLNode.html#a302501b8c04c3fde668fe72249871258">UcxAVLNode</a>
+</li>
+</ul>
+
+
+<h3><a id="index_w"></a>- w -</h3><ul>
+<li>writer
+: <a class="el" href="structUcxLogger.html#ada13bba090a9dc4f8d6cd9be73c60930">UcxLogger</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/functions_vars.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,343 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_a"></a>- a -</h3><ul>
+<li>allocator
+: <a class="el" href="structUcxArray.html#a2ef31303b7548b9aa8e2b9187e295212">UcxArray</a>
+, <a class="el" href="structUcxAVLTree.html#a30652776b540156ad54c7d52833e4e28">UcxAVLTree</a>
+, <a class="el" href="structUcxMap.html#a531f3e481c1c331cf037b916192e974d">UcxMap</a>
+, <a class="el" href="structUcxMempool.html#ac45fd1e9269399e4c434d6bdaa770d92">UcxMempool</a>
+, <a class="el" href="structUcxStack.html#a33cda4f6890ac56ab31701598bc1ae10">UcxStack</a>
+</li>
+</ul>
+
+
+<h3><a id="index_b"></a>- b -</h3><ul>
+<li>buffer
+: <a class="el" href="structUcxProperties.html#a6bb4d29686df41a0f42641ee15232bfd">UcxProperties</a>
+</li>
+<li>buflen
+: <a class="el" href="structUcxProperties.html#a4e7524434525267e29f493a25dcca6b5">UcxProperties</a>
+</li>
+</ul>
+
+
+<h3><a id="index_c"></a>- c -</h3><ul>
+<li>c
+: <a class="el" href="structucx__memchunk.html#ab86550503e5f019bfa61a1e91f1c40da">ucx_memchunk</a>
+</li>
+<li>calloc
+: <a class="el" href="structUcxAllocator.html#ab94ec1cba45cc4e7d81e1588a11cbb62">UcxAllocator</a>
+</li>
+<li>capacity
+: <a class="el" href="structUcxArray.html#a7ed074887908e45bde7e1fbc67b31c18">UcxArray</a>
+, <a class="el" href="structUcxBuffer.html#a385661894f3cee9c549bfe07a8b316bf">UcxBuffer</a>
+</li>
+<li>cmpfunc
+: <a class="el" href="structUcxAVLTree.html#a87aff25cb726cb9eb88eb815a10d1004">UcxAVLTree</a>
+</li>
+<li>comment1
+: <a class="el" href="structUcxProperties.html#afaa2e6a289fa6949b7b01df35fa5def8">UcxProperties</a>
+</li>
+<li>comment2
+: <a class="el" href="structUcxProperties.html#a9ea7ecb414ca8bc7bef62cdd19cc6363">UcxProperties</a>
+</li>
+<li>comment3
+: <a class="el" href="structUcxProperties.html#a5f3e561e32bac03e36a191a6940cca92">UcxProperties</a>
+</li>
+<li>count
+: <a class="el" href="structUcxMap.html#a14e9163f71f6c014dfa2103de70ae9cd">UcxMap</a>
+</li>
+<li>cur
+: <a class="el" href="structUcxMapIterator.html#af1fc40f899f37280adb5b85acf6e742f">UcxMapIterator</a>
+</li>
+</ul>
+
+
+<h3><a id="index_d"></a>- d -</h3><ul>
+<li>data
+: <a class="el" href="structUcxArray.html#a04d2b03d0a45af1fab19b4216602075a">UcxArray</a>
+, <a class="el" href="structUcxKey.html#a6176109f25b34f3fa92bcfbc8ae7a88c">UcxKey</a>
+, <a class="el" href="structUcxList.html#a4a44905121b6fc2a088084ce578a9ea2">UcxList</a>
+, <a class="el" href="structUcxMapElement.html#abbd7f3bf5beef370f702d2d5bb07733c">UcxMapElement</a>
+, <a class="el" href="structUcxMapKey.html#ab71d1841e4f538628c00f782267fb6d5">UcxMapKey</a>
+, <a class="el" href="structUcxMempool.html#ae98c1b0150bb119ee0a8506a6f310d6e">UcxMempool</a>
+</li>
+<li>dateformat
+: <a class="el" href="structUcxLogger.html#a086f75df0f6c81ec491f25c0a4d9262b">UcxLogger</a>
+</li>
+<li>delimiter
+: <a class="el" href="structUcxProperties.html#af6adb3f69616cf9d2bb5ea7b4d837ca5">UcxProperties</a>
+</li>
+<li>destructor
+: <a class="el" href="structucx__memchunk.html#ac7b5e3fda47b917d6fb2a1d7ea28447b">ucx_memchunk</a>
+, <a class="el" href="structucx__regdestr.html#acea2a3bb66909aa800a931ac8b0cce56">ucx_regdestr</a>
+</li>
+</ul>
+
+
+<h3><a id="index_e"></a>- e -</h3><ul>
+<li>elemsize
+: <a class="el" href="structUcxArray.html#ac4e9ecdf8a8d010644f6e44dfef8190f">UcxArray</a>
+</li>
+<li>error
+: <a class="el" href="structUcxProperties.html#a34f71a6ab6dcb6892e3b4eb802e75bff">UcxProperties</a>
+</li>
+</ul>
+
+
+<h3><a id="index_f"></a>- f -</h3><ul>
+<li>failure
+: <a class="el" href="structUcxTestSuite.html#abfd240541d1e956e49cde0ac36286951">UcxTestSuite</a>
+</li>
+<li>flags
+: <a class="el" href="structUcxBuffer.html#ac642e07b0a03be5aac48eb4aa5bec2f7">UcxBuffer</a>
+</li>
+<li>free
+: <a class="el" href="structUcxAllocator.html#aecce1840378ed53f1002190f4f87026f">UcxAllocator</a>
+</li>
+</ul>
+
+
+<h3><a id="index_h"></a>- h -</h3><ul>
+<li>hash
+: <a class="el" href="structUcxKey.html#aac9d372ac34a4cbd8459e2b04e505752">UcxKey</a>
+, <a class="el" href="structUcxMapKey.html#a34c1f8fec98174583944fffd30e7c913">UcxMapKey</a>
+</li>
+<li>height
+: <a class="el" href="structUcxAVLNode.html#af129fd32863a7c35e82c5cd9d11dc95a">UcxAVLNode</a>
+</li>
+</ul>
+
+
+<h3><a id="index_i"></a>- i -</h3><ul>
+<li>index
+: <a class="el" href="structUcxMapIterator.html#ac2376545c8816dd6895de4995e558c65">UcxMapIterator</a>
+</li>
+</ul>
+
+
+<h3><a id="index_k"></a>- k -</h3><ul>
+<li>key
+: <a class="el" href="structUcxAVLNode.html#ab65a31010d26a3df898e6ba534702af6">UcxAVLNode</a>
+, <a class="el" href="structUcxMapElement.html#aa446141b708e106e2c8de1303318187c">UcxMapElement</a>
+</li>
+</ul>
+
+
+<h3><a id="index_l"></a>- l -</h3><ul>
+<li>left
+: <a class="el" href="structUcxAVLNode.html#ad3a1c733f2c1cc81ac527f846fc24b9c">UcxAVLNode</a>
+</li>
+<li>len
+: <a class="el" href="structUcxKey.html#abef01de37f355688f2ac797d2c280683">UcxKey</a>
+, <a class="el" href="structUcxMapKey.html#a504d46caa45c79cd87ff8cd835654270">UcxMapKey</a>
+</li>
+<li>length
+: <a class="el" href="structscstr__t.html#aaa0229f64f1057b6f65adededaa5a172">scstr_t</a>
+, <a class="el" href="structsstr__t.html#a5cf571708cdff92e45f08458f2b98229">sstr_t</a>
+</li>
+<li>level
+: <a class="el" href="structUcxLogger.html#a2e0ee94c25b2307096c7970280d189cd">UcxLogger</a>
+</li>
+<li>levels
+: <a class="el" href="structUcxLogger.html#a187129f7bc6e5064b3d92a5f1217f396">UcxLogger</a>
+</li>
+</ul>
+
+
+<h3><a id="index_m"></a>- m -</h3><ul>
+<li>malloc
+: <a class="el" href="structUcxAllocator.html#a013376172be39ed54f77c4be6898845a">UcxAllocator</a>
+</li>
+<li>map
+: <a class="el" href="structUcxMap.html#a5792b5037c4f77ea3cb144b66c9b8790">UcxMap</a>
+, <a class="el" href="structUcxMapIterator.html#af88d6e22547d09fe1d665dd650dcdb95">UcxMapIterator</a>
+</li>
+<li>mask
+: <a class="el" href="structUcxLogger.html#a1de0db2e02dcf03366268f6943f8b97c">UcxLogger</a>
+</li>
+</ul>
+
+
+<h3><a id="index_n"></a>- n -</h3><ul>
+<li>ndata
+: <a class="el" href="structUcxMempool.html#aa3a73ab231e1bc207d526f46f1c1e23a">UcxMempool</a>
+</li>
+<li>next
+: <a class="el" href="structUcxList.html#a82a1818f1abf765b026fa91478569a8f">UcxList</a>
+, <a class="el" href="structUcxMapElement.html#a99fe8188b0889201d70ff5f922deef51">UcxMapElement</a>
+, <a class="el" href="structUcxTestList.html#aeebb80ff75d9f6f82ab6dc2641a3c74e">UcxTestList</a>
+</li>
+</ul>
+
+
+<h3><a id="index_p"></a>- p -</h3><ul>
+<li>parent
+: <a class="el" href="structUcxAVLNode.html#afc4e3b4f452aa2d91cabb2135b9d42f7">UcxAVLNode</a>
+</li>
+<li>pool
+: <a class="el" href="structUcxAllocator.html#a1b78012998d1c28be86dc595f8f0aac9">UcxAllocator</a>
+</li>
+<li>pos
+: <a class="el" href="structUcxBuffer.html#a7a64288f002cf62b492e2ea49c79615c">UcxBuffer</a>
+, <a class="el" href="structUcxProperties.html#addd36ac8e5e42241c0a57453633970db">UcxProperties</a>
+</li>
+<li>prev
+: <a class="el" href="structucx__stack__metadata.html#ad46d2e8e5b0acf05f2def41d451c5579">ucx_stack_metadata</a>
+, <a class="el" href="structUcxList.html#a0f1fddce9088b9c1414745d0b1b5c08b">UcxList</a>
+</li>
+<li>ptr
+: <a class="el" href="structscstr__t.html#a305fd48934b474a9bf4a40869030e391">scstr_t</a>
+, <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0">sstr_t</a>
+, <a class="el" href="structucx__regdestr.html#aac0e9ec8df4aab08728b4f8292b5f5e7">ucx_regdestr</a>
+</li>
+</ul>
+
+
+<h3><a id="index_r"></a>- r -</h3><ul>
+<li>realloc
+: <a class="el" href="structUcxAllocator.html#a3550e3847f31d9e9ce3ffcb0d3440c15">UcxAllocator</a>
+</li>
+<li>right
+: <a class="el" href="structUcxAVLNode.html#a7cbaa31dba8c7a89f4f8f7905f6fd238">UcxAVLNode</a>
+</li>
+<li>root
+: <a class="el" href="structUcxAVLTree.html#a393a8fc99eb2c290d3cb67170081d742">UcxAVLTree</a>
+</li>
+</ul>
+
+
+<h3><a id="index_s"></a>- s -</h3><ul>
+<li>size
+: <a class="el" href="structucx__stack__metadata.html#ae2a2848b721cfa44a7e963484c5e4b28">ucx_stack_metadata</a>
+, <a class="el" href="structUcxArray.html#a20c11f2c9048cda80062842b7c094e20">UcxArray</a>
+, <a class="el" href="structUcxBuffer.html#aec0aea8325394951d5ad4a9fbb8e1ac7">UcxBuffer</a>
+, <a class="el" href="structUcxMap.html#afe120846b26d99580a7ff1276464e838">UcxMap</a>
+, <a class="el" href="structUcxMempool.html#a304729986f2894971d0469e71e196bf0">UcxMempool</a>
+, <a class="el" href="structUcxStack.html#a4df86b1917bfc3bbf760220870638143">UcxStack</a>
+</li>
+<li>space
+: <a class="el" href="structUcxBuffer.html#a1a5076e85acb84b715a53bc0f37fb721">UcxBuffer</a>
+, <a class="el" href="structUcxStack.html#af64d528744bf3a47fec87d2e45d2992f">UcxStack</a>
+</li>
+<li>stream
+: <a class="el" href="structUcxLogger.html#a33fddf4791e8d49e479ecc78bf5d1b9e">UcxLogger</a>
+</li>
+<li>success
+: <a class="el" href="structUcxTestSuite.html#a6cefa870a3c2e38d6ee682e38643dbbb">UcxTestSuite</a>
+</li>
+</ul>
+
+
+<h3><a id="index_t"></a>- t -</h3><ul>
+<li>test
+: <a class="el" href="structUcxTestList.html#a6022faa52e772b073141ca0a2f5a56c9">UcxTestList</a>
+</li>
+<li>tests
+: <a class="el" href="structUcxTestSuite.html#a630677a70ebc2c3296704cda3196492b">UcxTestSuite</a>
+</li>
+<li>tmp
+: <a class="el" href="structUcxProperties.html#a68556d4260153f58dde44e4c365edce6">UcxProperties</a>
+</li>
+<li>tmpcap
+: <a class="el" href="structUcxProperties.html#a5af10131ea9f679b4ee174499f92e210">UcxProperties</a>
+</li>
+<li>tmplen
+: <a class="el" href="structUcxProperties.html#a8a81853d5903bee2f4e1fa53fdffae6e">UcxProperties</a>
+</li>
+<li>top
+: <a class="el" href="structUcxStack.html#af0ff6f58edce469f17683013b86ade27">UcxStack</a>
+</li>
+</ul>
+
+
+<h3><a id="index_u"></a>- u -</h3><ul>
+<li>userdata
+: <a class="el" href="structUcxAVLTree.html#ae92a3bfad3fe33c8dcbdad85112f83fd">UcxAVLTree</a>
+</li>
+</ul>
+
+
+<h3><a id="index_v"></a>- v -</h3><ul>
+<li>value
+: <a class="el" href="structUcxAVLNode.html#a302501b8c04c3fde668fe72249871258">UcxAVLNode</a>
+</li>
+</ul>
+
+
+<h3><a id="index_w"></a>- w -</h3><ul>
+<li>writer
+: <a class="el" href="structUcxLogger.html#ada13bba090a9dc4f8d6cd9be73c60930">UcxLogger</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/globals.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,78 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index__"></a>- _ -</h3><ul>
+<li>__FUNCTION__
+: <a class="el" href="test_8h.html#a828bb1dfda1afd67ca795075903d227d">test.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/globals_a.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,87 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_a"></a>- a -</h3><ul>
+<li>alcalloc
+: <a class="el" href="allocator_8h.html#a8d71470816f88f78cb9a9686c57e1b10">allocator.h</a>
+</li>
+<li>alfree
+: <a class="el" href="allocator_8h.html#acd775785b54e97dc2b33a432c12c8fb2">allocator.h</a>
+</li>
+<li>almalloc
+: <a class="el" href="allocator_8h.html#ae1bc218fea8a35f4a3706f0beefcfb19">allocator.h</a>
+</li>
+<li>alrealloc
+: <a class="el" href="allocator_8h.html#a029ee5c9bcbb3f873571553f788c5820">allocator.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/globals_c.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,81 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_c"></a>- c -</h3><ul>
+<li>cmp_func
+: <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">ucx.h</a>
+</li>
+<li>copy_func
+: <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">ucx.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/globals_d.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,78 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_d"></a>- d -</h3><ul>
+<li>distance_func
+: <a class="el" href="ucx_8h.html#a0bc5bf89e556c1d45d10863d52728ac9">ucx.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/globals_defs.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,364 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index__"></a>- _ -</h3><ul>
+<li>__FUNCTION__
+: <a class="el" href="test_8h.html#a828bb1dfda1afd67ca795075903d227d">test.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_a"></a>- a -</h3><ul>
+<li>alcalloc
+: <a class="el" href="allocator_8h.html#a8d71470816f88f78cb9a9686c57e1b10">allocator.h</a>
+</li>
+<li>alfree
+: <a class="el" href="allocator_8h.html#acd775785b54e97dc2b33a432c12c8fb2">allocator.h</a>
+</li>
+<li>almalloc
+: <a class="el" href="allocator_8h.html#ae1bc218fea8a35f4a3706f0beefcfb19">allocator.h</a>
+</li>
+<li>alrealloc
+: <a class="el" href="allocator_8h.html#a029ee5c9bcbb3f873571553f788c5820">allocator.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_p"></a>- p -</h3><ul>
+<li>PRIsstr
+: <a class="el" href="string_8h.html#a7d5bc48708405a28b23667e32dfcecae">string.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_s"></a>- s -</h3><ul>
+<li>S
+: <a class="el" href="string_8h.html#a8fa17c8cf4c36df48f4108c36da8573e">string.h</a>
+</li>
+<li>SC
+: <a class="el" href="string_8h.html#a7d261dd0bc358c957a368bc058c1ce53">string.h</a>
+</li>
+<li>SCSTR
+: <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">string.h</a>
+</li>
+<li>SFMT
+: <a class="el" href="string_8h.html#a23ed51e87385886bb65e8cd19c839362">string.h</a>
+</li>
+<li>sstrcasecmp
+: <a class="el" href="string_8h.html#a81b0f6df794152c2038703d4e9d0ad59">string.h</a>
+</li>
+<li>sstrcaseprefix
+: <a class="el" href="string_8h.html#acd3dc64e90db9b4046e14f115a815ff4">string.h</a>
+</li>
+<li>sstrcasesuffix
+: <a class="el" href="string_8h.html#a57eabd4862d531dd685bbf2feb8468bf">string.h</a>
+</li>
+<li>sstrcat
+: <a class="el" href="string_8h.html#a6af8a4c347c7fdb5980d4c4803be2759">string.h</a>
+</li>
+<li>sstrcat_a
+: <a class="el" href="string_8h.html#a6068d460f9bc05962666a917d26568b3">string.h</a>
+</li>
+<li>sstrcmp
+: <a class="el" href="string_8h.html#a7ae7156c8de57454ca38d306100b8160">string.h</a>
+</li>
+<li>sstrdup
+: <a class="el" href="string_8h.html#accbfd2b459a028d7af9fb7df6f977d80">string.h</a>
+</li>
+<li>sstrdup_a
+: <a class="el" href="string_8h.html#a8d098baada4ea9ad5d8b6343b5aec007">string.h</a>
+</li>
+<li>sstrlower
+: <a class="el" href="string_8h.html#a89343ea3e719f00ee802b557db57b769">string.h</a>
+</li>
+<li>sstrlower_a
+: <a class="el" href="string_8h.html#a4bb4742fe71115f493991d307cb22b23">string.h</a>
+</li>
+<li>sstrnlen
+: <a class="el" href="string_8h.html#a33fa945acc5ac2ce962e5ef13cf1638c">string.h</a>
+</li>
+<li>sstrprefix
+: <a class="el" href="string_8h.html#a7d73b66256384b26927e787318fdefa2">string.h</a>
+</li>
+<li>sstrscstr
+: <a class="el" href="string_8h.html#aa696932213265e10f864678686f4ccde">string.h</a>
+</li>
+<li>sstrsplit
+: <a class="el" href="string_8h.html#aa929984004c3576bfafb95031aca8eb7">string.h</a>
+</li>
+<li>sstrsplit_a
+: <a class="el" href="string_8h.html#ac9f69fa3a17e26a3a5f9d985b5844601">string.h</a>
+</li>
+<li>sstrstr
+: <a class="el" href="string_8h.html#a9d03be026afa9447c52bb34b9e3b895a">string.h</a>
+</li>
+<li>sstrsuffix
+: <a class="el" href="string_8h.html#ac6a5246f26be2e8a5f34d8995b7ec14e">string.h</a>
+</li>
+<li>sstrupper
+: <a class="el" href="string_8h.html#a084fe5a3a90d6fb6b15ecda03bb30824">string.h</a>
+</li>
+<li>sstrupper_a
+: <a class="el" href="string_8h.html#a5f0dd83c0176b812fb428004b2877a34">string.h</a>
+</li>
+<li>ST
+: <a class="el" href="string_8h.html#a9037956cca97a4e84b642f17f3d10378">string.h</a>
+</li>
+</ul>
+
+
+<h3><a id="index_u"></a>- u -</h3><ul>
+<li>UCX_ALLOCATOR_DEFAULT
+: <a class="el" href="allocator_8h.html#a1283a8f875f90a7af3aba5e031fc2e3f">allocator.h</a>
+</li>
+<li>ucx_array_util_set
+: <a class="el" href="array_8h.html#a1d959c29af3125bdd37cde3a554e729c">array.h</a>
+</li>
+<li>ucx_array_util_setptr
+: <a class="el" href="array_8h.html#a59a5b342965e790945f9c7a3f86b99f9">array.h</a>
+</li>
+<li>ucx_avl_default_new
+: <a class="el" href="avl_8h.html#ac2886d4b79b48c9fabf6408873f84cd2">avl.h</a>
+</li>
+<li>UCX_AVL_FIND_CLOSEST
+: <a class="el" href="avl_8h.html#af16f24d74fd6af0154de041566c6603b">avl.h</a>
+</li>
+<li>UCX_AVL_FIND_EXACT
+: <a class="el" href="avl_8h.html#aaaf4a6f6f661cda7791db239212285d9">avl.h</a>
+</li>
+<li>UCX_AVL_FIND_LOWER_BOUNDED
+: <a class="el" href="avl_8h.html#abd2446d544d5412b6997ee8a17bd368c">avl.h</a>
+</li>
+<li>UCX_AVL_FIND_UPPER_BOUNDED
+: <a class="el" href="avl_8h.html#ac74ee7649c1e206b08b31f37dd68ca5e">avl.h</a>
+</li>
+<li>ucx_bprintf
+: <a class="el" href="utils_8h.html#a9d7d65a420f026fcb6982803d5120519">utils.h</a>
+</li>
+<li>UCX_BUFFER_AUTOEXTEND
+: <a class="el" href="buffer_8h.html#a05f9565f2d04399168c3b1c152a632be">buffer.h</a>
+</li>
+<li>UCX_BUFFER_AUTOFREE
+: <a class="el" href="buffer_8h.html#a8bab11ad8a76719228b9ee91e2e45535">buffer.h</a>
+</li>
+<li>ucx_buffer_clear
+: <a class="el" href="buffer_8h.html#a374abd5aabfcc3ee0777a79d5fe651ab">buffer.h</a>
+</li>
+<li>ucx_buffer_clone
+: <a class="el" href="buffer_8h.html#a828353846428c2c2f695f9938f059e52">buffer.h</a>
+</li>
+<li>UCX_BUFFER_DEFAULT
+: <a class="el" href="buffer_8h.html#acc77c8ed7b26854f555d4a5d11e49ea2">buffer.h</a>
+</li>
+<li>ucx_buffer_to_sstr
+: <a class="el" href="buffer_8h.html#a0f4b64f1b3a74c4f6c5d9409d6b6086a">buffer.h</a>
+</li>
+<li>UCX_FOREACH
+: <a class="el" href="list_8h.html#a4b143b6526a410aa4d22cb3bb9365d70">list.h</a>
+</li>
+<li>ucx_logger_debug
+: <a class="el" href="logging_8h.html#a2936402799892db5138e5f1f8c25db0c">logging.h</a>
+</li>
+<li>UCX_LOGGER_DEBUG
+: <a class="el" href="logging_8h.html#acff01d1ef919ea997cfce755fc1b83d8">logging.h</a>
+</li>
+<li>ucx_logger_error
+: <a class="el" href="logging_8h.html#a6a9e472e14d6768e59d96d245e065397">logging.h</a>
+</li>
+<li>UCX_LOGGER_ERROR
+: <a class="el" href="logging_8h.html#aa254c07fe3a907613e2256a318d5c9a8">logging.h</a>
+</li>
+<li>UCX_LOGGER_INFO
+: <a class="el" href="logging_8h.html#a4b0178bf60a6129373ffc59114ca4c9b">logging.h</a>
+</li>
+<li>ucx_logger_info
+: <a class="el" href="logging_8h.html#a98464d8d51376ce2716dcc4eca00d5da">logging.h</a>
+</li>
+<li>UCX_LOGGER_LEVEL
+: <a class="el" href="logging_8h.html#aee18bc20e58ffb69910121512c350839">logging.h</a>
+</li>
+<li>ucx_logger_log
+: <a class="el" href="logging_8h.html#aa0245325031d95799b28def177fd14ec">logging.h</a>
+</li>
+<li>ucx_logger_register_level
+: <a class="el" href="logging_8h.html#a5cffc19502c4c90bfb3bd3bbcd18170a">logging.h</a>
+</li>
+<li>UCX_LOGGER_SOURCE
+: <a class="el" href="logging_8h.html#a0e0d72b12616c1e49ff8834eaf4cb8a2">logging.h</a>
+</li>
+<li>UCX_LOGGER_TIMESTAMP
+: <a class="el" href="logging_8h.html#a38607008268b4f776ee500fb95d2e823">logging.h</a>
+</li>
+<li>UCX_LOGGER_TRACE
+: <a class="el" href="logging_8h.html#a55b88d1fec7036d841b3ddd6195c5586">logging.h</a>
+</li>
+<li>ucx_logger_trace
+: <a class="el" href="logging_8h.html#a3031b7ff13f4cfae9c2916543be2877c">logging.h</a>
+</li>
+<li>UCX_LOGGER_WARN
+: <a class="el" href="logging_8h.html#abd01ca11486226ba34e8f7028d9fffba">logging.h</a>
+</li>
+<li>ucx_logger_warn
+: <a class="el" href="logging_8h.html#aca7bd861b646892813fd7310c0aa69af">logging.h</a>
+</li>
+<li>ucx_map_cstr_get
+: <a class="el" href="map_8h.html#a64e1fb55498fa502dd2ed8ed69062cdd">map.h</a>
+</li>
+<li>ucx_map_cstr_put
+: <a class="el" href="map_8h.html#ad9356b01425b934ab237b52339ac0cc3">map.h</a>
+</li>
+<li>ucx_map_cstr_remove
+: <a class="el" href="map_8h.html#a9c4405a5a75ecf64e2ef3d0c6501a9fe">map.h</a>
+</li>
+<li>UCX_MAP_FOREACH
+: <a class="el" href="map_8h.html#a940896c4aa1b13e54c55c04c3efc186b">map.h</a>
+</li>
+<li>ucx_map_int_get
+: <a class="el" href="map_8h.html#aa1681bd2178553cd092fd24c4d681d3c">map.h</a>
+</li>
+<li>ucx_map_int_put
+: <a class="el" href="map_8h.html#aaa30af79b4068c923895619e83f44367">map.h</a>
+</li>
+<li>ucx_map_int_remove
+: <a class="el" href="map_8h.html#aa767958b5468737755c09f7185b1770c">map.h</a>
+</li>
+<li>ucx_map_sstr_get
+: <a class="el" href="map_8h.html#a14d385f6b7f371f0507861cabd2eab4e">map.h</a>
+</li>
+<li>ucx_map_sstr_put
+: <a class="el" href="map_8h.html#ac26a8615bfc8f47ee9eaceb47645f98e">map.h</a>
+</li>
+<li>ucx_map_sstr_remove
+: <a class="el" href="map_8h.html#a48700ea86fadb9ea54d13010f9124df2">map.h</a>
+</li>
+<li>ucx_mempool_new_default
+: <a class="el" href="mempool_8h.html#a49f7bd1da5ac201d0cf54dc0f0d82dd2">mempool.h</a>
+</li>
+<li>ucx_sprintf
+: <a class="el" href="utils_8h.html#af9f333b66ecd639c347c7235f4992e2e">utils.h</a>
+</li>
+<li>ucx_stack_dim
+: <a class="el" href="stack_8h.html#a3b761343c6491222604341ebfa443226">stack.h</a>
+</li>
+<li>ucx_stack_empty
+: <a class="el" href="stack_8h.html#a4f7239dbd6c032c56812e370b71c1985">stack.h</a>
+</li>
+<li>ucx_stack_pop
+: <a class="el" href="stack_8h.html#a506b82374734ec476d086ddfb561174d">stack.h</a>
+</li>
+<li>ucx_stack_topsize
+: <a class="el" href="stack_8h.html#a030197051a803e87d5eeac5adb80b15a">stack.h</a>
+</li>
+<li>ucx_stream_bcopy
+: <a class="el" href="utils_8h.html#a6003a1750a66234169bd1f8cc84b297b">utils.h</a>
+</li>
+<li>ucx_stream_copy
+: <a class="el" href="utils_8h.html#a41ca1344f781c0d3bf7a414a6e811392">utils.h</a>
+</li>
+<li>UCX_STREAM_COPY_BUFSIZE
+: <a class="el" href="utils_8h.html#a23efd74fa5f701d4cf26ccbfd138a439">utils.h</a>
+</li>
+<li>ucx_stream_ncopy
+: <a class="el" href="utils_8h.html#add13f39a8af440b4f7e6f74339eaada2">utils.h</a>
+</li>
+<li>ucx_szmul
+: <a class="el" href="ucx_8h.html#a0b5ed6c1a0b15356f4f948acfd32a4cc">ucx.h</a>
+</li>
+<li>UCX_TEST
+: <a class="el" href="test_8h.html#a66cfb29c329fc9eaef071f2449836659">test.h</a>
+</li>
+<li>UCX_TEST_ASSERT
+: <a class="el" href="test_8h.html#a08f477cd12fc3fe741a92493e5df58a9">test.h</a>
+</li>
+<li>UCX_TEST_BEGIN
+: <a class="el" href="test_8h.html#a0547b8d4f3bcdb0633fdd8925e8aa5d4">test.h</a>
+</li>
+<li>UCX_TEST_CALL_SUBROUTINE
+: <a class="el" href="test_8h.html#a0efbab91c54f5237a2ab207f48cf0e51">test.h</a>
+</li>
+<li>UCX_TEST_END
+: <a class="el" href="test_8h.html#a86e64857c04f0447f8b16fb9c2b3b639">test.h</a>
+</li>
+<li>UCX_TEST_SUBROUTINE
+: <a class="el" href="test_8h.html#ae073cf5ead22cb27d662da048e16f44a">test.h</a>
+</li>
+<li>UCX_VERSION
+: <a class="el" href="ucx_8h.html#af12001920ca2fc1405615684e4dea284">ucx.h</a>
+</li>
+<li>UCX_VERSION_MAJOR
+: <a class="el" href="ucx_8h.html#aa57e5dd22d42387d748cc16777df1383">ucx.h</a>
+</li>
+<li>UCX_VERSION_MINOR
+: <a class="el" href="ucx_8h.html#a9ac10d6353e23d4615a87fc737c65eb0">ucx.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/globals_func.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,174 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_s"></a>- s -</h3><ul>
+<li>scstr()
+: <a class="el" href="string_8h.html#a2b1d6f1eca1c1549f37107b9c026c5a6">string.h</a>
+</li>
+<li>scstrcasecmp()
+: <a class="el" href="string_8h.html#aca8142fb823d253054e17c17cfca05e0">string.h</a>
+</li>
+<li>scstrcaseprefix()
+: <a class="el" href="string_8h.html#a3718ef4aa1e86cdb26bda2f07fb585df">string.h</a>
+</li>
+<li>scstrcasesuffix()
+: <a class="el" href="string_8h.html#a6edb4b85f2b9efe79db7ffe6eccd7bc3">string.h</a>
+</li>
+<li>scstrcat()
+: <a class="el" href="string_8h.html#a7376842c19e954b49215da81ef76ac0c">string.h</a>
+</li>
+<li>scstrcat_a()
+: <a class="el" href="string_8h.html#abacce4cbd6f70fcb6453904ef08b02e9">string.h</a>
+</li>
+<li>scstrchr()
+: <a class="el" href="string_8h.html#a5836d6a7a744791c35e5c17bdc394a87">string.h</a>
+</li>
+<li>scstrcmp()
+: <a class="el" href="string_8h.html#af35272a8e5408c88ed3e25a3a98f0a82">string.h</a>
+</li>
+<li>scstrdup()
+: <a class="el" href="string_8h.html#a97dccce03af419596dbdd592ca46a164">string.h</a>
+</li>
+<li>scstrdup_a()
+: <a class="el" href="string_8h.html#a8fe58921f51eb1fde038472377e63014">string.h</a>
+</li>
+<li>scstrlower()
+: <a class="el" href="string_8h.html#abccf198bea3186ff2abb080cc88dcae6">string.h</a>
+</li>
+<li>scstrlower_a()
+: <a class="el" href="string_8h.html#a3cf1e557df7ab58d03c78832c4060276">string.h</a>
+</li>
+<li>scstrn()
+: <a class="el" href="string_8h.html#ae594f6e222ea394cef6a26c0dfad000d">string.h</a>
+</li>
+<li>scstrnlen()
+: <a class="el" href="string_8h.html#ac1b000030d6d197eec48c15a182055d5">string.h</a>
+</li>
+<li>scstrprefix()
+: <a class="el" href="string_8h.html#a599ddc2f88dd1df68b72eefd91347393">string.h</a>
+</li>
+<li>scstrrchr()
+: <a class="el" href="string_8h.html#ae389835b97cd9382e7d6a6a075323376">string.h</a>
+</li>
+<li>scstrscstr()
+: <a class="el" href="string_8h.html#a54f256c3abe811c52d58b4ff1b23f051">string.h</a>
+</li>
+<li>scstrsplit()
+: <a class="el" href="string_8h.html#ae71cac352b00230848bde358f0fb05ea">string.h</a>
+</li>
+<li>scstrsplit_a()
+: <a class="el" href="string_8h.html#a52906455ae530c9cdc6812c8e6d9bdef">string.h</a>
+</li>
+<li>scstrsstr()
+: <a class="el" href="string_8h.html#aa4362cb36c6629f9d8484739fd827748">string.h</a>
+</li>
+<li>scstrsubs()
+: <a class="el" href="string_8h.html#a9a6c8d8db0dda0037c3c852cce1a5060">string.h</a>
+</li>
+<li>scstrsubsl()
+: <a class="el" href="string_8h.html#ad50f0f67b906fad0744f46bcb51e144b">string.h</a>
+</li>
+<li>scstrsuffix()
+: <a class="el" href="string_8h.html#a1f0ae316a2afe85d5b4655e6ece6721a">string.h</a>
+</li>
+<li>scstrtrim()
+: <a class="el" href="string_8h.html#ad374b16eb1be8b48019debad9b9f268c">string.h</a>
+</li>
+<li>scstrupper()
+: <a class="el" href="string_8h.html#af3dd09ec9d11162fe0075f4e60f41240">string.h</a>
+</li>
+<li>scstrupper_a()
+: <a class="el" href="string_8h.html#aea94613eb74668cc05d365803d32bfad">string.h</a>
+</li>
+<li>sstr()
+: <a class="el" href="string_8h.html#a539eb7059251a051ee5d179526a23e9a">string.h</a>
+</li>
+<li>sstrchr()
+: <a class="el" href="string_8h.html#af80898a0b75955eb2579298c3ae2c481">string.h</a>
+</li>
+<li>sstrn()
+: <a class="el" href="string_8h.html#a2744c38ac44abf3e01fa059056dcf36c">string.h</a>
+</li>
+<li>sstrrchr()
+: <a class="el" href="string_8h.html#adae3f59957ca328e1da5285cb8b02a72">string.h</a>
+</li>
+<li>sstrsubs()
+: <a class="el" href="string_8h.html#a5eb9e0e1f26cf7fbecc038cd90e8b258">string.h</a>
+</li>
+<li>sstrsubsl()
+: <a class="el" href="string_8h.html#a78925c91af54f23cebd20ff99ef4331a">string.h</a>
+</li>
+<li>sstrtrim()
+: <a class="el" href="string_8h.html#ae2d6da564d3fce51f2e0cac580fdbc56">string.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/globals_func_u.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,621 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_u"></a>- u -</h3><ul>
+<li>ucx_array_append_from()
+: <a class="el" href="array_8h.html#aea01731ad94ea73c0c8fb1d1b7a35fcf">array.h</a>
+</li>
+<li>ucx_array_at()
+: <a class="el" href="array_8h.html#aa698085fd1a8b70d6b709999c51b49e8">array.h</a>
+</li>
+<li>ucx_array_clone()
+: <a class="el" href="array_8h.html#a4a8c273370e4a3a3e2624e364f5ab410">array.h</a>
+</li>
+<li>ucx_array_concat()
+: <a class="el" href="array_8h.html#aa5a0bf3d3f0df6406beb0e569021cc28">array.h</a>
+</li>
+<li>ucx_array_contains()
+: <a class="el" href="array_8h.html#a5241058cd2329147bc5b1593ae7e51dc">array.h</a>
+</li>
+<li>ucx_array_destroy()
+: <a class="el" href="array_8h.html#a8e83681d8d5d8cddbf10f63ce5be4c10">array.h</a>
+</li>
+<li>ucx_array_equals()
+: <a class="el" href="array_8h.html#a43292b448adb1741677aa8c578bcc201">array.h</a>
+</li>
+<li>ucx_array_find()
+: <a class="el" href="array_8h.html#ae7bdbed94afee9b20b38b95e3ab470f0">array.h</a>
+</li>
+<li>ucx_array_free()
+: <a class="el" href="array_8h.html#ac01ee914468a16f470bf3071fffbe438">array.h</a>
+</li>
+<li>ucx_array_grow()
+: <a class="el" href="array_8h.html#ab0cbf243824aaebee48277315e03afce">array.h</a>
+</li>
+<li>ucx_array_init()
+: <a class="el" href="array_8h.html#ad921e85c28ffae32230777a53c5037e5">array.h</a>
+</li>
+<li>ucx_array_init_a()
+: <a class="el" href="array_8h.html#a2451e61ebb15a7ba1c1319267ba75b8c">array.h</a>
+</li>
+<li>ucx_array_new()
+: <a class="el" href="array_8h.html#a994a2fbf1c33a3833e2a70cd9a4352b7">array.h</a>
+</li>
+<li>ucx_array_new_a()
+: <a class="el" href="array_8h.html#a177170258c215eb2e4f5a32e59f0cb1b">array.h</a>
+</li>
+<li>ucx_array_prepend_from()
+: <a class="el" href="array_8h.html#a95b52acc2193b5c33cf0eaa4f2082477">array.h</a>
+</li>
+<li>ucx_array_remove()
+: <a class="el" href="array_8h.html#aa45eac6b697f83adac81c0860cf306b8">array.h</a>
+</li>
+<li>ucx_array_remove_fast()
+: <a class="el" href="array_8h.html#a548d81b07612bae3ba8c4c4b49104b8e">array.h</a>
+</li>
+<li>ucx_array_reserve()
+: <a class="el" href="array_8h.html#a1c3bf8433c1de3c933f3854ab297fe1d">array.h</a>
+</li>
+<li>ucx_array_resize()
+: <a class="el" href="array_8h.html#a27762e7c06a6c781015e3c8ceeee0ce3">array.h</a>
+</li>
+<li>ucx_array_set_from()
+: <a class="el" href="array_8h.html#a1bb545d065358d265d80d815ba382a28">array.h</a>
+</li>
+<li>ucx_array_shrink()
+: <a class="el" href="array_8h.html#a2daf50e80aee9bccebee876a7efd2dfc">array.h</a>
+</li>
+<li>ucx_array_sort()
+: <a class="el" href="array_8h.html#add773514569b872a6624381b4b6af52c">array.h</a>
+</li>
+<li>ucx_array_util_set_a()
+: <a class="el" href="array_8h.html#ad0a8d76980cf1c1910e64a245803fb9a">array.h</a>
+</li>
+<li>ucx_array_util_setptr_a()
+: <a class="el" href="array_8h.html#ad708b333c0c1b02c998309a58ea65e31">array.h</a>
+</li>
+<li>ucx_asprintf()
+: <a class="el" href="utils_8h.html#a9f9cf0e89ffdc256ecb35429907f51f5">utils.h</a>
+</li>
+<li>ucx_avl_count()
+: <a class="el" href="avl_8h.html#a92c1d41c2b22fe4a029a486ab2153e35">avl.h</a>
+</li>
+<li>ucx_avl_find()
+: <a class="el" href="avl_8h.html#a51770e1614b28d7d22dea096c3704f83">avl.h</a>
+</li>
+<li>ucx_avl_find_node()
+: <a class="el" href="avl_8h.html#a664986f64d6865605199fbff06e19cd5">avl.h</a>
+</li>
+<li>ucx_avl_free()
+: <a class="el" href="avl_8h.html#a2f92db538f25fce908d2cb3e5590944c">avl.h</a>
+</li>
+<li>ucx_avl_free_content()
+: <a class="el" href="avl_8h.html#a31ad7fb196ca211f1fc39f4e15f72279">avl.h</a>
+</li>
+<li>ucx_avl_get()
+: <a class="el" href="avl_8h.html#adbcf7ceb3f014a30c7214f7304519efe">avl.h</a>
+</li>
+<li>ucx_avl_get_node()
+: <a class="el" href="avl_8h.html#acf42da9a4168e47dc10b4ba0d27ceb4e">avl.h</a>
+</li>
+<li>ucx_avl_new()
+: <a class="el" href="avl_8h.html#a11b043d65a11b7092d5d98b298e5ede3">avl.h</a>
+</li>
+<li>ucx_avl_new_a()
+: <a class="el" href="avl_8h.html#af0f868d67e9dc08b4867c02a06c23ee2">avl.h</a>
+</li>
+<li>ucx_avl_pred()
+: <a class="el" href="avl_8h.html#a0e739aeb66dda6a6a3f6eb51b50cf346">avl.h</a>
+</li>
+<li>ucx_avl_put()
+: <a class="el" href="avl_8h.html#aec401fab4a24a7edffa734f9baf88577">avl.h</a>
+</li>
+<li>ucx_avl_put_s()
+: <a class="el" href="avl_8h.html#a32cf8955cc0226a82bacfc7b76d6474c">avl.h</a>
+</li>
+<li>ucx_avl_remove()
+: <a class="el" href="avl_8h.html#a1d821119c805d7fbb7e424bc3effeba9">avl.h</a>
+</li>
+<li>ucx_avl_remove_node()
+: <a class="el" href="avl_8h.html#a9a792b7d9e58073deef74a341f8bc720">avl.h</a>
+</li>
+<li>ucx_avl_remove_s()
+: <a class="el" href="avl_8h.html#a01aeeecd6415f0cc2b623486eb28f254">avl.h</a>
+</li>
+<li>ucx_avl_succ()
+: <a class="el" href="avl_8h.html#aab1ad9b027ff5e50671aa0ee84e2d541">avl.h</a>
+</li>
+<li>ucx_buffer_eof()
+: <a class="el" href="buffer_8h.html#abad7fd9ad5061224c780b8d1d4c55f09">buffer.h</a>
+</li>
+<li>ucx_buffer_extend()
+: <a class="el" href="buffer_8h.html#afaf97d2cd7e9faad79a9d35fe33e30c6">buffer.h</a>
+</li>
+<li>ucx_buffer_extract()
+: <a class="el" href="buffer_8h.html#a33fa7bb35fe08bbb3542f227514332ef">buffer.h</a>
+</li>
+<li>ucx_buffer_free()
+: <a class="el" href="buffer_8h.html#a2af8646d8905c22c7322e7540b0440af">buffer.h</a>
+</li>
+<li>ucx_buffer_getc()
+: <a class="el" href="buffer_8h.html#a396339022159ce4ca6d069de9f9209b0">buffer.h</a>
+</li>
+<li>ucx_buffer_new()
+: <a class="el" href="buffer_8h.html#aacea876d692193ec6f859ce98da7351c">buffer.h</a>
+</li>
+<li>ucx_buffer_putc()
+: <a class="el" href="buffer_8h.html#a7d6f01b9d631b0123475dfb98fb849ac">buffer.h</a>
+</li>
+<li>ucx_buffer_puts()
+: <a class="el" href="buffer_8h.html#af1d4b478e04b3ae0bf30e7c2ea964ea2">buffer.h</a>
+</li>
+<li>ucx_buffer_read()
+: <a class="el" href="buffer_8h.html#ae5c3430759f0059547b35d5a254d4da5">buffer.h</a>
+</li>
+<li>ucx_buffer_seek()
+: <a class="el" href="buffer_8h.html#a47d98482662073c74f35deb0957d15d1">buffer.h</a>
+</li>
+<li>ucx_buffer_shift()
+: <a class="el" href="buffer_8h.html#a12a0c6a2379ef080043e6286bb8bad69">buffer.h</a>
+</li>
+<li>ucx_buffer_shift_left()
+: <a class="el" href="buffer_8h.html#a20431dd0ed6a6fe9f15333bd72afe4db">buffer.h</a>
+</li>
+<li>ucx_buffer_shift_right()
+: <a class="el" href="buffer_8h.html#a4fa10b6471495547eb981248fd4f1bc2">buffer.h</a>
+</li>
+<li>ucx_buffer_write()
+: <a class="el" href="buffer_8h.html#af8aacc7401814392b58c1b7b81bffc05">buffer.h</a>
+</li>
+<li>ucx_cmp_double()
+: <a class="el" href="utils_8h.html#ab804b7c27d0bfcd7bf3a3583140825b6">utils.h</a>
+</li>
+<li>ucx_cmp_float()
+: <a class="el" href="utils_8h.html#ad1196b561bcdad76c393885819769a97">utils.h</a>
+</li>
+<li>ucx_cmp_int()
+: <a class="el" href="utils_8h.html#a8ce7e11e6b3deafe89a32a091fde7f16">utils.h</a>
+</li>
+<li>ucx_cmp_int16()
+: <a class="el" href="utils_8h.html#aa29e6e559946375e34113e34e0b0bd0d">utils.h</a>
+</li>
+<li>ucx_cmp_int32()
+: <a class="el" href="utils_8h.html#a858b2ac443fb202643b71f6a7e9218dd">utils.h</a>
+</li>
+<li>ucx_cmp_int64()
+: <a class="el" href="utils_8h.html#a54701aea6a89fed1402dfb0bf56bc7f6">utils.h</a>
+</li>
+<li>ucx_cmp_longint()
+: <a class="el" href="utils_8h.html#aeb57a2b9a6aaa0460c7a6bec29accf2c">utils.h</a>
+</li>
+<li>ucx_cmp_longlong()
+: <a class="el" href="utils_8h.html#a366b57def20f86a41eaedf575eea5375">utils.h</a>
+</li>
+<li>ucx_cmp_mem()
+: <a class="el" href="utils_8h.html#aff7d2bcded71196831a8c0664333f8e7">utils.h</a>
+</li>
+<li>ucx_cmp_ptr()
+: <a class="el" href="utils_8h.html#aa174d539de3ea59be4f9640f17ce53d8">utils.h</a>
+</li>
+<li>ucx_cmp_sstr()
+: <a class="el" href="utils_8h.html#adee0739589166d272f8cb7c23aabf8ba">utils.h</a>
+</li>
+<li>ucx_cmp_str()
+: <a class="el" href="utils_8h.html#aa6a37b9d172b6a5b2803d152f9e1b258">utils.h</a>
+</li>
+<li>ucx_cmp_strn()
+: <a class="el" href="utils_8h.html#ac6b354a878f551a3a5b20a167db3f308">utils.h</a>
+</li>
+<li>ucx_cmp_uint()
+: <a class="el" href="utils_8h.html#abd83a5da91c3dd026a6931bd80c12f1e">utils.h</a>
+</li>
+<li>ucx_cmp_uint16()
+: <a class="el" href="utils_8h.html#acde5366437e886a459b7468f7a9e11f0">utils.h</a>
+</li>
+<li>ucx_cmp_uint32()
+: <a class="el" href="utils_8h.html#a5879d1722330355914d8c9146fa549d3">utils.h</a>
+</li>
+<li>ucx_cmp_uint64()
+: <a class="el" href="utils_8h.html#a1572a78b5b42f7151a5b2a5a7283d62d">utils.h</a>
+</li>
+<li>ucx_cmp_ulongint()
+: <a class="el" href="utils_8h.html#a3f3cbae2594d6f722bae29acb0408a24">utils.h</a>
+</li>
+<li>ucx_cmp_ulonglong()
+: <a class="el" href="utils_8h.html#a6acfc359421f21f9a042a654ff7faac5">utils.h</a>
+</li>
+<li>ucx_default_allocator()
+: <a class="el" href="allocator_8h.html#a98d2f1b341118b7a0e341fda5d8b2ebf">allocator.h</a>
+</li>
+<li>ucx_default_calloc()
+: <a class="el" href="allocator_8h.html#a3a0bfdd13d887012309c459b339f338f">allocator.h</a>
+</li>
+<li>ucx_default_free()
+: <a class="el" href="allocator_8h.html#a646d83aaaadfe33ae414c0fad8bfc52a">allocator.h</a>
+</li>
+<li>ucx_default_malloc()
+: <a class="el" href="allocator_8h.html#a96403ebf3d2312d95f2fe7627a1cdbc0">allocator.h</a>
+</li>
+<li>ucx_default_realloc()
+: <a class="el" href="allocator_8h.html#a47cfc8af626a86fcb93a2b14b90498ed">allocator.h</a>
+</li>
+<li>ucx_dist_int()
+: <a class="el" href="utils_8h.html#a4ab6753739d56c09cdf6079fdcabf7c6">utils.h</a>
+</li>
+<li>ucx_dist_int16()
+: <a class="el" href="utils_8h.html#a81fb8434b70ca11bf2c14abfa21d16a9">utils.h</a>
+</li>
+<li>ucx_dist_int32()
+: <a class="el" href="utils_8h.html#ab4a659cc46096f0490c1dafa57726476">utils.h</a>
+</li>
+<li>ucx_dist_int64()
+: <a class="el" href="utils_8h.html#a54e7d06585bad3a899befc4e9c13853f">utils.h</a>
+</li>
+<li>ucx_dist_longint()
+: <a class="el" href="utils_8h.html#a43e73d288b1553a0078bf4c98dd341f5">utils.h</a>
+</li>
+<li>ucx_dist_longlong()
+: <a class="el" href="utils_8h.html#a306778414a2427951ea263be92368627">utils.h</a>
+</li>
+<li>ucx_dist_uint()
+: <a class="el" href="utils_8h.html#a37b7d471ca1679992afc11a0deda45f4">utils.h</a>
+</li>
+<li>ucx_dist_uint16()
+: <a class="el" href="utils_8h.html#a66e00a0703cbcde050ec922578e2f080">utils.h</a>
+</li>
+<li>ucx_dist_uint32()
+: <a class="el" href="utils_8h.html#add2b5c5507caba59d894b84e056b079b">utils.h</a>
+</li>
+<li>ucx_dist_uint64()
+: <a class="el" href="utils_8h.html#a3ba75e2e0b2479eef2b22fb219b42da7">utils.h</a>
+</li>
+<li>ucx_dist_ulongint()
+: <a class="el" href="utils_8h.html#abb13476228d0c16bfaba08469adbae2d">utils.h</a>
+</li>
+<li>ucx_dist_ulonglong()
+: <a class="el" href="utils_8h.html#a59a5859272cb4b43cbdd58208c41e32b">utils.h</a>
+</li>
+<li>ucx_fprintf()
+: <a class="el" href="utils_8h.html#aa0bec80e1c67f769ff5e112a7d4ce72a">utils.h</a>
+</li>
+<li>ucx_hash()
+: <a class="el" href="map_8h.html#aea3be97254c05595d986ef6a9faae87b">map.h</a>
+</li>
+<li>ucx_key()
+: <a class="el" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">map.h</a>
+</li>
+<li>ucx_list_append()
+: <a class="el" href="list_8h.html#a00c122c8a26d35b60676939df4161621">list.h</a>
+</li>
+<li>ucx_list_append_a()
+: <a class="el" href="list_8h.html#adf3b3e2e0ff977d8928671d6bd82fc60">list.h</a>
+</li>
+<li>ucx_list_clone()
+: <a class="el" href="list_8h.html#ae7054a41c289b24e6caf5cb07ac850ed">list.h</a>
+</li>
+<li>ucx_list_clone_a()
+: <a class="el" href="list_8h.html#a08ca1ba0d2e82258b0408714c1f4c425">list.h</a>
+</li>
+<li>ucx_list_concat()
+: <a class="el" href="list_8h.html#a77163a0cc82fae52bec26c8c0c3674d9">list.h</a>
+</li>
+<li>ucx_list_contains()
+: <a class="el" href="list_8h.html#a8b0fa051fcfe12e1a82cca1087973852">list.h</a>
+</li>
+<li>ucx_list_difference()
+: <a class="el" href="list_8h.html#a6c5db5d1d11ad28b6fe1a80ee1c1e449">list.h</a>
+</li>
+<li>ucx_list_difference_a()
+: <a class="el" href="list_8h.html#a4a2a2fc5cc41073c516db6235bbc51d5">list.h</a>
+</li>
+<li>ucx_list_equals()
+: <a class="el" href="list_8h.html#adc435447cecf885bc63d232191085bbe">list.h</a>
+</li>
+<li>ucx_list_find()
+: <a class="el" href="list_8h.html#a9b3b6842d3be572e06a7f519e198cb83">list.h</a>
+</li>
+<li>ucx_list_first()
+: <a class="el" href="list_8h.html#a6aa0e34ebc5f0dca6f52d0f7626b4bd5">list.h</a>
+</li>
+<li>ucx_list_free()
+: <a class="el" href="list_8h.html#a1a0fa2c5b1e478a96da19b0c3f013668">list.h</a>
+</li>
+<li>ucx_list_free_a()
+: <a class="el" href="list_8h.html#a944e11f76c38767cd1100d72a4e3b25b">list.h</a>
+</li>
+<li>ucx_list_free_content()
+: <a class="el" href="list_8h.html#a4ba6c96642f72ea046cc22627c72979c">list.h</a>
+</li>
+<li>ucx_list_get()
+: <a class="el" href="list_8h.html#a2509ffe19bce6a8708c77f89480c75fb">list.h</a>
+</li>
+<li>ucx_list_indexof()
+: <a class="el" href="list_8h.html#ae2ff2974812ca185870f80bc4ed9337e">list.h</a>
+</li>
+<li>ucx_list_intersection()
+: <a class="el" href="list_8h.html#a259f9b754978aeca23dfabba16e20f39">list.h</a>
+</li>
+<li>ucx_list_intersection_a()
+: <a class="el" href="list_8h.html#a1d0b00514dbb81ba6270b58da0c5b9a8">list.h</a>
+</li>
+<li>ucx_list_last()
+: <a class="el" href="list_8h.html#add5ec40c5006e29c629d23c2eb5a6553">list.h</a>
+</li>
+<li>ucx_list_prepend()
+: <a class="el" href="list_8h.html#a8fcb68e4556395b15180eec2d0b77aa4">list.h</a>
+</li>
+<li>ucx_list_prepend_a()
+: <a class="el" href="list_8h.html#a54654e6dc60e1c3de9e886c150e404ec">list.h</a>
+</li>
+<li>ucx_list_remove()
+: <a class="el" href="list_8h.html#a410cb3e8260037ba56c72d14b899b468">list.h</a>
+</li>
+<li>ucx_list_remove_a()
+: <a class="el" href="list_8h.html#aca687b7c4e7170175f447e549125aa52">list.h</a>
+</li>
+<li>ucx_list_size()
+: <a class="el" href="list_8h.html#ae88001cc8ae40b946560f31434abed8f">list.h</a>
+</li>
+<li>ucx_list_sort()
+: <a class="el" href="list_8h.html#ac74962d9bd7cfc9d3e2e09651469377b">list.h</a>
+</li>
+<li>ucx_list_union()
+: <a class="el" href="list_8h.html#a94ecdb0cea1633ad7074f027fa8485fa">list.h</a>
+</li>
+<li>ucx_list_union_a()
+: <a class="el" href="list_8h.html#a65b4355536f4ebc4130211b46469f4c1">list.h</a>
+</li>
+<li>ucx_logger_free()
+: <a class="el" href="logging_8h.html#ac4697b784e01ec990d2acea192e21658">logging.h</a>
+</li>
+<li>ucx_logger_logf()
+: <a class="el" href="logging_8h.html#ac337e5d02ebea565012d4c11bd643801">logging.h</a>
+</li>
+<li>ucx_logger_new()
+: <a class="el" href="logging_8h.html#ac560f8517d2172794c9d2691735ec48c">logging.h</a>
+</li>
+<li>ucx_map_clear()
+: <a class="el" href="map_8h.html#a285e90e40681c6d9631c935dda0967f2">map.h</a>
+</li>
+<li>ucx_map_clone()
+: <a class="el" href="map_8h.html#a62c6c30cbb0d824ba710f5030ff9a4e4">map.h</a>
+</li>
+<li>ucx_map_clone_a()
+: <a class="el" href="map_8h.html#a9aea9103703d5c168420bb6bf85549ea">map.h</a>
+</li>
+<li>ucx_map_copy()
+: <a class="el" href="map_8h.html#adfeb2d61003fd2896bcfdc9a57f36425">map.h</a>
+</li>
+<li>ucx_map_difference()
+: <a class="el" href="map_8h.html#a774fcff87d1e58b6c5af77dd19a8c3dc">map.h</a>
+</li>
+<li>ucx_map_difference_a()
+: <a class="el" href="map_8h.html#ad0ba103494247d798ac3037c50fc8831">map.h</a>
+</li>
+<li>ucx_map_free()
+: <a class="el" href="map_8h.html#abe3d9688e4224bf7bb962abf25ff8c2e">map.h</a>
+</li>
+<li>ucx_map_free_content()
+: <a class="el" href="map_8h.html#a750f3d9d83e2f3788a14c17a9d160618">map.h</a>
+</li>
+<li>ucx_map_get()
+: <a class="el" href="map_8h.html#ab61192c5af2e06ecb9ad73880d1c95a6">map.h</a>
+</li>
+<li>ucx_map_intersection()
+: <a class="el" href="map_8h.html#aa594d7a5afebc3bed6bb265348cf6b0d">map.h</a>
+</li>
+<li>ucx_map_intersection_a()
+: <a class="el" href="map_8h.html#a169e0470a20484dd76425fdf77e3651e">map.h</a>
+</li>
+<li>ucx_map_iter_next()
+: <a class="el" href="map_8h.html#aceb8675abf44860b4bbc301bbada5b91">map.h</a>
+</li>
+<li>ucx_map_iterator()
+: <a class="el" href="map_8h.html#a9150e9c64fdf4dfcc2cad106b91aa110">map.h</a>
+</li>
+<li>ucx_map_new()
+: <a class="el" href="map_8h.html#a79f31de8b93814493759dbc8b940cf0c">map.h</a>
+</li>
+<li>ucx_map_new_a()
+: <a class="el" href="map_8h.html#aed508a94c66cc15372503c64b70eb03e">map.h</a>
+</li>
+<li>ucx_map_put()
+: <a class="el" href="map_8h.html#ac04a08b604217070254d4c58f0e82498">map.h</a>
+</li>
+<li>ucx_map_rehash()
+: <a class="el" href="map_8h.html#a174bce9fad554dd92b8da354e0d32512">map.h</a>
+</li>
+<li>ucx_map_remove()
+: <a class="el" href="map_8h.html#a17248a4888eb8f9ae18be522d64632aa">map.h</a>
+</li>
+<li>ucx_map_union()
+: <a class="el" href="map_8h.html#a3f65978c481af7f637cad021d93522d5">map.h</a>
+</li>
+<li>ucx_map_union_a()
+: <a class="el" href="map_8h.html#ab6370c3fa8113fdad593ce4b0460c9c6">map.h</a>
+</li>
+<li>ucx_memcpy()
+: <a class="el" href="utils_8h.html#ab2e184e6a744941aab6b8058116baf30">utils.h</a>
+</li>
+<li>ucx_mempool_calloc()
+: <a class="el" href="mempool_8h.html#a4b9142011824ae24f00fabe128417d69">mempool.h</a>
+</li>
+<li>ucx_mempool_chcap()
+: <a class="el" href="mempool_8h.html#aaf75b5016098723a9280531ccc3a6d77">mempool.h</a>
+</li>
+<li>ucx_mempool_destroy()
+: <a class="el" href="mempool_8h.html#af096378da7e9bfbed3088497cf4c15bf">mempool.h</a>
+</li>
+<li>ucx_mempool_free()
+: <a class="el" href="mempool_8h.html#aefa26e3015f5aefadbfc74221bd246ac">mempool.h</a>
+</li>
+<li>ucx_mempool_malloc()
+: <a class="el" href="mempool_8h.html#a2ae492b8f2878ccc9837ac213dced11e">mempool.h</a>
+</li>
+<li>ucx_mempool_new()
+: <a class="el" href="mempool_8h.html#ad71cb8c3b6fdb30360376a8b372ef22a">mempool.h</a>
+</li>
+<li>ucx_mempool_realloc()
+: <a class="el" href="mempool_8h.html#a660ef42520ed6737c2e77aae18e3a7a4">mempool.h</a>
+</li>
+<li>ucx_mempool_reg_destr()
+: <a class="el" href="mempool_8h.html#af47b6b7c40f8f263dc28cc9a4e77b27c">mempool.h</a>
+</li>
+<li>ucx_mempool_set_destr()
+: <a class="el" href="mempool_8h.html#adb788e7ec24cd7dbdea6381539c549f2">mempool.h</a>
+</li>
+<li>ucx_properties2map()
+: <a class="el" href="properties_8h.html#a5c7ff8bc3139960a3f3dc92072b742f3">properties.h</a>
+</li>
+<li>ucx_properties_fill()
+: <a class="el" href="properties_8h.html#aaf8de121764a4d22c763ff2ab41f3a4d">properties.h</a>
+</li>
+<li>ucx_properties_free()
+: <a class="el" href="properties_8h.html#a38a2fe7bb2986bd87c7e69356ab05c05">properties.h</a>
+</li>
+<li>ucx_properties_load()
+: <a class="el" href="properties_8h.html#ae1b600f839a6b2278b68fc314981a8a3">properties.h</a>
+</li>
+<li>ucx_properties_new()
+: <a class="el" href="properties_8h.html#a44d9dd12cab3aaa0084f1c8b89405796">properties.h</a>
+</li>
+<li>ucx_properties_next()
+: <a class="el" href="properties_8h.html#a7e03bc573d45d48c538cd721e810d33c">properties.h</a>
+</li>
+<li>ucx_properties_store()
+: <a class="el" href="properties_8h.html#a63c0c1b7648e675b21a1788917ff36fb">properties.h</a>
+</li>
+<li>ucx_sc2sc()
+: <a class="el" href="string_8h.html#a69d5e3eeec783cc43314df71248768f5">string.h</a>
+</li>
+<li>ucx_ss2c_s()
+: <a class="el" href="string_8h.html#aedeb5d7bddda54116101a8d68af8c56d">string.h</a>
+</li>
+<li>ucx_ss2sc()
+: <a class="el" href="string_8h.html#a9ce5ad1b2aa2dbeba204d452c2e64359">string.h</a>
+</li>
+<li>ucx_stack_avail()
+: <a class="el" href="stack_8h.html#a53cd2c7743dc8ad9cbd35ade0b4873e7">stack.h</a>
+</li>
+<li>ucx_stack_calloc()
+: <a class="el" href="stack_8h.html#afdc467524b5e19a9a777c6bc03e17174">stack.h</a>
+</li>
+<li>ucx_stack_free()
+: <a class="el" href="stack_8h.html#aabd55c14a3866b3782ba324f4d8b4c41">stack.h</a>
+</li>
+<li>ucx_stack_init()
+: <a class="el" href="stack_8h.html#abaef685df4e7ef95cd7218984a0618fe">stack.h</a>
+</li>
+<li>ucx_stack_malloc()
+: <a class="el" href="stack_8h.html#af865b416802140f6b6e8ab3626d7d1ac">stack.h</a>
+</li>
+<li>ucx_stack_popn()
+: <a class="el" href="stack_8h.html#a07ea48f28eab474dcfefbb86fa66ef81">stack.h</a>
+</li>
+<li>ucx_stack_push()
+: <a class="el" href="stack_8h.html#af85e6f77a8341beb6188f9ae1a8e9f92">stack.h</a>
+</li>
+<li>ucx_stack_pusharr()
+: <a class="el" href="stack_8h.html#a7bb138979191bba138e76ea37488fae2">stack.h</a>
+</li>
+<li>ucx_stack_realloc()
+: <a class="el" href="stack_8h.html#a0c678f96f6fabab49b2b034a1fe91c3a">stack.h</a>
+</li>
+<li>ucx_strcpy()
+: <a class="el" href="utils_8h.html#adeb6e8d0a53a829207cfa0a979d01fff">utils.h</a>
+</li>
+<li>ucx_stream_bncopy()
+: <a class="el" href="utils_8h.html#a114ee7f7da62656ffd35e2dc23394201">utils.h</a>
+</li>
+<li>ucx_szmul_impl()
+: <a class="el" href="ucx_8h.html#a6637171cc0ec097b297f731a3036dd3b">ucx.h</a>
+</li>
+<li>ucx_test_register()
+: <a class="el" href="test_8h.html#a8dfabc42f183d3a4d79379a5d17bf67d">test.h</a>
+</li>
+<li>ucx_test_run()
+: <a class="el" href="test_8h.html#a3721458deeecb43aa322428f007714c3">test.h</a>
+</li>
+<li>ucx_test_suite_free()
+: <a class="el" href="test_8h.html#a4a6ac61a6f72722273f8eaa7a343edde">test.h</a>
+</li>
+<li>ucx_test_suite_new()
+: <a class="el" href="test_8h.html#a531f0df90363e0befbe900878f65f09e">test.h</a>
+</li>
+<li>ucx_vasprintf()
+: <a class="el" href="utils_8h.html#a3ea1dfb856c741f3e8ec6bfdc9ad427e">utils.h</a>
+</li>
+<li>ucx_vfprintf()
+: <a class="el" href="utils_8h.html#a4907967beb92c3ae351dd239abbb6927">utils.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/globals_p.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,78 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_p"></a>- p -</h3><ul>
+<li>PRIsstr
+: <a class="el" href="string_8h.html#a7d5bc48708405a28b23667e32dfcecae">string.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/globals_r.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,78 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_r"></a>- r -</h3><ul>
+<li>read_func
+: <a class="el" href="ucx_8h.html#a6a67e255e460acb58f802067b3ff5fd5">ucx.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/globals_s.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,246 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_s"></a>- s -</h3><ul>
+<li>S
+: <a class="el" href="string_8h.html#a8fa17c8cf4c36df48f4108c36da8573e">string.h</a>
+</li>
+<li>SC
+: <a class="el" href="string_8h.html#a7d261dd0bc358c957a368bc058c1ce53">string.h</a>
+</li>
+<li>scstr()
+: <a class="el" href="string_8h.html#a2b1d6f1eca1c1549f37107b9c026c5a6">string.h</a>
+</li>
+<li>SCSTR
+: <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">string.h</a>
+</li>
+<li>scstrcasecmp()
+: <a class="el" href="string_8h.html#aca8142fb823d253054e17c17cfca05e0">string.h</a>
+</li>
+<li>scstrcaseprefix()
+: <a class="el" href="string_8h.html#a3718ef4aa1e86cdb26bda2f07fb585df">string.h</a>
+</li>
+<li>scstrcasesuffix()
+: <a class="el" href="string_8h.html#a6edb4b85f2b9efe79db7ffe6eccd7bc3">string.h</a>
+</li>
+<li>scstrcat()
+: <a class="el" href="string_8h.html#a7376842c19e954b49215da81ef76ac0c">string.h</a>
+</li>
+<li>scstrcat_a()
+: <a class="el" href="string_8h.html#abacce4cbd6f70fcb6453904ef08b02e9">string.h</a>
+</li>
+<li>scstrchr()
+: <a class="el" href="string_8h.html#a5836d6a7a744791c35e5c17bdc394a87">string.h</a>
+</li>
+<li>scstrcmp()
+: <a class="el" href="string_8h.html#af35272a8e5408c88ed3e25a3a98f0a82">string.h</a>
+</li>
+<li>scstrdup()
+: <a class="el" href="string_8h.html#a97dccce03af419596dbdd592ca46a164">string.h</a>
+</li>
+<li>scstrdup_a()
+: <a class="el" href="string_8h.html#a8fe58921f51eb1fde038472377e63014">string.h</a>
+</li>
+<li>scstrlower()
+: <a class="el" href="string_8h.html#abccf198bea3186ff2abb080cc88dcae6">string.h</a>
+</li>
+<li>scstrlower_a()
+: <a class="el" href="string_8h.html#a3cf1e557df7ab58d03c78832c4060276">string.h</a>
+</li>
+<li>scstrn()
+: <a class="el" href="string_8h.html#ae594f6e222ea394cef6a26c0dfad000d">string.h</a>
+</li>
+<li>scstrnlen()
+: <a class="el" href="string_8h.html#ac1b000030d6d197eec48c15a182055d5">string.h</a>
+</li>
+<li>scstrprefix()
+: <a class="el" href="string_8h.html#a599ddc2f88dd1df68b72eefd91347393">string.h</a>
+</li>
+<li>scstrrchr()
+: <a class="el" href="string_8h.html#ae389835b97cd9382e7d6a6a075323376">string.h</a>
+</li>
+<li>scstrscstr()
+: <a class="el" href="string_8h.html#a54f256c3abe811c52d58b4ff1b23f051">string.h</a>
+</li>
+<li>scstrsplit()
+: <a class="el" href="string_8h.html#ae71cac352b00230848bde358f0fb05ea">string.h</a>
+</li>
+<li>scstrsplit_a()
+: <a class="el" href="string_8h.html#a52906455ae530c9cdc6812c8e6d9bdef">string.h</a>
+</li>
+<li>scstrsstr()
+: <a class="el" href="string_8h.html#aa4362cb36c6629f9d8484739fd827748">string.h</a>
+</li>
+<li>scstrsubs()
+: <a class="el" href="string_8h.html#a9a6c8d8db0dda0037c3c852cce1a5060">string.h</a>
+</li>
+<li>scstrsubsl()
+: <a class="el" href="string_8h.html#ad50f0f67b906fad0744f46bcb51e144b">string.h</a>
+</li>
+<li>scstrsuffix()
+: <a class="el" href="string_8h.html#a1f0ae316a2afe85d5b4655e6ece6721a">string.h</a>
+</li>
+<li>scstrtrim()
+: <a class="el" href="string_8h.html#ad374b16eb1be8b48019debad9b9f268c">string.h</a>
+</li>
+<li>scstrupper()
+: <a class="el" href="string_8h.html#af3dd09ec9d11162fe0075f4e60f41240">string.h</a>
+</li>
+<li>scstrupper_a()
+: <a class="el" href="string_8h.html#aea94613eb74668cc05d365803d32bfad">string.h</a>
+</li>
+<li>SFMT
+: <a class="el" href="string_8h.html#a23ed51e87385886bb65e8cd19c839362">string.h</a>
+</li>
+<li>sstr()
+: <a class="el" href="string_8h.html#a539eb7059251a051ee5d179526a23e9a">string.h</a>
+</li>
+<li>sstrcasecmp
+: <a class="el" href="string_8h.html#a81b0f6df794152c2038703d4e9d0ad59">string.h</a>
+</li>
+<li>sstrcaseprefix
+: <a class="el" href="string_8h.html#acd3dc64e90db9b4046e14f115a815ff4">string.h</a>
+</li>
+<li>sstrcasesuffix
+: <a class="el" href="string_8h.html#a57eabd4862d531dd685bbf2feb8468bf">string.h</a>
+</li>
+<li>sstrcat
+: <a class="el" href="string_8h.html#a6af8a4c347c7fdb5980d4c4803be2759">string.h</a>
+</li>
+<li>sstrcat_a
+: <a class="el" href="string_8h.html#a6068d460f9bc05962666a917d26568b3">string.h</a>
+</li>
+<li>sstrchr()
+: <a class="el" href="string_8h.html#af80898a0b75955eb2579298c3ae2c481">string.h</a>
+</li>
+<li>sstrcmp
+: <a class="el" href="string_8h.html#a7ae7156c8de57454ca38d306100b8160">string.h</a>
+</li>
+<li>sstrdup
+: <a class="el" href="string_8h.html#accbfd2b459a028d7af9fb7df6f977d80">string.h</a>
+</li>
+<li>sstrdup_a
+: <a class="el" href="string_8h.html#a8d098baada4ea9ad5d8b6343b5aec007">string.h</a>
+</li>
+<li>sstrlower
+: <a class="el" href="string_8h.html#a89343ea3e719f00ee802b557db57b769">string.h</a>
+</li>
+<li>sstrlower_a
+: <a class="el" href="string_8h.html#a4bb4742fe71115f493991d307cb22b23">string.h</a>
+</li>
+<li>sstrn()
+: <a class="el" href="string_8h.html#a2744c38ac44abf3e01fa059056dcf36c">string.h</a>
+</li>
+<li>sstrnlen
+: <a class="el" href="string_8h.html#a33fa945acc5ac2ce962e5ef13cf1638c">string.h</a>
+</li>
+<li>sstrprefix
+: <a class="el" href="string_8h.html#a7d73b66256384b26927e787318fdefa2">string.h</a>
+</li>
+<li>sstrrchr()
+: <a class="el" href="string_8h.html#adae3f59957ca328e1da5285cb8b02a72">string.h</a>
+</li>
+<li>sstrscstr
+: <a class="el" href="string_8h.html#aa696932213265e10f864678686f4ccde">string.h</a>
+</li>
+<li>sstrsplit
+: <a class="el" href="string_8h.html#aa929984004c3576bfafb95031aca8eb7">string.h</a>
+</li>
+<li>sstrsplit_a
+: <a class="el" href="string_8h.html#ac9f69fa3a17e26a3a5f9d985b5844601">string.h</a>
+</li>
+<li>sstrstr
+: <a class="el" href="string_8h.html#a9d03be026afa9447c52bb34b9e3b895a">string.h</a>
+</li>
+<li>sstrsubs()
+: <a class="el" href="string_8h.html#a5eb9e0e1f26cf7fbecc038cd90e8b258">string.h</a>
+</li>
+<li>sstrsubsl()
+: <a class="el" href="string_8h.html#a78925c91af54f23cebd20ff99ef4331a">string.h</a>
+</li>
+<li>sstrsuffix
+: <a class="el" href="string_8h.html#ac6a5246f26be2e8a5f34d8995b7ec14e">string.h</a>
+</li>
+<li>sstrtrim()
+: <a class="el" href="string_8h.html#ae2d6da564d3fce51f2e0cac580fdbc56">string.h</a>
+</li>
+<li>sstrupper
+: <a class="el" href="string_8h.html#a084fe5a3a90d6fb6b15ecda03bb30824">string.h</a>
+</li>
+<li>sstrupper_a
+: <a class="el" href="string_8h.html#a5f0dd83c0176b812fb428004b2877a34">string.h</a>
+</li>
+<li>ST
+: <a class="el" href="string_8h.html#a9037956cca97a4e84b642f17f3d10378">string.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/globals_type.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,130 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;<ul>
+<li>cmp_func
+: <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">ucx.h</a>
+</li>
+<li>copy_func
+: <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">ucx.h</a>
+</li>
+<li>distance_func
+: <a class="el" href="ucx_8h.html#a0bc5bf89e556c1d45d10863d52728ac9">ucx.h</a>
+</li>
+<li>read_func
+: <a class="el" href="ucx_8h.html#a6a67e255e460acb58f802067b3ff5fd5">ucx.h</a>
+</li>
+<li>ucx_allocator_calloc
+: <a class="el" href="allocator_8h.html#a2c0aba4221c1ac6801f03ed799f15b12">allocator.h</a>
+</li>
+<li>ucx_allocator_free
+: <a class="el" href="allocator_8h.html#aaf2387ddaddd8ab4b267e6b00e5d6f7e">allocator.h</a>
+</li>
+<li>ucx_allocator_malloc
+: <a class="el" href="allocator_8h.html#a29f0f6a23a70db3b60635cd6dc384473">allocator.h</a>
+</li>
+<li>ucx_allocator_realloc
+: <a class="el" href="allocator_8h.html#a6d7cf038a806e327c5da37321d04e426">allocator.h</a>
+</li>
+<li>ucx_destructor
+: <a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx.h</a>
+</li>
+<li>UcxAVLNode
+: <a class="el" href="avl_8h.html#a08ba2496c2316df58548c3cc29712add">avl.h</a>
+</li>
+<li>UcxKey
+: <a class="el" href="map_8h.html#ad63828bb23123fc01a5315a2bac3b142">map.h</a>
+</li>
+<li>UcxList
+: <a class="el" href="list_8h.html#aa6f89f91c1081c9a7c6866c298f497a2">list.h</a>
+</li>
+<li>UcxMap
+: <a class="el" href="map_8h.html#a18e21948725b2da68c35da587a722033">map.h</a>
+</li>
+<li>UcxMapElement
+: <a class="el" href="map_8h.html#ad7d7a910a32113eb93eae11c3dc97b4b">map.h</a>
+</li>
+<li>UcxMapIterator
+: <a class="el" href="map_8h.html#ae36aff5f645948c54f51578b11fd87fb">map.h</a>
+</li>
+<li>UcxTest
+: <a class="el" href="test_8h.html#ae906817354c010b83c2784260cce7a1c">test.h</a>
+</li>
+<li>UcxTestList
+: <a class="el" href="test_8h.html#a8048c50ae73ea690b776edfd63bd6a5d">test.h</a>
+</li>
+<li>UcxTestSuite
+: <a class="el" href="test_8h.html#a52115d1d0f1c4a565ed6ef7c1bfd0363">test.h</a>
+</li>
+<li>write_func
+: <a class="el" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">ucx.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/globals_u.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,846 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_u"></a>- u -</h3><ul>
+<li>ucx_allocator_calloc
+: <a class="el" href="allocator_8h.html#a2c0aba4221c1ac6801f03ed799f15b12">allocator.h</a>
+</li>
+<li>UCX_ALLOCATOR_DEFAULT
+: <a class="el" href="allocator_8h.html#a1283a8f875f90a7af3aba5e031fc2e3f">allocator.h</a>
+</li>
+<li>ucx_allocator_free
+: <a class="el" href="allocator_8h.html#aaf2387ddaddd8ab4b267e6b00e5d6f7e">allocator.h</a>
+</li>
+<li>ucx_allocator_malloc
+: <a class="el" href="allocator_8h.html#a29f0f6a23a70db3b60635cd6dc384473">allocator.h</a>
+</li>
+<li>ucx_allocator_realloc
+: <a class="el" href="allocator_8h.html#a6d7cf038a806e327c5da37321d04e426">allocator.h</a>
+</li>
+<li>ucx_array_append_from()
+: <a class="el" href="array_8h.html#aea01731ad94ea73c0c8fb1d1b7a35fcf">array.h</a>
+</li>
+<li>ucx_array_at()
+: <a class="el" href="array_8h.html#aa698085fd1a8b70d6b709999c51b49e8">array.h</a>
+</li>
+<li>ucx_array_clone()
+: <a class="el" href="array_8h.html#a4a8c273370e4a3a3e2624e364f5ab410">array.h</a>
+</li>
+<li>ucx_array_concat()
+: <a class="el" href="array_8h.html#aa5a0bf3d3f0df6406beb0e569021cc28">array.h</a>
+</li>
+<li>ucx_array_contains()
+: <a class="el" href="array_8h.html#a5241058cd2329147bc5b1593ae7e51dc">array.h</a>
+</li>
+<li>ucx_array_destroy()
+: <a class="el" href="array_8h.html#a8e83681d8d5d8cddbf10f63ce5be4c10">array.h</a>
+</li>
+<li>ucx_array_equals()
+: <a class="el" href="array_8h.html#a43292b448adb1741677aa8c578bcc201">array.h</a>
+</li>
+<li>ucx_array_find()
+: <a class="el" href="array_8h.html#ae7bdbed94afee9b20b38b95e3ab470f0">array.h</a>
+</li>
+<li>ucx_array_free()
+: <a class="el" href="array_8h.html#ac01ee914468a16f470bf3071fffbe438">array.h</a>
+</li>
+<li>ucx_array_grow()
+: <a class="el" href="array_8h.html#ab0cbf243824aaebee48277315e03afce">array.h</a>
+</li>
+<li>ucx_array_init()
+: <a class="el" href="array_8h.html#ad921e85c28ffae32230777a53c5037e5">array.h</a>
+</li>
+<li>ucx_array_init_a()
+: <a class="el" href="array_8h.html#a2451e61ebb15a7ba1c1319267ba75b8c">array.h</a>
+</li>
+<li>ucx_array_new()
+: <a class="el" href="array_8h.html#a994a2fbf1c33a3833e2a70cd9a4352b7">array.h</a>
+</li>
+<li>ucx_array_new_a()
+: <a class="el" href="array_8h.html#a177170258c215eb2e4f5a32e59f0cb1b">array.h</a>
+</li>
+<li>ucx_array_prepend_from()
+: <a class="el" href="array_8h.html#a95b52acc2193b5c33cf0eaa4f2082477">array.h</a>
+</li>
+<li>ucx_array_remove()
+: <a class="el" href="array_8h.html#aa45eac6b697f83adac81c0860cf306b8">array.h</a>
+</li>
+<li>ucx_array_remove_fast()
+: <a class="el" href="array_8h.html#a548d81b07612bae3ba8c4c4b49104b8e">array.h</a>
+</li>
+<li>ucx_array_reserve()
+: <a class="el" href="array_8h.html#a1c3bf8433c1de3c933f3854ab297fe1d">array.h</a>
+</li>
+<li>ucx_array_resize()
+: <a class="el" href="array_8h.html#a27762e7c06a6c781015e3c8ceeee0ce3">array.h</a>
+</li>
+<li>ucx_array_set_from()
+: <a class="el" href="array_8h.html#a1bb545d065358d265d80d815ba382a28">array.h</a>
+</li>
+<li>ucx_array_shrink()
+: <a class="el" href="array_8h.html#a2daf50e80aee9bccebee876a7efd2dfc">array.h</a>
+</li>
+<li>ucx_array_sort()
+: <a class="el" href="array_8h.html#add773514569b872a6624381b4b6af52c">array.h</a>
+</li>
+<li>ucx_array_util_set
+: <a class="el" href="array_8h.html#a1d959c29af3125bdd37cde3a554e729c">array.h</a>
+</li>
+<li>ucx_array_util_set_a()
+: <a class="el" href="array_8h.html#ad0a8d76980cf1c1910e64a245803fb9a">array.h</a>
+</li>
+<li>ucx_array_util_setptr
+: <a class="el" href="array_8h.html#a59a5b342965e790945f9c7a3f86b99f9">array.h</a>
+</li>
+<li>ucx_array_util_setptr_a()
+: <a class="el" href="array_8h.html#ad708b333c0c1b02c998309a58ea65e31">array.h</a>
+</li>
+<li>ucx_asprintf()
+: <a class="el" href="utils_8h.html#a9f9cf0e89ffdc256ecb35429907f51f5">utils.h</a>
+</li>
+<li>ucx_avl_count()
+: <a class="el" href="avl_8h.html#a92c1d41c2b22fe4a029a486ab2153e35">avl.h</a>
+</li>
+<li>ucx_avl_default_new
+: <a class="el" href="avl_8h.html#ac2886d4b79b48c9fabf6408873f84cd2">avl.h</a>
+</li>
+<li>ucx_avl_find()
+: <a class="el" href="avl_8h.html#a51770e1614b28d7d22dea096c3704f83">avl.h</a>
+</li>
+<li>UCX_AVL_FIND_CLOSEST
+: <a class="el" href="avl_8h.html#af16f24d74fd6af0154de041566c6603b">avl.h</a>
+</li>
+<li>UCX_AVL_FIND_EXACT
+: <a class="el" href="avl_8h.html#aaaf4a6f6f661cda7791db239212285d9">avl.h</a>
+</li>
+<li>UCX_AVL_FIND_LOWER_BOUNDED
+: <a class="el" href="avl_8h.html#abd2446d544d5412b6997ee8a17bd368c">avl.h</a>
+</li>
+<li>ucx_avl_find_node()
+: <a class="el" href="avl_8h.html#a664986f64d6865605199fbff06e19cd5">avl.h</a>
+</li>
+<li>UCX_AVL_FIND_UPPER_BOUNDED
+: <a class="el" href="avl_8h.html#ac74ee7649c1e206b08b31f37dd68ca5e">avl.h</a>
+</li>
+<li>ucx_avl_free()
+: <a class="el" href="avl_8h.html#a2f92db538f25fce908d2cb3e5590944c">avl.h</a>
+</li>
+<li>ucx_avl_free_content()
+: <a class="el" href="avl_8h.html#a31ad7fb196ca211f1fc39f4e15f72279">avl.h</a>
+</li>
+<li>ucx_avl_get()
+: <a class="el" href="avl_8h.html#adbcf7ceb3f014a30c7214f7304519efe">avl.h</a>
+</li>
+<li>ucx_avl_get_node()
+: <a class="el" href="avl_8h.html#acf42da9a4168e47dc10b4ba0d27ceb4e">avl.h</a>
+</li>
+<li>ucx_avl_new()
+: <a class="el" href="avl_8h.html#a11b043d65a11b7092d5d98b298e5ede3">avl.h</a>
+</li>
+<li>ucx_avl_new_a()
+: <a class="el" href="avl_8h.html#af0f868d67e9dc08b4867c02a06c23ee2">avl.h</a>
+</li>
+<li>ucx_avl_pred()
+: <a class="el" href="avl_8h.html#a0e739aeb66dda6a6a3f6eb51b50cf346">avl.h</a>
+</li>
+<li>ucx_avl_put()
+: <a class="el" href="avl_8h.html#aec401fab4a24a7edffa734f9baf88577">avl.h</a>
+</li>
+<li>ucx_avl_put_s()
+: <a class="el" href="avl_8h.html#a32cf8955cc0226a82bacfc7b76d6474c">avl.h</a>
+</li>
+<li>ucx_avl_remove()
+: <a class="el" href="avl_8h.html#a1d821119c805d7fbb7e424bc3effeba9">avl.h</a>
+</li>
+<li>ucx_avl_remove_node()
+: <a class="el" href="avl_8h.html#a9a792b7d9e58073deef74a341f8bc720">avl.h</a>
+</li>
+<li>ucx_avl_remove_s()
+: <a class="el" href="avl_8h.html#a01aeeecd6415f0cc2b623486eb28f254">avl.h</a>
+</li>
+<li>ucx_avl_succ()
+: <a class="el" href="avl_8h.html#aab1ad9b027ff5e50671aa0ee84e2d541">avl.h</a>
+</li>
+<li>ucx_bprintf
+: <a class="el" href="utils_8h.html#a9d7d65a420f026fcb6982803d5120519">utils.h</a>
+</li>
+<li>UCX_BUFFER_AUTOEXTEND
+: <a class="el" href="buffer_8h.html#a05f9565f2d04399168c3b1c152a632be">buffer.h</a>
+</li>
+<li>UCX_BUFFER_AUTOFREE
+: <a class="el" href="buffer_8h.html#a8bab11ad8a76719228b9ee91e2e45535">buffer.h</a>
+</li>
+<li>ucx_buffer_clear
+: <a class="el" href="buffer_8h.html#a374abd5aabfcc3ee0777a79d5fe651ab">buffer.h</a>
+</li>
+<li>ucx_buffer_clone
+: <a class="el" href="buffer_8h.html#a828353846428c2c2f695f9938f059e52">buffer.h</a>
+</li>
+<li>UCX_BUFFER_DEFAULT
+: <a class="el" href="buffer_8h.html#acc77c8ed7b26854f555d4a5d11e49ea2">buffer.h</a>
+</li>
+<li>ucx_buffer_eof()
+: <a class="el" href="buffer_8h.html#abad7fd9ad5061224c780b8d1d4c55f09">buffer.h</a>
+</li>
+<li>ucx_buffer_extend()
+: <a class="el" href="buffer_8h.html#afaf97d2cd7e9faad79a9d35fe33e30c6">buffer.h</a>
+</li>
+<li>ucx_buffer_extract()
+: <a class="el" href="buffer_8h.html#a33fa7bb35fe08bbb3542f227514332ef">buffer.h</a>
+</li>
+<li>ucx_buffer_free()
+: <a class="el" href="buffer_8h.html#a2af8646d8905c22c7322e7540b0440af">buffer.h</a>
+</li>
+<li>ucx_buffer_getc()
+: <a class="el" href="buffer_8h.html#a396339022159ce4ca6d069de9f9209b0">buffer.h</a>
+</li>
+<li>ucx_buffer_new()
+: <a class="el" href="buffer_8h.html#aacea876d692193ec6f859ce98da7351c">buffer.h</a>
+</li>
+<li>ucx_buffer_putc()
+: <a class="el" href="buffer_8h.html#a7d6f01b9d631b0123475dfb98fb849ac">buffer.h</a>
+</li>
+<li>ucx_buffer_puts()
+: <a class="el" href="buffer_8h.html#af1d4b478e04b3ae0bf30e7c2ea964ea2">buffer.h</a>
+</li>
+<li>ucx_buffer_read()
+: <a class="el" href="buffer_8h.html#ae5c3430759f0059547b35d5a254d4da5">buffer.h</a>
+</li>
+<li>ucx_buffer_seek()
+: <a class="el" href="buffer_8h.html#a47d98482662073c74f35deb0957d15d1">buffer.h</a>
+</li>
+<li>ucx_buffer_shift()
+: <a class="el" href="buffer_8h.html#a12a0c6a2379ef080043e6286bb8bad69">buffer.h</a>
+</li>
+<li>ucx_buffer_shift_left()
+: <a class="el" href="buffer_8h.html#a20431dd0ed6a6fe9f15333bd72afe4db">buffer.h</a>
+</li>
+<li>ucx_buffer_shift_right()
+: <a class="el" href="buffer_8h.html#a4fa10b6471495547eb981248fd4f1bc2">buffer.h</a>
+</li>
+<li>ucx_buffer_to_sstr
+: <a class="el" href="buffer_8h.html#a0f4b64f1b3a74c4f6c5d9409d6b6086a">buffer.h</a>
+</li>
+<li>ucx_buffer_write()
+: <a class="el" href="buffer_8h.html#af8aacc7401814392b58c1b7b81bffc05">buffer.h</a>
+</li>
+<li>ucx_cmp_double()
+: <a class="el" href="utils_8h.html#ab804b7c27d0bfcd7bf3a3583140825b6">utils.h</a>
+</li>
+<li>ucx_cmp_float()
+: <a class="el" href="utils_8h.html#ad1196b561bcdad76c393885819769a97">utils.h</a>
+</li>
+<li>ucx_cmp_int()
+: <a class="el" href="utils_8h.html#a8ce7e11e6b3deafe89a32a091fde7f16">utils.h</a>
+</li>
+<li>ucx_cmp_int16()
+: <a class="el" href="utils_8h.html#aa29e6e559946375e34113e34e0b0bd0d">utils.h</a>
+</li>
+<li>ucx_cmp_int32()
+: <a class="el" href="utils_8h.html#a858b2ac443fb202643b71f6a7e9218dd">utils.h</a>
+</li>
+<li>ucx_cmp_int64()
+: <a class="el" href="utils_8h.html#a54701aea6a89fed1402dfb0bf56bc7f6">utils.h</a>
+</li>
+<li>ucx_cmp_longint()
+: <a class="el" href="utils_8h.html#aeb57a2b9a6aaa0460c7a6bec29accf2c">utils.h</a>
+</li>
+<li>ucx_cmp_longlong()
+: <a class="el" href="utils_8h.html#a366b57def20f86a41eaedf575eea5375">utils.h</a>
+</li>
+<li>ucx_cmp_mem()
+: <a class="el" href="utils_8h.html#aff7d2bcded71196831a8c0664333f8e7">utils.h</a>
+</li>
+<li>ucx_cmp_ptr()
+: <a class="el" href="utils_8h.html#aa174d539de3ea59be4f9640f17ce53d8">utils.h</a>
+</li>
+<li>ucx_cmp_sstr()
+: <a class="el" href="utils_8h.html#adee0739589166d272f8cb7c23aabf8ba">utils.h</a>
+</li>
+<li>ucx_cmp_str()
+: <a class="el" href="utils_8h.html#aa6a37b9d172b6a5b2803d152f9e1b258">utils.h</a>
+</li>
+<li>ucx_cmp_strn()
+: <a class="el" href="utils_8h.html#ac6b354a878f551a3a5b20a167db3f308">utils.h</a>
+</li>
+<li>ucx_cmp_uint()
+: <a class="el" href="utils_8h.html#abd83a5da91c3dd026a6931bd80c12f1e">utils.h</a>
+</li>
+<li>ucx_cmp_uint16()
+: <a class="el" href="utils_8h.html#acde5366437e886a459b7468f7a9e11f0">utils.h</a>
+</li>
+<li>ucx_cmp_uint32()
+: <a class="el" href="utils_8h.html#a5879d1722330355914d8c9146fa549d3">utils.h</a>
+</li>
+<li>ucx_cmp_uint64()
+: <a class="el" href="utils_8h.html#a1572a78b5b42f7151a5b2a5a7283d62d">utils.h</a>
+</li>
+<li>ucx_cmp_ulongint()
+: <a class="el" href="utils_8h.html#a3f3cbae2594d6f722bae29acb0408a24">utils.h</a>
+</li>
+<li>ucx_cmp_ulonglong()
+: <a class="el" href="utils_8h.html#a6acfc359421f21f9a042a654ff7faac5">utils.h</a>
+</li>
+<li>ucx_default_allocator()
+: <a class="el" href="allocator_8h.html#a98d2f1b341118b7a0e341fda5d8b2ebf">allocator.h</a>
+</li>
+<li>ucx_default_calloc()
+: <a class="el" href="allocator_8h.html#a3a0bfdd13d887012309c459b339f338f">allocator.h</a>
+</li>
+<li>ucx_default_free()
+: <a class="el" href="allocator_8h.html#a646d83aaaadfe33ae414c0fad8bfc52a">allocator.h</a>
+</li>
+<li>ucx_default_malloc()
+: <a class="el" href="allocator_8h.html#a96403ebf3d2312d95f2fe7627a1cdbc0">allocator.h</a>
+</li>
+<li>ucx_default_realloc()
+: <a class="el" href="allocator_8h.html#a47cfc8af626a86fcb93a2b14b90498ed">allocator.h</a>
+</li>
+<li>ucx_destructor
+: <a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx.h</a>
+</li>
+<li>ucx_dist_int()
+: <a class="el" href="utils_8h.html#a4ab6753739d56c09cdf6079fdcabf7c6">utils.h</a>
+</li>
+<li>ucx_dist_int16()
+: <a class="el" href="utils_8h.html#a81fb8434b70ca11bf2c14abfa21d16a9">utils.h</a>
+</li>
+<li>ucx_dist_int32()
+: <a class="el" href="utils_8h.html#ab4a659cc46096f0490c1dafa57726476">utils.h</a>
+</li>
+<li>ucx_dist_int64()
+: <a class="el" href="utils_8h.html#a54e7d06585bad3a899befc4e9c13853f">utils.h</a>
+</li>
+<li>ucx_dist_longint()
+: <a class="el" href="utils_8h.html#a43e73d288b1553a0078bf4c98dd341f5">utils.h</a>
+</li>
+<li>ucx_dist_longlong()
+: <a class="el" href="utils_8h.html#a306778414a2427951ea263be92368627">utils.h</a>
+</li>
+<li>ucx_dist_uint()
+: <a class="el" href="utils_8h.html#a37b7d471ca1679992afc11a0deda45f4">utils.h</a>
+</li>
+<li>ucx_dist_uint16()
+: <a class="el" href="utils_8h.html#a66e00a0703cbcde050ec922578e2f080">utils.h</a>
+</li>
+<li>ucx_dist_uint32()
+: <a class="el" href="utils_8h.html#add2b5c5507caba59d894b84e056b079b">utils.h</a>
+</li>
+<li>ucx_dist_uint64()
+: <a class="el" href="utils_8h.html#a3ba75e2e0b2479eef2b22fb219b42da7">utils.h</a>
+</li>
+<li>ucx_dist_ulongint()
+: <a class="el" href="utils_8h.html#abb13476228d0c16bfaba08469adbae2d">utils.h</a>
+</li>
+<li>ucx_dist_ulonglong()
+: <a class="el" href="utils_8h.html#a59a5859272cb4b43cbdd58208c41e32b">utils.h</a>
+</li>
+<li>UCX_FOREACH
+: <a class="el" href="list_8h.html#a4b143b6526a410aa4d22cb3bb9365d70">list.h</a>
+</li>
+<li>ucx_fprintf()
+: <a class="el" href="utils_8h.html#aa0bec80e1c67f769ff5e112a7d4ce72a">utils.h</a>
+</li>
+<li>ucx_hash()
+: <a class="el" href="map_8h.html#aea3be97254c05595d986ef6a9faae87b">map.h</a>
+</li>
+<li>ucx_key()
+: <a class="el" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">map.h</a>
+</li>
+<li>ucx_list_append()
+: <a class="el" href="list_8h.html#a00c122c8a26d35b60676939df4161621">list.h</a>
+</li>
+<li>ucx_list_append_a()
+: <a class="el" href="list_8h.html#adf3b3e2e0ff977d8928671d6bd82fc60">list.h</a>
+</li>
+<li>ucx_list_clone()
+: <a class="el" href="list_8h.html#ae7054a41c289b24e6caf5cb07ac850ed">list.h</a>
+</li>
+<li>ucx_list_clone_a()
+: <a class="el" href="list_8h.html#a08ca1ba0d2e82258b0408714c1f4c425">list.h</a>
+</li>
+<li>ucx_list_concat()
+: <a class="el" href="list_8h.html#a77163a0cc82fae52bec26c8c0c3674d9">list.h</a>
+</li>
+<li>ucx_list_contains()
+: <a class="el" href="list_8h.html#a8b0fa051fcfe12e1a82cca1087973852">list.h</a>
+</li>
+<li>ucx_list_difference()
+: <a class="el" href="list_8h.html#a6c5db5d1d11ad28b6fe1a80ee1c1e449">list.h</a>
+</li>
+<li>ucx_list_difference_a()
+: <a class="el" href="list_8h.html#a4a2a2fc5cc41073c516db6235bbc51d5">list.h</a>
+</li>
+<li>ucx_list_equals()
+: <a class="el" href="list_8h.html#adc435447cecf885bc63d232191085bbe">list.h</a>
+</li>
+<li>ucx_list_find()
+: <a class="el" href="list_8h.html#a9b3b6842d3be572e06a7f519e198cb83">list.h</a>
+</li>
+<li>ucx_list_first()
+: <a class="el" href="list_8h.html#a6aa0e34ebc5f0dca6f52d0f7626b4bd5">list.h</a>
+</li>
+<li>ucx_list_free()
+: <a class="el" href="list_8h.html#a1a0fa2c5b1e478a96da19b0c3f013668">list.h</a>
+</li>
+<li>ucx_list_free_a()
+: <a class="el" href="list_8h.html#a944e11f76c38767cd1100d72a4e3b25b">list.h</a>
+</li>
+<li>ucx_list_free_content()
+: <a class="el" href="list_8h.html#a4ba6c96642f72ea046cc22627c72979c">list.h</a>
+</li>
+<li>ucx_list_get()
+: <a class="el" href="list_8h.html#a2509ffe19bce6a8708c77f89480c75fb">list.h</a>
+</li>
+<li>ucx_list_indexof()
+: <a class="el" href="list_8h.html#ae2ff2974812ca185870f80bc4ed9337e">list.h</a>
+</li>
+<li>ucx_list_intersection()
+: <a class="el" href="list_8h.html#a259f9b754978aeca23dfabba16e20f39">list.h</a>
+</li>
+<li>ucx_list_intersection_a()
+: <a class="el" href="list_8h.html#a1d0b00514dbb81ba6270b58da0c5b9a8">list.h</a>
+</li>
+<li>ucx_list_last()
+: <a class="el" href="list_8h.html#add5ec40c5006e29c629d23c2eb5a6553">list.h</a>
+</li>
+<li>ucx_list_prepend()
+: <a class="el" href="list_8h.html#a8fcb68e4556395b15180eec2d0b77aa4">list.h</a>
+</li>
+<li>ucx_list_prepend_a()
+: <a class="el" href="list_8h.html#a54654e6dc60e1c3de9e886c150e404ec">list.h</a>
+</li>
+<li>ucx_list_remove()
+: <a class="el" href="list_8h.html#a410cb3e8260037ba56c72d14b899b468">list.h</a>
+</li>
+<li>ucx_list_remove_a()
+: <a class="el" href="list_8h.html#aca687b7c4e7170175f447e549125aa52">list.h</a>
+</li>
+<li>ucx_list_size()
+: <a class="el" href="list_8h.html#ae88001cc8ae40b946560f31434abed8f">list.h</a>
+</li>
+<li>ucx_list_sort()
+: <a class="el" href="list_8h.html#ac74962d9bd7cfc9d3e2e09651469377b">list.h</a>
+</li>
+<li>ucx_list_union()
+: <a class="el" href="list_8h.html#a94ecdb0cea1633ad7074f027fa8485fa">list.h</a>
+</li>
+<li>ucx_list_union_a()
+: <a class="el" href="list_8h.html#a65b4355536f4ebc4130211b46469f4c1">list.h</a>
+</li>
+<li>UCX_LOGGER_DEBUG
+: <a class="el" href="logging_8h.html#acff01d1ef919ea997cfce755fc1b83d8">logging.h</a>
+</li>
+<li>ucx_logger_debug
+: <a class="el" href="logging_8h.html#a2936402799892db5138e5f1f8c25db0c">logging.h</a>
+</li>
+<li>ucx_logger_error
+: <a class="el" href="logging_8h.html#a6a9e472e14d6768e59d96d245e065397">logging.h</a>
+</li>
+<li>UCX_LOGGER_ERROR
+: <a class="el" href="logging_8h.html#aa254c07fe3a907613e2256a318d5c9a8">logging.h</a>
+</li>
+<li>ucx_logger_free()
+: <a class="el" href="logging_8h.html#ac4697b784e01ec990d2acea192e21658">logging.h</a>
+</li>
+<li>UCX_LOGGER_INFO
+: <a class="el" href="logging_8h.html#a4b0178bf60a6129373ffc59114ca4c9b">logging.h</a>
+</li>
+<li>ucx_logger_info
+: <a class="el" href="logging_8h.html#a98464d8d51376ce2716dcc4eca00d5da">logging.h</a>
+</li>
+<li>UCX_LOGGER_LEVEL
+: <a class="el" href="logging_8h.html#aee18bc20e58ffb69910121512c350839">logging.h</a>
+</li>
+<li>ucx_logger_log
+: <a class="el" href="logging_8h.html#aa0245325031d95799b28def177fd14ec">logging.h</a>
+</li>
+<li>ucx_logger_logf()
+: <a class="el" href="logging_8h.html#ac337e5d02ebea565012d4c11bd643801">logging.h</a>
+</li>
+<li>ucx_logger_new()
+: <a class="el" href="logging_8h.html#ac560f8517d2172794c9d2691735ec48c">logging.h</a>
+</li>
+<li>ucx_logger_register_level
+: <a class="el" href="logging_8h.html#a5cffc19502c4c90bfb3bd3bbcd18170a">logging.h</a>
+</li>
+<li>UCX_LOGGER_SOURCE
+: <a class="el" href="logging_8h.html#a0e0d72b12616c1e49ff8834eaf4cb8a2">logging.h</a>
+</li>
+<li>UCX_LOGGER_TIMESTAMP
+: <a class="el" href="logging_8h.html#a38607008268b4f776ee500fb95d2e823">logging.h</a>
+</li>
+<li>UCX_LOGGER_TRACE
+: <a class="el" href="logging_8h.html#a55b88d1fec7036d841b3ddd6195c5586">logging.h</a>
+</li>
+<li>ucx_logger_trace
+: <a class="el" href="logging_8h.html#a3031b7ff13f4cfae9c2916543be2877c">logging.h</a>
+</li>
+<li>ucx_logger_warn
+: <a class="el" href="logging_8h.html#aca7bd861b646892813fd7310c0aa69af">logging.h</a>
+</li>
+<li>UCX_LOGGER_WARN
+: <a class="el" href="logging_8h.html#abd01ca11486226ba34e8f7028d9fffba">logging.h</a>
+</li>
+<li>ucx_map_clear()
+: <a class="el" href="map_8h.html#a285e90e40681c6d9631c935dda0967f2">map.h</a>
+</li>
+<li>ucx_map_clone()
+: <a class="el" href="map_8h.html#a62c6c30cbb0d824ba710f5030ff9a4e4">map.h</a>
+</li>
+<li>ucx_map_clone_a()
+: <a class="el" href="map_8h.html#a9aea9103703d5c168420bb6bf85549ea">map.h</a>
+</li>
+<li>ucx_map_copy()
+: <a class="el" href="map_8h.html#adfeb2d61003fd2896bcfdc9a57f36425">map.h</a>
+</li>
+<li>ucx_map_cstr_get
+: <a class="el" href="map_8h.html#a64e1fb55498fa502dd2ed8ed69062cdd">map.h</a>
+</li>
+<li>ucx_map_cstr_put
+: <a class="el" href="map_8h.html#ad9356b01425b934ab237b52339ac0cc3">map.h</a>
+</li>
+<li>ucx_map_cstr_remove
+: <a class="el" href="map_8h.html#a9c4405a5a75ecf64e2ef3d0c6501a9fe">map.h</a>
+</li>
+<li>ucx_map_difference()
+: <a class="el" href="map_8h.html#a774fcff87d1e58b6c5af77dd19a8c3dc">map.h</a>
+</li>
+<li>ucx_map_difference_a()
+: <a class="el" href="map_8h.html#ad0ba103494247d798ac3037c50fc8831">map.h</a>
+</li>
+<li>UCX_MAP_FOREACH
+: <a class="el" href="map_8h.html#a940896c4aa1b13e54c55c04c3efc186b">map.h</a>
+</li>
+<li>ucx_map_free()
+: <a class="el" href="map_8h.html#abe3d9688e4224bf7bb962abf25ff8c2e">map.h</a>
+</li>
+<li>ucx_map_free_content()
+: <a class="el" href="map_8h.html#a750f3d9d83e2f3788a14c17a9d160618">map.h</a>
+</li>
+<li>ucx_map_get()
+: <a class="el" href="map_8h.html#ab61192c5af2e06ecb9ad73880d1c95a6">map.h</a>
+</li>
+<li>ucx_map_int_get
+: <a class="el" href="map_8h.html#aa1681bd2178553cd092fd24c4d681d3c">map.h</a>
+</li>
+<li>ucx_map_int_put
+: <a class="el" href="map_8h.html#aaa30af79b4068c923895619e83f44367">map.h</a>
+</li>
+<li>ucx_map_int_remove
+: <a class="el" href="map_8h.html#aa767958b5468737755c09f7185b1770c">map.h</a>
+</li>
+<li>ucx_map_intersection()
+: <a class="el" href="map_8h.html#aa594d7a5afebc3bed6bb265348cf6b0d">map.h</a>
+</li>
+<li>ucx_map_intersection_a()
+: <a class="el" href="map_8h.html#a169e0470a20484dd76425fdf77e3651e">map.h</a>
+</li>
+<li>ucx_map_iter_next()
+: <a class="el" href="map_8h.html#aceb8675abf44860b4bbc301bbada5b91">map.h</a>
+</li>
+<li>ucx_map_iterator()
+: <a class="el" href="map_8h.html#a9150e9c64fdf4dfcc2cad106b91aa110">map.h</a>
+</li>
+<li>ucx_map_new()
+: <a class="el" href="map_8h.html#a79f31de8b93814493759dbc8b940cf0c">map.h</a>
+</li>
+<li>ucx_map_new_a()
+: <a class="el" href="map_8h.html#aed508a94c66cc15372503c64b70eb03e">map.h</a>
+</li>
+<li>ucx_map_put()
+: <a class="el" href="map_8h.html#ac04a08b604217070254d4c58f0e82498">map.h</a>
+</li>
+<li>ucx_map_rehash()
+: <a class="el" href="map_8h.html#a174bce9fad554dd92b8da354e0d32512">map.h</a>
+</li>
+<li>ucx_map_remove()
+: <a class="el" href="map_8h.html#a17248a4888eb8f9ae18be522d64632aa">map.h</a>
+</li>
+<li>ucx_map_sstr_get
+: <a class="el" href="map_8h.html#a14d385f6b7f371f0507861cabd2eab4e">map.h</a>
+</li>
+<li>ucx_map_sstr_put
+: <a class="el" href="map_8h.html#ac26a8615bfc8f47ee9eaceb47645f98e">map.h</a>
+</li>
+<li>ucx_map_sstr_remove
+: <a class="el" href="map_8h.html#a48700ea86fadb9ea54d13010f9124df2">map.h</a>
+</li>
+<li>ucx_map_union()
+: <a class="el" href="map_8h.html#a3f65978c481af7f637cad021d93522d5">map.h</a>
+</li>
+<li>ucx_map_union_a()
+: <a class="el" href="map_8h.html#ab6370c3fa8113fdad593ce4b0460c9c6">map.h</a>
+</li>
+<li>ucx_memcpy()
+: <a class="el" href="utils_8h.html#ab2e184e6a744941aab6b8058116baf30">utils.h</a>
+</li>
+<li>ucx_mempool_calloc()
+: <a class="el" href="mempool_8h.html#a4b9142011824ae24f00fabe128417d69">mempool.h</a>
+</li>
+<li>ucx_mempool_chcap()
+: <a class="el" href="mempool_8h.html#aaf75b5016098723a9280531ccc3a6d77">mempool.h</a>
+</li>
+<li>ucx_mempool_destroy()
+: <a class="el" href="mempool_8h.html#af096378da7e9bfbed3088497cf4c15bf">mempool.h</a>
+</li>
+<li>ucx_mempool_free()
+: <a class="el" href="mempool_8h.html#aefa26e3015f5aefadbfc74221bd246ac">mempool.h</a>
+</li>
+<li>ucx_mempool_malloc()
+: <a class="el" href="mempool_8h.html#a2ae492b8f2878ccc9837ac213dced11e">mempool.h</a>
+</li>
+<li>ucx_mempool_new()
+: <a class="el" href="mempool_8h.html#ad71cb8c3b6fdb30360376a8b372ef22a">mempool.h</a>
+</li>
+<li>ucx_mempool_new_default
+: <a class="el" href="mempool_8h.html#a49f7bd1da5ac201d0cf54dc0f0d82dd2">mempool.h</a>
+</li>
+<li>ucx_mempool_realloc()
+: <a class="el" href="mempool_8h.html#a660ef42520ed6737c2e77aae18e3a7a4">mempool.h</a>
+</li>
+<li>ucx_mempool_reg_destr()
+: <a class="el" href="mempool_8h.html#af47b6b7c40f8f263dc28cc9a4e77b27c">mempool.h</a>
+</li>
+<li>ucx_mempool_set_destr()
+: <a class="el" href="mempool_8h.html#adb788e7ec24cd7dbdea6381539c549f2">mempool.h</a>
+</li>
+<li>ucx_properties2map()
+: <a class="el" href="properties_8h.html#a5c7ff8bc3139960a3f3dc92072b742f3">properties.h</a>
+</li>
+<li>ucx_properties_fill()
+: <a class="el" href="properties_8h.html#aaf8de121764a4d22c763ff2ab41f3a4d">properties.h</a>
+</li>
+<li>ucx_properties_free()
+: <a class="el" href="properties_8h.html#a38a2fe7bb2986bd87c7e69356ab05c05">properties.h</a>
+</li>
+<li>ucx_properties_load()
+: <a class="el" href="properties_8h.html#ae1b600f839a6b2278b68fc314981a8a3">properties.h</a>
+</li>
+<li>ucx_properties_new()
+: <a class="el" href="properties_8h.html#a44d9dd12cab3aaa0084f1c8b89405796">properties.h</a>
+</li>
+<li>ucx_properties_next()
+: <a class="el" href="properties_8h.html#a7e03bc573d45d48c538cd721e810d33c">properties.h</a>
+</li>
+<li>ucx_properties_store()
+: <a class="el" href="properties_8h.html#a63c0c1b7648e675b21a1788917ff36fb">properties.h</a>
+</li>
+<li>ucx_sc2sc()
+: <a class="el" href="string_8h.html#a69d5e3eeec783cc43314df71248768f5">string.h</a>
+</li>
+<li>ucx_sprintf
+: <a class="el" href="utils_8h.html#af9f333b66ecd639c347c7235f4992e2e">utils.h</a>
+</li>
+<li>ucx_ss2c_s()
+: <a class="el" href="string_8h.html#aedeb5d7bddda54116101a8d68af8c56d">string.h</a>
+</li>
+<li>ucx_ss2sc()
+: <a class="el" href="string_8h.html#a9ce5ad1b2aa2dbeba204d452c2e64359">string.h</a>
+</li>
+<li>ucx_stack_avail()
+: <a class="el" href="stack_8h.html#a53cd2c7743dc8ad9cbd35ade0b4873e7">stack.h</a>
+</li>
+<li>ucx_stack_calloc()
+: <a class="el" href="stack_8h.html#afdc467524b5e19a9a777c6bc03e17174">stack.h</a>
+</li>
+<li>ucx_stack_dim
+: <a class="el" href="stack_8h.html#a3b761343c6491222604341ebfa443226">stack.h</a>
+</li>
+<li>ucx_stack_empty
+: <a class="el" href="stack_8h.html#a4f7239dbd6c032c56812e370b71c1985">stack.h</a>
+</li>
+<li>ucx_stack_free()
+: <a class="el" href="stack_8h.html#aabd55c14a3866b3782ba324f4d8b4c41">stack.h</a>
+</li>
+<li>ucx_stack_init()
+: <a class="el" href="stack_8h.html#abaef685df4e7ef95cd7218984a0618fe">stack.h</a>
+</li>
+<li>ucx_stack_malloc()
+: <a class="el" href="stack_8h.html#af865b416802140f6b6e8ab3626d7d1ac">stack.h</a>
+</li>
+<li>ucx_stack_pop
+: <a class="el" href="stack_8h.html#a506b82374734ec476d086ddfb561174d">stack.h</a>
+</li>
+<li>ucx_stack_popn()
+: <a class="el" href="stack_8h.html#a07ea48f28eab474dcfefbb86fa66ef81">stack.h</a>
+</li>
+<li>ucx_stack_push()
+: <a class="el" href="stack_8h.html#af85e6f77a8341beb6188f9ae1a8e9f92">stack.h</a>
+</li>
+<li>ucx_stack_pusharr()
+: <a class="el" href="stack_8h.html#a7bb138979191bba138e76ea37488fae2">stack.h</a>
+</li>
+<li>ucx_stack_realloc()
+: <a class="el" href="stack_8h.html#a0c678f96f6fabab49b2b034a1fe91c3a">stack.h</a>
+</li>
+<li>ucx_stack_topsize
+: <a class="el" href="stack_8h.html#a030197051a803e87d5eeac5adb80b15a">stack.h</a>
+</li>
+<li>ucx_strcpy()
+: <a class="el" href="utils_8h.html#adeb6e8d0a53a829207cfa0a979d01fff">utils.h</a>
+</li>
+<li>ucx_stream_bcopy
+: <a class="el" href="utils_8h.html#a6003a1750a66234169bd1f8cc84b297b">utils.h</a>
+</li>
+<li>ucx_stream_bncopy()
+: <a class="el" href="utils_8h.html#a114ee7f7da62656ffd35e2dc23394201">utils.h</a>
+</li>
+<li>ucx_stream_copy
+: <a class="el" href="utils_8h.html#a41ca1344f781c0d3bf7a414a6e811392">utils.h</a>
+</li>
+<li>UCX_STREAM_COPY_BUFSIZE
+: <a class="el" href="utils_8h.html#a23efd74fa5f701d4cf26ccbfd138a439">utils.h</a>
+</li>
+<li>ucx_stream_ncopy
+: <a class="el" href="utils_8h.html#add13f39a8af440b4f7e6f74339eaada2">utils.h</a>
+</li>
+<li>ucx_szmul
+: <a class="el" href="ucx_8h.html#a0b5ed6c1a0b15356f4f948acfd32a4cc">ucx.h</a>
+</li>
+<li>ucx_szmul_impl()
+: <a class="el" href="ucx_8h.html#a6637171cc0ec097b297f731a3036dd3b">ucx.h</a>
+</li>
+<li>UCX_TEST
+: <a class="el" href="test_8h.html#a66cfb29c329fc9eaef071f2449836659">test.h</a>
+</li>
+<li>UCX_TEST_ASSERT
+: <a class="el" href="test_8h.html#a08f477cd12fc3fe741a92493e5df58a9">test.h</a>
+</li>
+<li>UCX_TEST_BEGIN
+: <a class="el" href="test_8h.html#a0547b8d4f3bcdb0633fdd8925e8aa5d4">test.h</a>
+</li>
+<li>UCX_TEST_CALL_SUBROUTINE
+: <a class="el" href="test_8h.html#a0efbab91c54f5237a2ab207f48cf0e51">test.h</a>
+</li>
+<li>UCX_TEST_END
+: <a class="el" href="test_8h.html#a86e64857c04f0447f8b16fb9c2b3b639">test.h</a>
+</li>
+<li>ucx_test_register()
+: <a class="el" href="test_8h.html#a8dfabc42f183d3a4d79379a5d17bf67d">test.h</a>
+</li>
+<li>ucx_test_run()
+: <a class="el" href="test_8h.html#a3721458deeecb43aa322428f007714c3">test.h</a>
+</li>
+<li>UCX_TEST_SUBROUTINE
+: <a class="el" href="test_8h.html#ae073cf5ead22cb27d662da048e16f44a">test.h</a>
+</li>
+<li>ucx_test_suite_free()
+: <a class="el" href="test_8h.html#a4a6ac61a6f72722273f8eaa7a343edde">test.h</a>
+</li>
+<li>ucx_test_suite_new()
+: <a class="el" href="test_8h.html#a531f0df90363e0befbe900878f65f09e">test.h</a>
+</li>
+<li>ucx_vasprintf()
+: <a class="el" href="utils_8h.html#a3ea1dfb856c741f3e8ec6bfdc9ad427e">utils.h</a>
+</li>
+<li>UCX_VERSION
+: <a class="el" href="ucx_8h.html#af12001920ca2fc1405615684e4dea284">ucx.h</a>
+</li>
+<li>UCX_VERSION_MAJOR
+: <a class="el" href="ucx_8h.html#aa57e5dd22d42387d748cc16777df1383">ucx.h</a>
+</li>
+<li>UCX_VERSION_MINOR
+: <a class="el" href="ucx_8h.html#a9ac10d6353e23d4615a87fc737c65eb0">ucx.h</a>
+</li>
+<li>ucx_vfprintf()
+: <a class="el" href="utils_8h.html#a4907967beb92c3ae351dd239abbb6927">utils.h</a>
+</li>
+<li>UcxAVLNode
+: <a class="el" href="avl_8h.html#a08ba2496c2316df58548c3cc29712add">avl.h</a>
+</li>
+<li>UcxKey
+: <a class="el" href="map_8h.html#ad63828bb23123fc01a5315a2bac3b142">map.h</a>
+</li>
+<li>UcxList
+: <a class="el" href="list_8h.html#aa6f89f91c1081c9a7c6866c298f497a2">list.h</a>
+</li>
+<li>UcxMap
+: <a class="el" href="map_8h.html#a18e21948725b2da68c35da587a722033">map.h</a>
+</li>
+<li>UcxMapElement
+: <a class="el" href="map_8h.html#ad7d7a910a32113eb93eae11c3dc97b4b">map.h</a>
+</li>
+<li>UcxMapIterator
+: <a class="el" href="map_8h.html#ae36aff5f645948c54f51578b11fd87fb">map.h</a>
+</li>
+<li>UcxTest
+: <a class="el" href="test_8h.html#ae906817354c010b83c2784260cce7a1c">test.h</a>
+</li>
+<li>UcxTestList
+: <a class="el" href="test_8h.html#a8048c50ae73ea690b776edfd63bd6a5d">test.h</a>
+</li>
+<li>UcxTestSuite
+: <a class="el" href="test_8h.html#a52115d1d0f1c4a565ed6ef7c1bfd0363">test.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/globals_w.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,78 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:</div>
+
+<h3><a id="index_w"></a>- w -</h3><ul>
+<li>write_func
+: <a class="el" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">ucx.h</a>
+</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/index.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: UAP Common Extensions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+  <div class="headertitle">
+<div class="title">UAP Common Extensions </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>Library with common and useful functions, macros and data structures.</p>
+<p>Latest available source:<br />
+ <a href="https://sourceforge.net/projects/ucx/files/">https://sourceforge.net/projects/ucx/files/</a> </p>
+<p>Repositories:<br />
+ <a href="https://sourceforge.net/p/ucx/code">https://sourceforge.net/p/ucx/code</a> -&#160;or&#160;- <a href="https://develop.uap-core.de/hg/ucx">https://develop.uap-core.de/hg/ucx</a> </p>
+<h2>LICENCE</h2>
+<p>Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.</p>
+<p>Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:</p>
+<ol type="1">
+<li>Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.</li>
+<li>Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.</li>
+</ol>
+<p>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. </p>
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/jquery.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,87 @@
+/*!
+ * jQuery JavaScript Library v1.7.1
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Mon Nov 21 21:11:03 2011 -0500
+ */
+(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b4<b3;b4++){if((b9=arguments[b4])!=null){for(b2 in b9){b0=b5[b2];b1=b9[b2];if(b5===b1){continue}if(b8&&b1&&(bF.isPlainObject(b1)||(b6=bF.isArray(b1)))){if(b6){b6=false;b7=b0&&bF.isArray(b0)?b0:[]}else{b7=b0&&bF.isPlainObject(b0)?b0:{}}b5[b2]=bF.extend(b8,b7,b1)}else{if(b1!==L){b5[b2]=b1}}}}}return b5};bF.extend({noConflict:function(b0){if(bb.$===bF){bb.$=bH}if(b0&&bb.jQuery===bF){bb.jQuery=bU}return bF},isReady:false,readyWait:1,holdReady:function(b0){if(b0){bF.readyWait++}else{bF.ready(true)}},ready:function(b0){if((b0===true&&!--bF.readyWait)||(b0!==true&&!bF.isReady)){if(!av.body){return setTimeout(bF.ready,1)}bF.isReady=true;if(b0!==true&&--bF.readyWait>0){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0&&typeof b0==="object"&&"setInterval" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb["eval"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b4<b5;){if(b6.apply(b3[b4++],b2)===false){break}}}}else{if(b0){for(b1 in b3){if(b6.call(b3[b1],b1,b3[b1])===false){break}}}else{for(;b4<b5;){if(b6.call(b3[b4],b4,b3[b4++])===false){break}}}}return b3},trim:bO?function(b0){return b0==null?"":bO.call(b0)}:function(b0){return b0==null?"":b0.toString().replace(bI,"").replace(bE,"")},makeArray:function(b3,b1){var b0=b1||[];if(b3!=null){var b2=bF.type(b3);if(b3.length==null||b2==="string"||b2==="function"||b2==="regexp"||bF.isWindow(b3)){bz.call(b0,b3)}else{bF.merge(b0,b3)}}return b0},inArray:function(b2,b3,b1){var b0;if(b3){if(bv){return bv.call(b3,b2,b1)}b0=b3.length;b1=b1?b1<0?Math.max(0,b0+b1):b1:0;for(;b1<b0;b1++){if(b1 in b3&&b3[b1]===b2){return b1}}}return -1},merge:function(b4,b2){var b3=b4.length,b1=0;if(typeof b2.length==="number"){for(var b0=b2.length;b1<b0;b1++){b4[b3++]=b2[b1]}}else{while(b2[b1]!==L){b4[b3++]=b2[b1++]}}b4.length=b3;return b4},grep:function(b1,b6,b0){var b2=[],b5;b0=!!b0;for(var b3=0,b4=b1.length;b3<b4;b3++){b5=!!b6(b1[b3],b3);if(b0!==b5){b2.push(b1[b3])}}return b2},map:function(b0,b7,b8){var b5,b6,b4=[],b2=0,b1=b0.length,b3=b0 instanceof bF||b1!==L&&typeof b1==="number"&&((b1>0&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b2<b1;b2++){b5=b7(b0[b2],b2,b8);if(b5!=null){b4[b4.length]=b5}}}else{for(b6 in b0){b5=b7(b0[b6],b6,b8);if(b5!=null){b4[b4.length]=b5}}}return b4.concat.apply([],b4)},guid:1,proxy:function(b4,b3){if(typeof b3==="string"){var b2=b4[b3];b3=b4;b4=b2}if(!bF.isFunction(b4)){return L}var b0=bK.call(arguments,2),b1=function(){return b4.apply(b3,b0.concat(bK.call(arguments)))};b1.guid=b4.guid=b4.guid||b1.guid||bF.guid++;return b1},access:function(b0,b8,b6,b2,b5,b7){var b1=b0.length;if(typeof b8==="object"){for(var b3 in b8){bF.access(b0,b3,b8[b3],b2,b5,b6)}return b0}if(b6!==L){b2=!b7&&b2&&bF.isFunction(b6);for(var b4=0;b4<b1;b4++){b5(b0[b4],b8,b2?b6.call(b0[b4],b4,b5(b0[b4],b8)):b6,b7)}return b0}return b1?b5(b0[0],b8):L},now:function(){return(new Date()).getTime()},uaMatch:function(b1){b1=b1.toLowerCase();var b0=by.exec(b1)||bR.exec(b1)||bQ.exec(b1)||b1.indexOf("compatible")<0&&bS.exec(b1)||[];return{browser:b0[1]||"",version:b0[2]||"0"}},sub:function(){function b0(b3,b4){return new b0.fn.init(b3,b4)}bF.extend(true,b0,this);b0.superclass=this;b0.fn=b0.prototype=this();b0.fn.constructor=b0;b0.sub=this.sub;b0.fn.init=function b2(b3,b4){if(b4&&b4 instanceof bF&&!(b4 instanceof b0)){b4=b0(b4)}return bF.fn.init.call(this,b3,b4,b1)};b0.fn.init.prototype=b0.fn;var b1=b0(av);return b0},browser:{}});bF.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(b1,b0){bx["[object "+b0+"]"]=b0.toLowerCase()});bV=bF.uaMatch(bX);if(bV.browser){bF.browser[bV.browser]=true;bF.browser.version=bV.version}if(bF.browser.webkit){bF.browser.safari=true}if(bM.test("\xA0")){bI=/^[\s\xA0]+/;bE=/[\s\xA0]+$/}bD=bF(av);if(av.addEventListener){e=function(){av.removeEventListener("DOMContentLoaded",e,false);bF.ready()}}else{if(av.attachEvent){e=function(){if(av.readyState==="complete"){av.detachEvent("onreadystatechange",e);bF.ready()}}}}function bw(){if(bF.isReady){return}try{av.documentElement.doScroll("left")}catch(b0){setTimeout(bw,1);return}bF.ready()}return bF})();var a2={};function X(e){var bv=a2[e]={},bw,bx;e=e.split(/\s+/);for(bw=0,bx=e.length;bw<bx;bw++){bv[e[bw]]=true}return bv}b.Callbacks=function(bw){bw=bw?(a2[bw]||X(bw)):{};var bB=[],bC=[],bx,by,bv,bz,bA,bE=function(bF){var bG,bJ,bI,bH,bK;for(bG=0,bJ=bF.length;bG<bJ;bG++){bI=bF[bG];bH=b.type(bI);if(bH==="array"){bE(bI)}else{if(bH==="function"){if(!bw.unique||!bD.has(bI)){bB.push(bI)}}}}},e=function(bG,bF){bF=bF||[];bx=!bw.memory||[bG,bF];by=true;bA=bv||0;bv=0;bz=bB.length;for(;bB&&bA<bz;bA++){if(bB[bA].apply(bG,bF)===false&&bw.stopOnFalse){bx=true;break}}by=false;if(bB){if(!bw.once){if(bC&&bC.length){bx=bC.shift();bD.fireWith(bx[0],bx[1])}}else{if(bx===true){bD.disable()}else{bB=[]}}}},bD={add:function(){if(bB){var bF=bB.length;bE(arguments);if(by){bz=bB.length}else{if(bx&&bx!==true){bv=bF;e(bx[0],bx[1])}}}return this},remove:function(){if(bB){var bF=arguments,bH=0,bI=bF.length;for(;bH<bI;bH++){for(var bG=0;bG<bB.length;bG++){if(bF[bH]===bB[bG]){if(by){if(bG<=bz){bz--;if(bG<=bA){bA--}}}bB.splice(bG--,1);if(bw.unique){break}}}}}return this},has:function(bG){if(bB){var bF=0,bH=bB.length;for(;bF<bH;bF++){if(bG===bB[bF]){return true}}}return false},empty:function(){bB=[];return this},disable:function(){bB=bC=bx=L;return this},disabled:function(){return !bB},lock:function(){bC=L;if(!bx||bx===true){bD.disable()}return this},locked:function(){return !bC},fireWith:function(bG,bF){if(bC){if(by){if(!bw.once){bC.push([bG,bF])}}else{if(!(bw.once&&bx)){e(bG,bF)}}}return this},fire:function(){bD.fireWith(this,arguments);return this},fired:function(){return !!bx}};return bD};var aJ=[].slice;b.extend({Deferred:function(by){var bx=b.Callbacks("once memory"),bw=b.Callbacks("once memory"),bv=b.Callbacks("memory"),e="pending",bA={resolve:bx,reject:bw,notify:bv},bC={done:bx.add,fail:bw.add,progress:bv.add,state:function(){return e},isResolved:bx.fired,isRejected:bw.fired,then:function(bE,bD,bF){bB.done(bE).fail(bD).progress(bF);return this},always:function(){bB.done.apply(bB,arguments).fail.apply(bB,arguments);return this},pipe:function(bF,bE,bD){return b.Deferred(function(bG){b.each({done:[bF,"resolve"],fail:[bE,"reject"],progress:[bD,"notify"]},function(bI,bL){var bH=bL[0],bK=bL[1],bJ;if(b.isFunction(bH)){bB[bI](function(){bJ=bH.apply(this,arguments);if(bJ&&b.isFunction(bJ.promise)){bJ.promise().then(bG.resolve,bG.reject,bG.notify)}else{bG[bK+"With"](this===bB?bG:this,[bJ])}})}else{bB[bI](bG[bK])}})}).promise()},promise:function(bE){if(bE==null){bE=bC}else{for(var bD in bC){bE[bD]=bC[bD]}}return bE}},bB=bC.promise({}),bz;for(bz in bA){bB[bz]=bA[bz].fire;bB[bz+"With"]=bA[bz].fireWith}bB.done(function(){e="resolved"},bw.disable,bv.lock).fail(function(){e="rejected"},bx.disable,bv.lock);if(by){by.call(bB,bB)}return bB},when:function(bA){var bx=aJ.call(arguments,0),bv=0,e=bx.length,bB=new Array(e),bw=e,by=e,bC=e<=1&&bA&&b.isFunction(bA.promise)?bA:b.Deferred(),bE=bC.promise();function bD(bF){return function(bG){bx[bF]=arguments.length>1?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv<e;bv++){if(bx[bv]&&bx[bv].promise&&b.isFunction(bx[bv].promise)){bx[bv].promise().then(bD(bv),bC.reject,bz(bv))}else{--bw}}if(!bw){bC.resolveWith(bC,bx)}}else{if(bC!==bA){bC.resolveWith(bC,e?[bA]:[])}}return bE}});b.support=(function(){var bJ,bI,bF,bG,bx,bE,bA,bD,bz,bK,bB,by,bw,bv=av.createElement("div"),bH=av.documentElement;bv.setAttribute("className","t");bv.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav></:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="<div "+e+"><div></div></div><table "+e+" cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="<div style='width:4px;'></div>";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA<bz;bA++){delete bB[bv[bA]]}if(!(by?S:b.isEmptyObject)(bB)){return}}}if(!by){delete e[bw].data;if(!S(e[bw])){return}}if(b.support.deleteExpando||!e.setInterval){delete e[bw]}else{e[bw]=null}if(bD){if(b.support.deleteExpando){delete bx[bC]}else{if(bx.removeAttribute){bx.removeAttribute(bC)}else{bx[bC]=null}}}},_data:function(bv,e,bw){return b.data(bv,e,bw,true)},acceptData:function(bv){if(bv.nodeName){var e=b.noData[bv.nodeName.toLowerCase()];if(e){return !(e===true||bv.getAttribute("classid")!==e)}}return true}});b.fn.extend({data:function(by,bA){var bB,e,bw,bz=null;if(typeof by==="undefined"){if(this.length){bz=b.data(this[0]);if(this[0].nodeType===1&&!b._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var bx=0,bv=e.length;bx<bv;bx++){bw=e[bx].name;if(bw.indexOf("data-")===0){bw=b.camelCase(bw.substring(5));a5(this[0],bw,bz[bw])}}b._data(this[0],"parsedAttrs",true)}}return bz}else{if(typeof by==="object"){return this.each(function(){b.data(this,by)})}}bB=by.split(".");bB[1]=bB[1]?"."+bB[1]:"";if(bA===L){bz=this.triggerHandler("getData"+bB[1]+"!",[bB[0]]);if(bz===L&&this.length){bz=b.data(this[0],by);bz=a5(this[0],by,bz)}return bz===L&&bB[1]?this.data(bB[0]):bz}else{return this.each(function(){var bC=b(this),bD=[bB[0],bA];bC.triggerHandler("setData"+bB[1]+"!",bD);b.data(this,by,bA);bC.triggerHandler("changeData"+bB[1]+"!",bD)})}},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function a5(bx,bw,by){if(by===L&&bx.nodeType===1){var bv="data-"+bw.replace(aA,"-$1").toLowerCase();by=bx.getAttribute(bv);if(typeof by==="string"){try{by=by==="true"?true:by==="false"?false:by==="null"?null:b.isNumeric(by)?parseFloat(by):aS.test(by)?b.parseJSON(by):by}catch(bz){}b.data(bx,bw,by)}else{by=L}}return by}function S(bv){for(var e in bv){if(e==="data"&&b.isEmptyObject(bv[e])){continue}if(e!=="toJSON"){return false}}return true}function bi(by,bx,bA){var bw=bx+"defer",bv=bx+"queue",e=bx+"mark",bz=b._data(by,bw);if(bz&&(bA==="queue"||!b._data(by,bv))&&(bA==="mark"||!b._data(by,e))){setTimeout(function(){if(!b._data(by,bv)&&!b._data(by,e)){b.removeData(by,bw,true);bz.fire()}},0)}}b.extend({_mark:function(bv,e){if(bv){e=(e||"fx")+"mark";b._data(bv,e,(b._data(bv,e)||0)+1)}},_unmark:function(by,bx,bv){if(by!==true){bv=bx;bx=by;by=false}if(bx){bv=bv||"fx";var e=bv+"mark",bw=by?0:((b._data(bx,e)||1)-1);if(bw){b._data(bx,e,bw)}else{b.removeData(bx,e,true);bi(bx,bv,"mark")}}},queue:function(bv,e,bx){var bw;if(bv){e=(e||"fx")+"queue";bw=b._data(bv,e);if(bx){if(!bw||b.isArray(bx)){bw=b._data(bv,e,b.makeArray(bx))}else{bw.push(bx)}}return bw||[]}},dequeue:function(by,bx){bx=bx||"fx";var bv=b.queue(by,bx),bw=bv.shift(),e={};if(bw==="inprogress"){bw=bv.shift()}if(bw){if(bx==="fx"){bv.unshift("inprogress")}b._data(by,bx+".run",e);bw.call(by,function(){b.dequeue(by,bx)},e)}if(!bv.length){b.removeData(by,bx+"queue "+bx+".run",true);bi(by,bx,"queue")}}});b.fn.extend({queue:function(e,bv){if(typeof e!=="string"){bv=e;e="fx"}if(bv===L){return b.queue(this[0],e)}return this.each(function(){var bw=b.queue(this,e,bv);if(e==="fx"&&bw[0]!=="inprogress"){b.dequeue(this,e)}})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(bv,e){bv=b.fx?b.fx.speeds[bv]||bv:bv;e=e||"fx";return this.queue(e,function(bx,bw){var by=setTimeout(bx,bv);bw.stop=function(){clearTimeout(by)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(bD,bw){if(typeof bD!=="string"){bw=bD;bD=L}bD=bD||"fx";var e=b.Deferred(),bv=this,by=bv.length,bB=1,bz=bD+"defer",bA=bD+"queue",bC=bD+"mark",bx;function bE(){if(!(--bB)){e.resolveWith(bv,[bv])}}while(by--){if((bx=b.data(bv[by],bz,L,true)||(b.data(bv[by],bA,L,true)||b.data(bv[by],bC,L,true))&&b.data(bv[by],bz,b.Callbacks("once memory"),true))){bB++;bx.add(bE)}}bE();return e.promise()}});var aP=/[\n\t\r]/g,af=/\s+/,aU=/\r/g,g=/^(?:button|input)$/i,D=/^(?:button|input|object|select|textarea)$/i,l=/^a(?:rea)?$/i,ao=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,F=b.support.getSetAttribute,be,aY,aF;b.fn.extend({attr:function(e,bv){return b.access(this,e,bv,true,b.attr)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,bv){return b.access(this,e,bv,true,b.prop)},removeProp:function(e){e=b.propFix[e]||e;return this.each(function(){try{this[e]=L;delete this[e]}catch(bv){}})},addClass:function(by){var bA,bw,bv,bx,bz,bB,e;if(b.isFunction(by)){return this.each(function(bC){b(this).addClass(by.call(this,bC,this.className))})}if(by&&typeof by==="string"){bA=by.split(af);for(bw=0,bv=this.length;bw<bv;bw++){bx=this[bw];if(bx.nodeType===1){if(!bx.className&&bA.length===1){bx.className=by}else{bz=" "+bx.className+" ";for(bB=0,e=bA.length;bB<e;bB++){if(!~bz.indexOf(" "+bA[bB]+" ")){bz+=bA[bB]+" "}}bx.className=b.trim(bz)}}}}return this},removeClass:function(bz){var bA,bw,bv,by,bx,bB,e;if(b.isFunction(bz)){return this.each(function(bC){b(this).removeClass(bz.call(this,bC,this.className))})}if((bz&&typeof bz==="string")||bz===L){bA=(bz||"").split(af);for(bw=0,bv=this.length;bw<bv;bw++){by=this[bw];if(by.nodeType===1&&by.className){if(bz){bx=(" "+by.className+" ").replace(aP," ");for(bB=0,e=bA.length;bB<e;bB++){bx=bx.replace(" "+bA[bB]+" "," ")}by.className=b.trim(bx)}else{by.className=""}}}}return this},toggleClass:function(bx,bv){var bw=typeof bx,e=typeof bv==="boolean";if(b.isFunction(bx)){return this.each(function(by){b(this).toggleClass(bx.call(this,by,this.className,bv),bv)})}return this.each(function(){if(bw==="string"){var bA,bz=0,by=b(this),bB=bv,bC=bx.split(af);while((bA=bC[bz++])){bB=e?bB:!by.hasClass(bA);by[bB?"addClass":"removeClass"](bA)}}else{if(bw==="undefined"||bw==="boolean"){if(this.className){b._data(this,"__className__",this.className)}this.className=this.className||bx===false?"":b._data(this,"__className__")||""}}})},hasClass:function(e){var bx=" "+e+" ",bw=0,bv=this.length;for(;bw<bv;bw++){if(this[bw].nodeType===1&&(" "+this[bw].className+" ").replace(aP," ").indexOf(bx)>-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv<bz;bv++){bx=bC[bv];if(bx.selected&&(b.support.optDisabled?!bx.disabled:bx.getAttribute("disabled")===null)&&(!bx.parentNode.disabled||!b.nodeName(bx.parentNode,"optgroup"))){bA=b(bx).val();if(bw){return bA}bB.push(bA)}}if(bw&&!bB.length&&bC.length){return b(bC[by]).val()}return bB},set:function(bv,bw){var e=b.makeArray(bw);b(bv).find("option").each(function(){this.selected=b.inArray(b(this).val(),e)>=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw<e;bw++){bv=bA[bw];if(bv){by=b.propFix[bv]||bv;b.attr(bx,bv,"");bx.removeAttribute(F?bv:by);if(ao.test(bv)&&by in bx){bx[by]=false}}}}},attrHooks:{type:{set:function(e,bv){if(g.test(e.nodeName)&&e.parentNode){b.error("type property can't be changed")}else{if(!b.support.radioValue&&bv==="radio"&&b.nodeName(e,"input")){var bw=e.value;e.setAttribute("type",bv);if(bw){e.value=bw}return bv}}}},value:{get:function(bv,e){if(be&&b.nodeName(bv,"button")){return be.get(bv,e)}return e in bv?bv.value:null},set:function(bv,bw,e){if(be&&b.nodeName(bv,"button")){return be.set(bv,bw,e)}bv.value=bw}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(bz,bx,bA){var bw,e,by,bv=bz.nodeType;if(!bz||bv===3||bv===8||bv===2){return}by=bv!==1||!b.isXMLDoc(bz);if(by){bx=b.propFix[bx]||bx;e=b.propHooks[bx]}if(bA!==L){if(e&&"set" in e&&(bw=e.set(bz,bA,bx))!==L){return bw}else{return(bz[bx]=bA)}}else{if(e&&"get" in e&&(bw=e.get(bz,bx))!==null){return bw}else{return bz[bx]}}},propHooks:{tabIndex:{get:function(bv){var e=bv.getAttributeNode("tabindex");return e&&e.specified?parseInt(e.value,10):D.test(bv.nodeName)||l.test(bv.nodeName)&&bv.href?0:L}}}});b.attrHooks.tabindex=b.propHooks.tabIndex;aY={get:function(bv,e){var bx,bw=b.prop(bv,e);return bw===true||typeof bw!=="boolean"&&(bx=bv.getAttributeNode(e))&&bx.nodeValue!==false?e.toLowerCase():L},set:function(bv,bx,e){var bw;if(bx===false){b.removeAttr(bv,e)}else{bw=b.propFix[e]||e;if(bw in bv){bv[bw]=true}bv.setAttribute(e,e.toLowerCase())}return e}};if(!F){aF={name:true,id:true};be=b.valHooks.button={get:function(bw,bv){var e;e=bw.getAttributeNode(bv);return e&&(aF[bv]?e.nodeValue!=="":e.specified)?e.nodeValue:L},set:function(bw,bx,bv){var e=bw.getAttributeNode(bv);if(!e){e=av.createAttribute(bv);bw.setAttributeNode(e)}return(e.nodeValue=bx+"")}};b.attrHooks.tabindex.set=be.set;b.each(["width","height"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{set:function(bw,bx){if(bx===""){bw.setAttribute(e,"auto");return bx}}})});b.attrHooks.contenteditable={get:be.get,set:function(bv,bw,e){if(bw===""){bw="false"}be.set(bv,bw,e)}}}if(!b.support.hrefNormalized){b.each(["href","src","width","height"],function(bv,e){b.attrHooks[e]=b.extend(b.attrHooks[e],{get:function(bx){var bw=bx.getAttribute(e,2);return bw===null?L:bw}})})}if(!b.support.style){b.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||L},set:function(e,bv){return(e.style.cssText=""+bv)}}}if(!b.support.optSelected){b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(bv){var e=bv.parentNode;if(e){e.selectedIndex;if(e.parentNode){e.parentNode.selectedIndex}}return null}})}if(!b.support.enctype){b.propFix.enctype="encoding"}if(!b.support.checkOn){b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}})}b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,bv){if(b.isArray(bv)){return(e.checked=b.inArray(b(e).val(),bv)>=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI<bC.length;bI++){bH=n.exec(bC[bI])||[];bF=bH[1];e=(bH[2]||"").split(".").sort();bE=b.event.special[bF]||{};bF=(by?bE.delegateType:bE.bindType)||bF;bE=b.event.special[bF]||{};bG=b.extend({type:bF,origType:bH[1],data:bA,handler:bJ,guid:bJ.guid,selector:by,quick:Y(by),namespace:e.join(".")},bv);bw=bK[bF];if(!bw){bw=bK[bF]=[];bw.delegateCount=0;if(!bE.setup||bE.setup.call(bx,bA,e,bB)===false){if(bx.addEventListener){bx.addEventListener(bF,bB,false)}else{if(bx.attachEvent){bx.attachEvent("on"+bF,bB)}}}}if(bE.add){bE.add.call(bx,bG);if(!bG.handler.guid){bG.handler.guid=bJ.guid}}if(by){bw.splice(bw.delegateCount++,0,bG)}else{bw.push(bG)}b.event.global[bF]=true}bx=null},global:{},remove:function(bJ,bE,bv,bH,bB){var bI=b.hasData(bJ)&&b._data(bJ),bF,bx,bz,bL,bC,bA,bG,bw,by,bK,bD,e;if(!bI||!(bw=bI.events)){return}bE=b.trim(bt(bE||"")).split(" ");for(bF=0;bF<bE.length;bF++){bx=n.exec(bE[bF])||[];bz=bL=bx[1];bC=bx[2];if(!bz){for(bz in bw){b.event.remove(bJ,bz+bE[bF],bv,bH,true)}continue}by=b.event.special[bz]||{};bz=(bH?by.delegateType:by.bindType)||bz;bD=bw[bz]||[];bA=bD.length;bC=bC?new RegExp("(^|\\.)"+bC.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(bG=0;bG<bD.length;bG++){e=bD[bG];if((bB||bL===e.origType)&&(!bv||bv.guid===e.guid)&&(!bC||bC.test(e.namespace))&&(!bH||bH===e.selector||bH==="**"&&e.selector)){bD.splice(bG--,1);if(e.selector){bD.delegateCount--}if(by.remove){by.remove.call(bJ,e)}}}if(bD.length===0&&bA!==bD.length){if(!by.teardown||by.teardown.call(bJ,bC)===false){b.removeEvent(bJ,bz,bI.handle)}delete bw[bz]}}if(b.isEmptyObject(bw)){bK=bI.handle;if(bK){bK.elem=null}b.removeData(bJ,["events","handle"],true)}},customEvent:{getData:true,setData:true,changeData:true},trigger:function(bv,bD,bA,bJ){if(bA&&(bA.nodeType===3||bA.nodeType===8)){return}var bG=bv.type||bv,bx=[],e,bw,bC,bH,bz,by,bF,bE,bB,bI;if(T.test(bG+b.event.triggered)){return}if(bG.indexOf("!")>=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bC<bB.length&&!bv.isPropagationStopped();bC++){bH=bB[bC][0];bv.type=bB[bC][1];bE=(b._data(bH,"events")||{})[bv.type]&&b._data(bH,"handle");if(bE){bE.apply(bH,bD)}bE=by&&bH[by];if(bE&&b.acceptData(bH)&&bE.apply(bH,bD)===false){bv.preventDefault()}}bv.type=bG;if(!bJ&&!bv.isDefaultPrevented()){if((!bF._default||bF._default.apply(bA.ownerDocument,bD)===false)&&!(bG==="click"&&b.nodeName(bA,"a"))&&b.acceptData(bA)){if(by&&bA[bG]&&((bG!=="focus"&&bG!=="blur")||bv.target.offsetWidth!==0)&&!b.isWindow(bA)){bz=bA[by];if(bz){bA[by]=null}b.event.triggered=bG;bA[bG]();b.event.triggered=L;if(bz){bA[by]=bz}}}}return bv.result},dispatch:function(e){e=b.event.fix(e||bb.event);var bz=((b._data(this,"events")||{})[e.type]||[]),bA=bz.delegateCount,bG=[].slice.call(arguments,0),by=!e.exclusive&&!e.namespace,bH=[],bC,bB,bK,bx,bF,bE,bv,bD,bI,bw,bJ;bG[0]=e;e.delegateTarget=this;if(bA&&!e.target.disabled&&!(e.button&&e.type==="click")){bx=b(this);bx.context=this.ownerDocument||this;for(bK=e.target;bK!=this;bK=bK.parentNode||this){bE={};bD=[];bx[0]=bK;for(bC=0;bC<bA;bC++){bI=bz[bC];bw=bI.selector;if(bE[bw]===L){bE[bw]=(bI.quick?j(bK,bI.quick):bx.is(bw))}if(bE[bw]){bD.push(bI)}}if(bD.length){bH.push({elem:bK,matches:bD})}}}if(bz.length>bA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC<bH.length&&!e.isPropagationStopped();bC++){bv=bH[bC];e.currentTarget=bv.elem;for(bB=0;bB<bv.matches.length&&!e.isImmediatePropagationStopped();bB++){bI=bv.matches[bB];if(by||(!e.namespace&&!bI.namespace)||e.namespace_re&&e.namespace_re.test(bI.namespace)){e.data=bI.data;e.handleObj=bI;bF=((b.event.special[bI.origType]||{}).handle||bI.handler).apply(bv.elem,bG);if(bF!==L){e.result=bF;if(bF===false){e.preventDefault();e.stopPropagation()}}}}}return e.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(bv,e){if(bv.which==null){bv.which=e.charCode!=null?e.charCode:e.keyCode}return bv}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(bx,bw){var by,bz,e,bv=bw.button,bA=bw.fromElement;if(bx.pageX==null&&bw.clientX!=null){by=bx.target.ownerDocument||av;bz=by.documentElement;e=by.body;bx.pageX=bw.clientX+(bz&&bz.scrollLeft||e&&e.scrollLeft||0)-(bz&&bz.clientLeft||e&&e.clientLeft||0);bx.pageY=bw.clientY+(bz&&bz.scrollTop||e&&e.scrollTop||0)-(bz&&bz.clientTop||e&&e.clientTop||0)}if(!bx.relatedTarget&&bA){bx.relatedTarget=bA===bx.target?bw.toElement:bA}if(!bx.which&&bv!==L){bx.which=(bv&1?1:(bv&2?3:(bv&4?2:0)))}return bx}},fix:function(bw){if(bw[b.expando]){return bw}var bv,bz,e=bw,bx=b.event.fixHooks[bw.type]||{},by=bx.props?this.props.concat(bx.props):this.props;bw=b.Event(e);for(bv=by.length;bv;){bz=by[--bv];bw[bz]=e[bz]}if(!bw.target){bw.target=e.srcElement||av}if(bw.target.nodeType===3){bw.target=bw.target.parentNode}if(bw.metaKey===L){bw.metaKey=bw.ctrlKey}return bx.filter?bx.filter(bw,e):bw},special:{ready:{setup:b.bindReady},load:{noBubble:true},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(bw,bv,e){if(b.isWindow(this)){this.onbeforeunload=e}},teardown:function(bv,e){if(this.onbeforeunload===e){this.onbeforeunload=null}}}},simulate:function(bw,by,bx,bv){var bz=b.extend(new b.Event(),bx,{type:bw,isSimulated:true,originalEvent:{}});if(bv){b.event.trigger(bz,null,by)}else{b.event.dispatch.call(by,bz)}if(bz.isDefaultPrevented()){bx.preventDefault()}}};b.event.handle=b.event.dispatch;b.removeEvent=av.removeEventListener?function(bv,e,bw){if(bv.removeEventListener){bv.removeEventListener(e,bw,false)}}:function(bv,e,bw){if(bv.detachEvent){bv.detachEvent("on"+e,bw)}};b.Event=function(bv,e){if(!(this instanceof b.Event)){return new b.Event(bv,e)}if(bv&&bv.type){this.originalEvent=bv;this.type=bv.type;this.isDefaultPrevented=(bv.defaultPrevented||bv.returnValue===false||bv.getPreventDefault&&bv.getPreventDefault())?i:bk}else{this.type=bv}if(e){b.extend(this,e)}this.timeStamp=bv&&bv.timeStamp||b.now();this[b.expando]=true};function bk(){return false}function i(){return true}b.Event.prototype={preventDefault:function(){this.isDefaultPrevented=i;var bv=this.originalEvent;if(!bv){return}if(bv.preventDefault){bv.preventDefault()}else{bv.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=i;var bv=this.originalEvent;if(!bv){return}if(bv.stopPropagation){bv.stopPropagation()}bv.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=i;this.stopPropagation()},isDefaultPrevented:bk,isPropagationStopped:bk,isImmediatePropagationStopped:bk};b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(bv,e){b.event.special[bv]={delegateType:e,bindType:e,handle:function(bz){var bB=this,bA=bz.relatedTarget,by=bz.handleObj,bw=by.selector,bx;if(!bA||(bA!==bB&&!b.contains(bB,bA))){bz.type=by.origType;bx=by.handler.apply(this,arguments);bz.type=e}return bx}}});if(!b.support.submitBubbles){b.event.special.submit={setup:function(){if(b.nodeName(this,"form")){return false}b.event.add(this,"click._submit keypress._submit",function(bx){var bw=bx.target,bv=b.nodeName(bw,"input")||b.nodeName(bw,"button")?bw.form:L;if(bv&&!bv._submit_attached){b.event.add(bv,"submit._submit",function(e){if(this.parentNode&&!e.isTrigger){b.event.simulate("submit",this.parentNode,e,true)}});bv._submit_attached=true}})},teardown:function(){if(b.nodeName(this,"form")){return false}b.event.remove(this,"._submit")}}}if(!b.support.changeBubbles){b.event.special.change={setup:function(){if(bd.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio"){b.event.add(this,"propertychange._change",function(e){if(e.originalEvent.propertyName==="checked"){this._just_changed=true}});b.event.add(this,"click._change",function(e){if(this._just_changed&&!e.isTrigger){this._just_changed=false;b.event.simulate("change",this,e,true)}})}return false}b.event.add(this,"beforeactivate._change",function(bw){var bv=bw.target;if(bd.test(bv.nodeName)&&!bv._change_attached){b.event.add(bv,"change._change",function(e){if(this.parentNode&&!e.isSimulated&&!e.isTrigger){b.event.simulate("change",this.parentNode,e,true)}});bv._change_attached=true}})},handle:function(bv){var e=bv.target;if(this!==e||bv.isSimulated||bv.isTrigger||(e.type!=="radio"&&e.type!=="checkbox")){return bv.handleObj.handler.apply(this,arguments)}},teardown:function(){b.event.remove(this,"._change");return bd.test(this.nodeName)}}}if(!b.support.focusinBubbles){b.each({focus:"focusin",blur:"focusout"},function(bx,e){var bv=0,bw=function(by){b.event.simulate(e,by.target,b.event.fix(by),true)};b.event.special[e]={setup:function(){if(bv++===0){av.addEventListener(bx,bw,true)}},teardown:function(){if(--bv===0){av.removeEventListener(bx,bw,true)}}}})}b.fn.extend({on:function(bw,e,bz,by,bv){var bA,bx;if(typeof bw==="object"){if(typeof e!=="string"){bz=e;e=L}for(bx in bw){this.on(bx,e,bz,bw[bx],bv)}return this}if(bz==null&&by==null){by=e;bz=e=L}else{if(by==null){if(typeof e==="string"){by=bz;bz=L}else{by=bz;bz=e;e=L}}}if(by===false){by=bk}else{if(!by){return this}}if(bv===1){bA=by;by=function(bB){b().off(bB);return bA.apply(this,arguments)};by.guid=bA.guid||(bA.guid=b.guid++)}return this.each(function(){b.event.add(this,bw,by,bz,e)})},one:function(bv,e,bx,bw){return this.on.call(this,bv,e,bx,bw,1)},off:function(bw,e,by){if(bw&&bw.preventDefault&&bw.handleObj){var bv=bw.handleObj;b(bw.delegateTarget).off(bv.namespace?bv.type+"."+bv.namespace:bv.type,bv.selector,bv.handler);return this}if(typeof bw==="object"){for(var bx in bw){this.off(bx,e,bw[bx])}return this}if(e===false||typeof e==="function"){by=e;e=L}if(by===false){by=bk}return this.each(function(){b.event.remove(this,bw,by,e)})},bind:function(e,bw,bv){return this.on(e,null,bw,bv)},unbind:function(e,bv){return this.off(e,null,bv)},live:function(e,bw,bv){b(this.context).on(e,this.selector,bw,bv);return this},die:function(e,bv){b(this.context).off(e,this.selector||"**",bv);return this},delegate:function(e,bv,bx,bw){return this.on(bv,e,bx,bw)},undelegate:function(e,bv,bw){return arguments.length==1?this.off(e,"**"):this.off(bv,e,bw)},trigger:function(e,bv){return this.each(function(){b.event.trigger(e,bv,this)})},triggerHandler:function(e,bv){if(this[0]){return b.event.trigger(e,bv,this[0],true)}},toggle:function(bx){var bv=arguments,e=bx.guid||b.guid++,bw=0,by=function(bz){var bA=(b._data(this,"lastToggle"+bx.guid)||0)%bw;b._data(this,"lastToggle"+bx.guid,bA+1);bz.preventDefault();return bv[bA].apply(this,arguments)||false};by.guid=e;while(bw<bv.length){bv[bw++].guid=e}return this.click(by)},hover:function(e,bv){return this.mouseenter(e).mouseleave(bv||e)}});b.each(("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu").split(" "),function(bv,e){b.fn[e]=function(bx,bw){if(bw==null){bw=bx;bx=null}return arguments.length>0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}});
+/*!
+ * Sizzle CSS Selector Engine
+ *  Copyright 2011, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e<bR.length;e++){if(bR[e]===bR[e-1]){bR.splice(e--,1)}}}}return bR};by.matches=function(e,bR){return by(e,null,null,bR)};by.matchesSelector=function(e,bR){return by(bR,null,null,[e]).length>0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS<bU;bS++){bV=bE.order[bS];if((bT=bE.leftMatch[bV].exec(bX))){bR=bT[1];bT.splice(1,1);if(bR.substr(bR.length-1)!=="\\"){bT[1]=(bT[1]||"").replace(bK,"");bW=bE.find[bV](bT,e,bY);if(bW!=null){bX=bX.replace(bE.match[bV],"");break}}}}if(!bW){bW=typeof e.getElementsByTagName!=="undefined"?e.getElementsByTagName("*"):[]}return{set:bW,expr:bX}};by.filter=function(b1,b0,b4,bU){var bW,e,bZ,b6,b3,bR,bT,bV,b2,bS=b1,b5=[],bY=b0,bX=b0&&b0[0]&&by.isXML(b0[0]);while(b1&&b0.length){for(bZ in bE.filter){if((bW=bE.leftMatch[bZ].exec(b1))!=null&&bW[2]){bR=bE.filter[bZ];bT=bW[1];e=false;bW.splice(1,1);if(bT.substr(bT.length-1)==="\\"){continue}if(bY===b5){b5=[]}if(bE.preFilter[bZ]){bW=bE.preFilter[bZ](bW,bY,b4,b5,bU,bX);if(!bW){e=b6=true}else{if(bW===true){continue}}}if(bW){for(bV=0;(b3=bY[bV])!=null;bV++){if(b3){b6=bR(b3,bW,bV,bY);b2=bU^b6;if(b4&&b6!=null){if(b2){e=true}else{bY[bV]=false}}else{if(b2){b5.push(b3);e=true}}}}}if(b6!==L){if(!b4){bY=b5}b1=b1.replace(bE.match[bZ],"");if(!e){return[]}break}}}if(b1===bS){if(e==null){by.error(b1)}else{break}}bS=b1}return bY};by.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)};var bw=by.getText=function(bU){var bS,bT,e=bU.nodeType,bR="";if(e){if(e===1||e===9){if(typeof bU.textContent==="string"){return bU.textContent}else{if(typeof bU.innerText==="string"){return bU.innerText.replace(bO,"")}else{for(bU=bU.firstChild;bU;bU=bU.nextSibling){bR+=bw(bU)}}}}else{if(e===3||e===4){return bU.nodeValue}}}else{for(bS=0;(bT=bU[bS]);bS++){if(bT.nodeType!==8){bR+=bw(bT)}}}return bR};var bE=by.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(e){return e.getAttribute("href")},type:function(e){return e.getAttribute("type")}},relative:{"+":function(bW,bR){var bT=typeof bR==="string",bV=bT&&!bQ.test(bR),bX=bT&&!bV;if(bV){bR=bR.toLowerCase()}for(var bS=0,e=bW.length,bU;bS<e;bS++){if((bU=bW[bS])){while((bU=bU.previousSibling)&&bU.nodeType!==1){}bW[bS]=bX||bU&&bU.nodeName.toLowerCase()===bR?bU||false:bU===bR}}if(bX){by.filter(bR,bW,true)}},">":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS<e;bS++){bV=bW[bS];if(bV){var bT=bV.parentNode;bW[bS]=bT.nodeName.toLowerCase()===bR?bT:false}}}else{for(;bS<e;bS++){bV=bW[bS];if(bV){bW[bS]=bU?bV.parentNode:bV.parentNode===bR}}if(bU){by.filter(bR,bW,true)}}},"":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR==="string"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e("parentNode",bR,bS,bT,bU,bV)},"~":function(bT,bR,bV){var bU,bS=bI++,e=bN;if(typeof bR==="string"&&!bQ.test(bR)){bR=bR.toLowerCase();bU=bR;e=bv}e("previousSibling",bR,bS,bT,bU,bV)}},find:{ID:function(bR,bS,bT){if(typeof bS.getElementById!=="undefined"&&!bT){var e=bS.getElementById(bR[1]);return e&&e.parentNode?[e]:[]}},NAME:function(bS,bV){if(typeof bV.getElementsByName!=="undefined"){var bR=[],bU=bV.getElementsByName(bS[1]);for(var bT=0,e=bU.length;bT<e;bT++){if(bU[bT].getAttribute("name")===bS[1]){bR.push(bU[bT])}}return bR.length===0?null:bR}},TAG:function(e,bR){if(typeof bR.getElementsByTagName!=="undefined"){return bR.getElementsByTagName(e[1])}}},preFilter:{CLASS:function(bT,bR,bS,e,bW,bX){bT=" "+bT[1].replace(bK,"")+" ";if(bX){return bT}for(var bU=0,bV;(bV=bR[bU])!=null;bU++){if(bV){if(bW^(bV.className&&(" "+bV.className+" ").replace(/[\t\n\r]/g," ").indexOf(bT)>=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bR<e[3]-0},gt:function(bS,bR,e){return bR>e[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV<bU;bV++){if(bT[bV]===bS){return false}}return true}else{by.error(e)}}}},CHILD:function(bS,bU){var bT,b0,bW,bZ,e,bV,bY,bX=bU[1],bR=bS;switch(bX){case"only":case"first":while((bR=bR.previousSibling)){if(bR.nodeType===1){return false}}if(bX==="first"){return true}bR=bS;case"last":while((bR=bR.nextSibling)){if(bR.nodeType===1){return false}}return true;case"nth":bT=bU[2];b0=bU[3];if(bT===1&&b0===0){return true}bW=bU[0];bZ=bS.parentNode;if(bZ&&(bZ[bC]!==bW||!bS.nodeIndex)){bV=0;for(bR=bZ.firstChild;bR;bR=bR.nextSibling){if(bR.nodeType===1){bR.nodeIndex=++bV}}bZ[bC]=bW}bY=bS.nodeIndex-b0;if(bT===0){return bY===0}else{return(bY%bT===0&&bY/bT>=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS<e;bS++){bR.push(bU[bS])}}else{for(;bU[bS];bS++){bR.push(bU[bS])}}}return bR}}var bJ,bG;if(av.documentElement.compareDocumentPosition){bJ=function(bR,e){if(bR===e){bB=true;return 0}if(!bR.compareDocumentPosition||!e.compareDocumentPosition){return bR.compareDocumentPosition?-1:1}return bR.compareDocumentPosition(e)&4?-1:1}}else{bJ=function(bY,bX){if(bY===bX){bB=true;return 0}else{if(bY.sourceIndex&&bX.sourceIndex){return bY.sourceIndex-bX.sourceIndex}}var bV,bR,bS=[],e=[],bU=bY.parentNode,bW=bX.parentNode,bZ=bU;if(bU===bW){return bG(bY,bX)}else{if(!bU){return -1}else{if(!bW){return 1}}}while(bZ){bS.unshift(bZ);bZ=bZ.parentNode}bZ=bW;while(bZ){e.unshift(bZ);bZ=bZ.parentNode}bV=bS.length;bR=e.length;for(var bT=0;bT<bV&&bT<bR;bT++){if(bS[bT]!==e[bT]){return bG(bS[bT],e[bT])}}return bT===bV?bG(bY,e[bT],-1):bG(bS[bT],bX,1)};bG=function(bR,e,bS){if(bR===e){return bS}var bT=bR.nextSibling;while(bT){if(bT===e){return -1}bT=bT.nextSibling}return 1}}(function(){var bR=av.createElement("div"),bS="script"+(new Date()).getTime(),e=av.documentElement;bR.innerHTML="<a name='"+bS+"'/>";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="<a href='#'></a>";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="<p class='TEST'></p>";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="<div class='test e'></div><div class='test'></div>";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1&&!bY){e[bC]=bV;e.sizset=bT}if(e.nodeName.toLowerCase()===bW){bU=e;break}e=e[bR]}bZ[bT]=bU}}}function bN(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT<bS;bT++){var e=bZ[bT];if(e){var bU=false;e=e[bR];while(e){if(e[bC]===bV){bU=bZ[e.sizset];break}if(e.nodeType===1){if(!bY){e[bC]=bV;e.sizset=bT}if(typeof bW!=="string"){if(e===bW){bU=true;break}}else{if(by.filter(bW,[e]).length>0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT<bR;bT++){by(bS,bY[bT],bX,bW)}return by.filter(bU,bX)};by.attr=b.attr;by.selectors.attrMap={};b.find=by;b.expr=by.selectors;b.expr[":"]=b.expr.filters;b.unique=by.uniqueSort;b.text=by.getText;b.isXMLDoc=by.isXML;b.contains=by.contains})();var ab=/Until$/,aq=/^(?:parents|prevUntil|prevAll)/,a9=/,/,bp=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,H=b.expr.match.POS,ay={children:true,contents:true,next:true,prev:true};b.fn.extend({find:function(e){var bw=this,by,bv;if(typeof e!=="string"){return b(e).filter(function(){for(by=0,bv=bw.length;by<bv;by++){if(b.contains(bw[by],this)){return true}}})}var bx=this.pushStack("","find",e),bA,bB,bz;for(by=0,bv=this.length;by<bv;by++){bA=bx.length;b.find(e,this[by],bx);if(by>0){for(bB=bA;bB<bx.length;bB++){for(bz=0;bz<bA;bz++){if(bx[bz]===bx[bB]){bx.splice(bB--,1);break}}}}}return bx},has:function(bv){var e=b(bv);return this.filter(function(){for(var bx=0,bw=e.length;bx<bw;bx++){if(b.contains(this,e[bx])){return true}}})},not:function(e){return this.pushStack(aG(this,e,false),"not",e)},filter:function(e){return this.pushStack(aG(this,e,true),"filter",e)},is:function(e){return !!e&&(typeof e==="string"?H.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw<by.length;bw++){if(b(bz).is(by[bw])){bv.push({selector:by[bw],elem:bz,level:bB})}}bz=bz.parentNode;bB++}return bv}var bA=H.test(by)||typeof by!=="string"?b(by,bx||this.context):0;for(bw=0,e=this.length;bw<e;bw++){bz=this[bw];while(bz){if(bA?bA.index(bz)>-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/<tbody/i,W=/<|&#?\w+;/,ae=/<(?:script|style)/i,O=/<(?:script|object|embed|option|style)/i,ah=new RegExp("<(?:"+aR+")","i"),o=/checked\s*(?:[^=]|=\s*.checked.)/i,bm=/\/(java|ecma)script/i,aN=/^\s*<!(?:\[CDATA\[|\-\-)/,ax={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div<div>","</div>"]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1></$2>");try{for(var bw=0,bv=this.length;bw<bv;bw++){if(this[bw].nodeType===1){b.cleanData(this[bw].getElementsByTagName("*"));this[bw].innerHTML=bx}}}catch(by){this.empty().append(bx)}}else{if(b.isFunction(bx)){this.each(function(bz){var e=b(this);e.html(bx.call(this,bz,e.html()))})}else{this.empty().append(bx)}}}return this},replaceWith:function(e){if(this[0]&&this[0].parentNode){if(b.isFunction(e)){return this.each(function(bx){var bw=b(this),bv=bw.html();bw.replaceWith(e.call(this,bx,bv))})}if(typeof e!=="string"){e=b(e).detach()}return this.each(function(){var bw=this.nextSibling,bv=this.parentNode;b(this).remove();if(bw){b(bw).before(e)}else{b(bv).append(e)}})}else{return this.length?this.pushStack(b(b.isFunction(e)?e():e),"replaceWith",e):this}},detach:function(e){return this.remove(e,true)},domManip:function(bB,bF,bE){var bx,by,bA,bD,bC=bB[0],bv=[];if(!b.support.checkClone&&arguments.length===3&&typeof bC==="string"&&o.test(bC)){return this.each(function(){b(this).domManip(bB,bF,bE,true)})}if(b.isFunction(bC)){return this.each(function(bH){var bG=b(this);bB[0]=bC.call(this,bH,bF?bG.html():L);bG.domManip(bB,bF,bE)})}if(this[0]){bD=bC&&bC.parentNode;if(b.support.parentNode&&bD&&bD.nodeType===11&&bD.childNodes.length===this.length){bx={fragment:bD}}else{bx=b.buildFragment(bB,this,bv)}bA=bx.fragment;if(bA.childNodes.length===1){by=bA=bA.firstChild}else{by=bA.firstChild}if(by){bF=bF&&b.nodeName(by,"tr");for(var bw=0,e=this.length,bz=e-1;bw<e;bw++){bE.call(bF?ba(this[bw],by):this[bw],bx.cacheable||(e>1&&bw<bz)?b.clone(bA,true,true):bA)}}if(bv.length){b.each(bv,bo)}}return this}});function ba(e,bv){return b.nodeName(e,"table")?(e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody"))):e}function t(bB,bv){if(bv.nodeType!==1||!b.hasData(bB)){return}var by,bx,e,bA=b._data(bB),bz=b._data(bv,bA),bw=bA.events;if(bw){delete bz.handle;bz.events={};for(by in bw){for(bx=0,e=bw[by].length;bx<e;bx++){b.event.add(bv,by+(bw[by][bx].namespace?".":"")+bw[by][bx].namespace,bw[by][bx],bw[by][bx].data)}}}if(bz.data){bz.data=b.extend({},bz.data)}}function ai(bv,e){var bw;if(e.nodeType!==1){return}if(e.clearAttributes){e.clearAttributes()}if(e.mergeAttributes){e.mergeAttributes(bv)}bw=e.nodeName.toLowerCase();if(bw==="object"){e.outerHTML=bv.outerHTML}else{if(bw==="input"&&(bv.type==="checkbox"||bv.type==="radio")){if(bv.checked){e.defaultChecked=e.checked=bv.checked}if(e.value!==bv.value){e.value=bv.value}}else{if(bw==="option"){e.selected=bv.defaultSelected}else{if(bw==="input"||bw==="textarea"){e.defaultValue=bv.defaultValue}}}}e.removeAttribute(b.expando)}b.buildFragment=function(bz,bx,bv){var by,e,bw,bA,bB=bz[0];if(bx&&bx[0]){bA=bx[0].ownerDocument||bx[0]}if(!bA.createDocumentFragment){bA=av}if(bz.length===1&&typeof bB==="string"&&bB.length<512&&bA===av&&bB.charAt(0)==="<"&&!O.test(bB)&&(b.support.checkClone||!o.test(bB))&&(b.support.html5Clone||!ah.test(bB))){e=true;bw=b.fragments[bB];if(bw&&bw!==1){by=bw}}if(!by){by=bA.createDocumentFragment();b.clean(bz,bA,by,bv)}if(e){b.fragments[bB]=bw?by:1}return{fragment:by,cacheable:e}};b.fragments={};b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,bv){b.fn[e]=function(bw){var bz=[],bC=b(bw),bB=this.length===1&&this[0].parentNode;if(bB&&bB.nodeType===11&&bB.childNodes.length===1&&bC.length===1){bC[bv](this[0]);return this}else{for(var bA=0,bx=bC.length;bA<bx;bA++){var by=(bA>0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1></$2>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]==="<table>"&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB<bG;bB++){E(bz[bB])}}else{E(bz)}}if(bz.nodeType){bI.push(bz)}else{bI=b.merge(bI,bz)}}if(bH){bF=function(bL){return !bL.type||bm.test(bL.type)};for(bE=0;bI[bE];bE++){if(bA&&b.nodeName(bI[bE],"script")&&(!bI[bE].type||bI[bE].type.toLowerCase()==="text/javascript")){bA.push(bI[bE].parentNode?bI[bE].parentNode.removeChild(bI[bE]):bI[bE])}else{if(bI[bE].nodeType===1){var bJ=b.grep(bI[bE].getElementsByTagName("script"),bF);bI.splice.apply(bI,[bE+1,0].concat(bJ))}bH.appendChild(bI[bE])}}}return bI},cleanData:function(bv){var by,bw,e=b.cache,bB=b.event.special,bA=b.support.deleteExpando;for(var bz=0,bx;(bx=bv[bz])!=null;bz++){if(bx.nodeName&&b.noData[bx.nodeName.toLowerCase()]){continue}bw=bx[b.expando];if(bw){by=e[bw];if(by&&by.events){for(var bC in by.events){if(bB[bC]){b.event.remove(bx,bC)}else{b.removeEvent(bx,bC,by.handle)}}if(by.handle){by.handle.elem=null}}if(bA){delete bx[b.expando]}else{if(bx.removeAttribute){bx.removeAttribute(b.expando)}}delete e[bw]}}}});function bo(e,bv){if(bv.src){b.ajax({url:bv.src,async:false,dataType:"script"})}else{b.globalEval((bv.text||bv.textContent||bv.innerHTML||"").replace(aN,"/*$0*/"))}if(bv.parentNode){bv.parentNode.removeChild(bv)}}var ak=/alpha\([^)]*\)/i,au=/opacity=([^)]*)/,z=/([A-Z]|^ms)/g,bc=/^-?\d+(?:px)?$/i,bn=/^-?\d/,I=/^([\-+])=([\-+.\de]+)/,a7={position:"absolute",visibility:"hidden",display:"block"},an=["Left","Right"],a1=["Top","Bottom"],Z,aI,aX;b.fn.css=function(e,bv){if(arguments.length===2&&bv===L){return this}return b.access(this,e,bv,true,function(bx,bw,by){return by!==L?b.style(bx,bw,by):b.css(bx,bw)})};b.extend({cssHooks:{opacity:{get:function(bw,bv){if(bv){var e=Z(bw,"opacity","opacity");return e===""?"1":e}else{return bw.style.opacity}}}},cssNumber:{fillOpacity:true,fontWeight:true,lineHeight:true,opacity:true,orphans:true,widows:true,zIndex:true,zoom:true},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(bx,bw,bD,by){if(!bx||bx.nodeType===3||bx.nodeType===8||!bx.style){return}var bB,bC,bz=b.camelCase(bw),bv=bx.style,bE=b.cssHooks[bz];bw=b.cssProps[bz]||bz;if(bD!==L){bC=typeof bD;if(bC==="string"&&(bB=I.exec(bD))){bD=(+(bB[1]+1)*+bB[2])+parseFloat(b.css(bx,bw));bC="number"}if(bD==null||bC==="number"&&isNaN(bD)){return}if(bC==="number"&&!b.cssNumber[bz]){bD+="px"}if(!bE||!("set" in bE)||(bD=bE.set(bx,bD))!==L){try{bv[bw]=bD}catch(bA){}}}else{if(bE&&"get" in bE&&(bB=bE.get(bx,false,by))!==L){return bB}return bv[bw]}},css:function(by,bx,bv){var bw,e;bx=b.camelCase(bx);e=b.cssHooks[bx];bx=b.cssProps[bx]||bx;if(bx==="cssFloat"){bx="float"}if(e&&"get" in e&&(bw=e.get(by,true,bv))!==L){return bw}else{if(Z){return Z(by,bx)}}},swap:function(bx,bw,by){var e={};for(var bv in bw){e[bv]=bx.style[bv];bx.style[bv]=bw[bv]}by.call(bx);for(bv in bw){bx.style[bv]=e[bv]}}});b.curCSS=b.css;b.each(["height","width"],function(bv,e){b.cssHooks[e]={get:function(by,bx,bw){var bz;if(bx){if(by.offsetWidth!==0){return p(by,e,bw)}else{b.swap(by,a7,function(){bz=p(by,e,bw)})}return bz}},set:function(bw,bx){if(bc.test(bx)){bx=parseFloat(bx);if(bx>=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length;if(bA>0){if(bv!=="border"){for(;bx<e;bx++){if(!bv){bA-=parseFloat(b.css(by,"padding"+bz[bx]))||0}if(bv==="margin"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}else{bA-=parseFloat(b.css(by,"border"+bz[bx]+"Width"))||0}}}return bA+"px"}bA=Z(by,bw,bw);if(bA<0||bA==null){bA=by.style[bw]||0}bA=parseFloat(bA)||0;if(bv){for(;bx<e;bx++){bA+=parseFloat(b.css(by,"padding"+bz[bx]))||0;if(bv!=="padding"){bA+=parseFloat(b.css(by,"border"+bz[bx]+"Width"))||0}if(bv==="margin"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}}}return bA+"px"}if(b.expr&&b.expr.filters){b.expr.filters.hidden=function(bw){var bv=bw.offsetWidth,e=bw.offsetHeight;return(bv===0&&e===0)||(!b.support.reliableHiddenOffsets&&((bw.style&&bw.style.display)||b.css(bw,"display"))==="none")};b.expr.filters.visible=function(e){return !b.expr.filters.hidden(e)}}var k=/%20/g,ap=/\[\]$/,bs=/\r?\n/g,bq=/#.*$/,aD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,aZ=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,aM=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,aQ=/^(?:GET|HEAD)$/,c=/^\/\//,M=/\?/,a6=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw<bz;bw++){bv=bx[bw];bC=/^\+/.test(bv);if(bC){bv=bv.substr(1)||"*"}bB=e[bv]=e[bv]||[];bB[bC?"unshift":"push"](bA)}}}}function aW(bv,bE,bz,bD,bB,bx){bB=bB||bE.dataTypes[0];bx=bx||{};bx[bB]=true;var bA=bv[bB],bw=0,e=bA?bA.length:0,by=(bv===aa),bC;for(;bw<e&&(by||!bC);bw++){bC=bA[bw](bE,bz,bD);if(typeof bC==="string"){if(!by||bx[bC]){bC=L}else{bE.dataTypes.unshift(bC);bC=aW(bv,bE,bz,bD,bC,bx)}}}if((by||!bC)&&!bx["*"]){bC=aW(bv,bE,bz,bD,"*",bx)}return bC}function am(bw,bx){var bv,e,by=b.ajaxSettings.flatOptions||{};for(bv in bx){if(bx[bv]!==L){(by[bv]?bw:(e||(e={})))[bv]=bx[bv]}}if(e){b.extend(true,bw,e)}}b.fn.extend({load:function(bw,bz,bA){if(typeof bw!=="string"&&A){return A.apply(this,arguments)}else{if(!this.length){return this}}var by=bw.indexOf(" ");if(by>=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("<div>").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA<bw;bA++){if(bA===1){for(bE in bH.converters){if(typeof bE==="string"){bG[bE.toLowerCase()]=bH.converters[bE]}}}bx=bC;bC=bD[bA];if(bC==="*"){bC=bx}else{if(bx!=="*"&&bx!==bC){by=bx+" "+bC;bF=bG[by]||bG["* "+bC];if(!bF){e=L;for(bv in bG){bB=bv.split(" ");if(bB[0]===bx||bB[0]==="*"){e=bG[bB[1]+" "+bC];if(e){bv=bG[bv];if(bv===true){bF=e}else{if(e===true){bF=bv}}break}}}}if(!(bF||e)){b.error("No conversion from "+by.replace(" "," to "))}if(bF!==true){bz=bF?bF(bz):e(bv(bz))}}}}return bz}var aC=b.now(),u=/(\=)\?(&|$)|\?\?/i;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return b.expando+"_"+(aC++)}});b.ajaxPrefilter("json jsonp",function(bD,bA,bC){var bx=bD.contentType==="application/x-www-form-urlencoded"&&(typeof bD.data==="string");if(bD.dataTypes[0]==="jsonp"||bD.jsonp!==false&&(u.test(bD.url)||bx&&u.test(bD.data))){var bB,bw=bD.jsonpCallback=b.isFunction(bD.jsonpCallback)?bD.jsonpCallback():bD.jsonpCallback,bz=bb[bw],e=bD.url,by=bD.data,bv="$1"+bw+"$2";if(bD.jsonp!==false){e=e.replace(u,bv);if(bD.url===e){if(bx){by=by.replace(u,bv)}if(bD.data===by){e+=(/\?/.test(e)?"&":"?")+bD.jsonp+"="+bw}}}bD.url=e;bD.data=by;bb[bw]=function(bE){bB=[bE]};bC.always(function(){bb[bw]=bz;if(bB&&b.isFunction(bz)){bb[bw](bB[0])}});bD.converters["script json"]=function(){if(!bB){b.error(bw+" was not called")}return bB[0]};bD.dataTypes[0]="json";return"script"}});b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){b.globalEval(e);return e}}});b.ajaxPrefilter("script",function(e){if(e.cache===L){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});b.ajaxTransport("script",function(bw){if(bw.crossDomain){var e,bv=av.head||av.getElementsByTagName("head")[0]||av.documentElement;return{send:function(bx,by){e=av.createElement("script");e.async="async";if(bw.scriptCharset){e.charset=bw.scriptCharset}e.src=bw.url;e.onload=e.onreadystatechange=function(bA,bz){if(bz||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(bv&&e.parentNode){bv.removeChild(e)}e=L;if(!bz){by(200,"success")}}};bv.insertBefore(e,bv.firstChild)},abort:function(){if(e){e.onload(0,1)}}}}});var B=bb.ActiveXObject?function(){for(var e in N){N[e](0,1)}}:false,y=0,N;function aL(){try{return new bb.XMLHttpRequest()}catch(bv){}}function aj(){try{return new bb.ActiveXObject("Microsoft.XMLHTTP")}catch(bv){}}b.ajaxSettings.xhr=bb.ActiveXObject?function(){return !this.isLocal&&aL()||aj()}:aL;(function(e){b.extend(b.support,{ajax:!!e,cors:!!e&&("withCredentials" in e)})})(b.ajaxSettings.xhr());if(b.support.ajax){b.ajaxTransport(function(e){if(!e.crossDomain||b.support.cors){var bv;return{send:function(bB,bw){var bA=e.xhr(),bz,by;if(e.username){bA.open(e.type,e.url,e.async,e.username,e.password)}else{bA.open(e.type,e.url,e.async)}if(e.xhrFields){for(by in e.xhrFields){bA[by]=e.xhrFields[by]}}if(e.mimeType&&bA.overrideMimeType){bA.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!bB["X-Requested-With"]){bB["X-Requested-With"]="XMLHttpRequest"}try{for(by in bB){bA.setRequestHeader(by,bB[by])}}catch(bx){}bA.send((e.hasContent&&e.data)||null);bv=function(bK,bE){var bF,bD,bC,bI,bH;try{if(bv&&(bE||bA.readyState===4)){bv=L;if(bz){bA.onreadystatechange=b.noop;if(B){delete N[bz]}}if(bE){if(bA.readyState!==4){bA.abort()}}else{bF=bA.status;bC=bA.getAllResponseHeaders();bI={};bH=bA.responseXML;if(bH&&bH.documentElement){bI.xml=bH}bI.text=bA.responseText;try{bD=bA.statusText}catch(bJ){bD=""}if(!bF&&e.isLocal&&!e.crossDomain){bF=bI.text?200:404}else{if(bF===1223){bF=204}}}}}catch(bG){if(!bE){bw(-1,bG)}}if(bI){bw(bF,bD,bI,bC)}};if(!e.async||bA.readyState===4){bv()}else{bz=++y;if(B){if(!N){N={};b(bb).unload(B)}N[bz]=bv}bA.onreadystatechange=bv}},abort:function(){if(bv){bv(0,1)}}}}})}var Q={},a8,m,aB=/^(?:toggle|show|hide)$/,aT=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,a3,aH=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],a4;b.fn.extend({show:function(bx,bA,bz){var bw,by;if(bx||bx===0){return this.animate(a0("show",3),bx,bA,bz)}else{for(var bv=0,e=this.length;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(!b._data(bw,"olddisplay")&&by==="none"){by=bw.style.display=""}if(by===""&&b.css(bw,"display")==="none"){b._data(bw,"olddisplay",x(bw.nodeName))}}}for(bv=0;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(by===""||by==="none"){bw.style.display=b._data(bw,"olddisplay")||""}}}return this}},hide:function(bx,bA,bz){if(bx||bx===0){return this.animate(a0("hide",3),bx,bA,bz)}else{var bw,by,bv=0,e=this.length;for(;bv<e;bv++){bw=this[bv];if(bw.style){by=b.css(bw,"display");if(by!=="none"&&!b._data(bw,"olddisplay")){b._data(bw,"olddisplay",by)}}}for(bv=0;bv<e;bv++){if(this[bv].style){this[bv].style.display="none"}}return this}},_toggle:b.fn.toggle,toggle:function(bw,bv,bx){var e=typeof bw==="boolean";if(b.isFunction(bw)&&b.isFunction(bv)){this._toggle.apply(this,arguments)}else{if(bw==null||e){this.each(function(){var by=e?bw:b(this).is(":hidden");b(this)[by?"show":"hide"]()})}else{this.animate(a0("toggle",3),bw,bv,bx)}}return this},fadeTo:function(e,bx,bw,bv){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:bx},e,bw,bv)},animate:function(bz,bw,by,bx){var e=b.speed(bw,by,bx);if(b.isEmptyObject(bz)){return this.each(e.complete,[false])}bz=b.extend({},bz);function bv(){if(e.queue===false){b._mark(this)}var bE=b.extend({},e),bK=this.nodeType===1,bI=bK&&b(this).is(":hidden"),bB,bF,bD,bJ,bH,bC,bG,bL,bA;bE.animatedProperties={};for(bD in bz){bB=b.camelCase(bD);if(bD!==bB){bz[bB]=bz[bD];delete bz[bD]}bF=bz[bB];if(b.isArray(bF)){bE.animatedProperties[bB]=bF[1];bF=bz[bB]=bF[0]}else{bE.animatedProperties[bB]=bE.specialEasing&&bE.specialEasing[bB]||bE.easing||"swing"}if(bF==="hide"&&bI||bF==="show"&&!bI){return bE.complete.call(this)}if(bK&&(bB==="height"||bB==="width")){bE.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(b.css(this,"display")==="inline"&&b.css(this,"float")==="none"){if(!b.support.inlineBlockNeedsLayout||x(this.nodeName)==="inline"){this.style.display="inline-block"}else{this.style.zoom=1}}}}if(bE.overflow!=null){this.style.overflow="hidden"}for(bD in bz){bJ=new b.fx(this,bE,bD);bF=bz[bD];if(aB.test(bF)){bA=b._data(this,"toggle"+bD)||(bF==="toggle"?bI?"show":"hide":0);if(bA){b._data(this,"toggle"+bD,bA==="show"?"hide":"show");bJ[bA]()}else{bJ[bF]()}}else{bH=aT.exec(bF);bC=bJ.cur();if(bH){bG=parseFloat(bH[2]);bL=bH[3]||(b.cssNumber[bD]?"":"px");if(bL!=="px"){b.style(this,bD,(bG||1)+bL);bC=((bG||1)/bJ.cur())*bC;b.style(this,bD,bC+bL)}if(bH[1]){bG=((bH[1]==="-="?-1:1)*bG)+bC}bJ.custom(bC,bG,bL)}else{bJ.custom(bC,bF,"")}}}return true}return e.queue===false?this.each(bv):this.queue(e.queue,bv)},stop:function(bw,bv,e){if(typeof bw!=="string"){e=bv;bv=bw;bw=L}if(bv&&bw!==false){this.queue(bw||"fx",[])}return this.each(function(){var bx,by=false,bA=b.timers,bz=b._data(this);if(!e){b._unmark(true,this)}function bB(bE,bF,bD){var bC=bF[bD];b.removeData(bE,bD,true);bC.stop(e)}if(bw==null){for(bx in bz){if(bz[bx]&&bz[bx].stop&&bx.indexOf(".run")===bx.length-4){bB(this,bz,bx)}}}else{if(bz[bx=bw+".run"]&&bz[bx].stop){bB(this,bz,bx)}}for(bx=bA.length;bx--;){if(bA[bx].elem===this&&(bw==null||bA[bx].queue===bw)){if(e){bA[bx](true)}else{bA[bx].saveState()}by=true;bA.splice(bx,1)}}if(!(e&&by)){b.dequeue(this,bw)}})}});function bh(){setTimeout(at,0);return(a4=b.now())}function at(){a4=L}function a0(bv,e){var bw={};b.each(aH.concat.apply([],aH.slice(0,e)),function(){bw[this]=bv});return bw}b.each({slideDown:a0("show",1),slideUp:a0("hide",1),slideToggle:a0("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,bv){b.fn[e]=function(bw,by,bx){return this.animate(bv,bw,by,bx)}});b.extend({speed:function(bw,bx,bv){var e=bw&&typeof bw==="object"?b.extend({},bw):{complete:bv||!bv&&bx||b.isFunction(bw)&&bw,duration:bw,easing:bv&&bx||bx&&!b.isFunction(bx)&&bx};e.duration=b.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in b.fx.speeds?b.fx.speeds[e.duration]:b.fx.speeds._default;if(e.queue==null||e.queue===true){e.queue="fx"}e.old=e.complete;e.complete=function(by){if(b.isFunction(e.old)){e.old.call(this)}if(e.queue){b.dequeue(this,e.queue)}else{if(by!==false){b._unmark(this)}}};return e},easing:{linear:function(bw,bx,e,bv){return e+bv*bw},swing:function(bw,bx,e,bv){return((-Math.cos(bw*Math.PI)/2)+0.5)*bv+e}},timers:[],fx:function(bv,e,bw){this.options=e;this.elem=bv;this.prop=bw;e.orig=e.orig||{}}});b.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(b.fx.step[this.prop]||b.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var e,bv=b.css(this.elem,this.prop);return isNaN(e=parseFloat(bv))?!bv||bv==="auto"?0:bv:e},custom:function(bz,by,bx){var e=this,bw=b.fx;this.startTime=a4||bh();this.end=by;this.now=this.start=bz;this.pos=this.state=0;this.unit=bx||this.unit||(b.cssNumber[this.prop]?"":"px");function bv(bA){return e.step(bA)}bv.queue=this.options.queue;bv.elem=this.elem;bv.saveState=function(){if(e.options.hide&&b._data(e.elem,"fxshow"+e.prop)===L){b._data(e.elem,"fxshow"+e.prop,e.start)}};if(bv()&&b.timers.push(bv)&&!a3){a3=setInterval(bw.tick,bw.interval)}},show:function(){var e=b._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=e||b.style(this.elem,this.prop);this.options.show=true;if(e!==L){this.custom(this.cur(),e)}else{this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur())}b(this.elem).show()},hide:function(){this.options.orig[this.prop]=b._data(this.elem,"fxshow"+this.prop)||b.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(by){var bA,bB,bv,bx=a4||bh(),e=true,bz=this.elem,bw=this.options;if(by||bx>=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e<bv.length;e++){bw=bv[e];if(!bw()&&bv[e]===bw){bv.splice(e--,1)}}if(!bv.length){b.fx.stop()}},interval:13,stop:function(){clearInterval(a3);a3=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(e){b.style(e.elem,"opacity",e.now)},_default:function(e){if(e.elem.style&&e.elem.style[e.prop]!=null){e.elem.style[e.prop]=e.now+e.unit}else{e.elem[e.prop]=e.now}}}});b.each(["width","height"],function(e,bv){b.fx.step[bv]=function(bw){b.style(bw.elem,bv,Math.max(0,bw.now)+bw.unit)}});if(b.expr&&b.expr.filters){b.expr.filters.animated=function(e){return b.grep(b.timers,function(bv){return e===bv.elem}).length}}function x(bx){if(!Q[bx]){var e=av.body,bv=b("<"+bx+">").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b})}})(window);/*!
+ * jQuery UI 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h<j.length;h++){if(e.options[j[h][0]]){j[h][1].apply(e.element,f)}}}},contains:function(f,e){return document.compareDocumentPosition?f.compareDocumentPosition(e)&16:f!==e&&f.contains(e)},hasScroll:function(h,f){if(a(h).css("overflow")==="hidden"){return false}var e=(f&&f==="left")?"scrollLeft":"scrollTop",g=false;if(h[e]>0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*!
+ * jQuery UI Widget 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*!
+ * jQuery UI Mouse 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ *	jquery.ui.widget.js
+ */
+(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g<l.length;g++){var j=c.trim(l[g]),e="ui-resizable-"+j;var h=c('<div class="ui-resizable-handle '+e+'"></div>');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(h<e.maxWidth){e.maxWidth=h}if(k<e.maxHeight){e.maxHeight=k}}this._vBoundaries=e},_updateCache:function(e){var f=this.options;this.offset=this.helper.offset();if(a(e.left)){this.position.left=e.left}if(a(e.top)){this.position.top=e.top}if(a(e.height)){this.size.height=e.height}if(a(e.width)){this.size.width=e.width}},_updateRatio:function(h,g){var i=this.options,j=this.position,f=this.size,e=this.axis;if(a(h.height)){h.width=(h.height*this.aspectRatio)}else{if(a(h.width)){h.height=(h.width/this.aspectRatio)}}if(e=="sw"){h.left=j.left+(f.width-h.width);h.top=null}if(e=="nw"){h.top=j.top+(f.height-h.height);h.left=j.left+(f.width-h.width)}return h},_respectSize:function(l,g){var j=this.helper,i=this._vBoundaries,r=this._aspectRatio||g.shiftKey,q=this.axis,t=a(l.width)&&i.maxWidth&&(i.maxWidth<l.width),m=a(l.height)&&i.maxHeight&&(i.maxHeight<l.height),h=a(l.width)&&i.minWidth&&(i.minWidth>l.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f<this._proportionallyResizeElements.length;f++){var h=this._proportionallyResizeElements[f];if(!this.borderDif){var e=[h.css("borderTopWidth"),h.css("borderRightWidth"),h.css("borderBottomWidth"),h.css("borderLeftWidth")],j=[h.css("paddingTop"),h.css("paddingRight"),h.css("paddingBottom"),h.css("paddingLeft")];this.borderDif=c.map(e,function(l,n){var m=parseInt(l,10)||0,o=parseInt(j[n],10)||0;return m+o})}if(c.browser.msie&&!(!(c(g).is(":hidden")||c(g).parents(":hidden").length))){continue}h.css({height:(g.height()-this.borderDif[0]-this.borderDif[2])||0,width:(g.width()-this.borderDif[1]-this.borderDif[3])||0})}},_renderProxy:function(){var f=this.element,i=this.options;this.elementOffset=f.offset();if(this._helper){this.helper=this.helper||c('<div style="overflow:hidden;"></div>');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*!
+ * jQuery hashchange event - v1.3 - 7/21/2010
+ * http://benalman.com/projects/jquery-hashchange-plugin/
+ * 
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);(function(c){var a=c.scrollTo=function(f,e,d){c(window).scrollTo(f,e,d)};a.defaults={axis:"xy",duration:parseFloat(c.fn.jquery)>=1.3?0:1};a.window=function(d){return c(window)._scrollable()};c.fn._scrollable=function(){return this.map(function(){var e=this,d=!e.nodeName||c.inArray(e.nodeName.toLowerCase(),["iframe","#document","html","body"])!=-1;if(!d){return e}var f=(e.contentWindow||e).document||e.ownerDocument||e;return c.browser.safari||f.compatMode=="BackCompat"?f.body:f.documentElement})};c.fn.scrollTo=function(f,e,d){if(typeof e=="object"){d=e;e=0}if(typeof d=="function"){d={onAfter:d}}if(f=="max"){f=9000000000}d=c.extend({},a.defaults,d);e=e||d.speed||d.duration;d.queue=d.queue&&d.axis.length>1;if(d.queue){e/=2}d.offset=b(d.offset);d.over=b(d.over);return this._scrollable().each(function(){var l=this,j=c(l),k=f,i,g={},m=j.is("html,body");switch(typeof k){case"number":case"string":if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(k)){k=b(k);break}k=c(k,this);case"object":if(k.is||k.style){i=(k=c(k)).offset()}}c.each(d.axis.split(""),function(q,r){var s=r=="x"?"Left":"Top",u=s.toLowerCase(),p="scroll"+s,o=l[p],n=a.max(l,r);if(i){g[p]=i[u]+(m?0:o-j.offset()[u]);if(d.margin){g[p]-=parseInt(k.css("margin"+s))||0;g[p]-=parseInt(k.css("border"+s+"Width"))||0}g[p]+=d.offset[u]||0;if(d.over[u]){g[p]+=k[r=="x"?"width":"height"]()*d.over[u]}}else{var t=k[u];g[p]=t.slice&&t.slice(-1)=="%"?parseFloat(t)/100*n:t}if(/^\d+$/.test(g[p])){g[p]=g[p]<=0?0:Math.min(g[p],n)}if(!q&&d.queue){if(o!=g[p]){h(d.onAfterFirst)}delete g[p]}});h(d.onAfter);function h(n){j.animate(g,e,d.easing,n&&function(){n.call(this,f,d)})}}).end()};a.max=function(j,i){var h=i=="x"?"Width":"Height",e="scroll"+h;if(!c(j).is("html,body")){return j[e]-c(j)[h.toLowerCase()]()}var g="client"+h,f=j.ownerDocument.documentElement,d=j.ownerDocument.body;return Math.max(f[e],d[e])-Math.min(f[g],d[g])};function b(d){return typeof d=="object"?d:{top:d,left:d}}})(jQuery);/*!
+ PowerTip - v1.2.0 - 2013-04-03
+ http://stevenbenner.github.com/jquery-powertip/
+ Copyright (c) 2013 Steven Benner (http://stevenbenner.com/).
+ Released under MIT license.
+ https://raw.github.com/stevenbenner/jquery-powertip/master/LICENSE.txt
+*/
+(function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{a(jQuery)}}(function(k){var A=k(document),s=k(window),w=k("body");var n="displayController",e="hasActiveHover",d="forcedOpen",u="hasMouseMove",f="mouseOnToPopup",g="originalTitle",y="powertip",o="powertipjq",l="powertiptarget",E=180/Math.PI;var c={isTipOpen:false,isFixedTipOpen:false,isClosing:false,tipOpenImminent:false,activeHover:null,currentX:0,currentY:0,previousX:0,previousY:0,desyncTimeout:null,mouseTrackingActive:false,delayInProgress:false,windowWidth:0,windowHeight:0,scrollTop:0,scrollLeft:0};var p={none:0,top:1,bottom:2,left:4,right:8};k.fn.powerTip=function(F,N){if(!this.length){return this}if(k.type(F)==="string"&&k.powerTip[F]){return k.powerTip[F].call(this,this,N)}var O=k.extend({},k.fn.powerTip.defaults,F),G=new x(O);h();this.each(function M(){var R=k(this),Q=R.data(y),P=R.data(o),T=R.data(l),S;if(R.data(n)){k.powerTip.destroy(R)}S=R.attr("title");if(!Q&&!T&&!P&&S){R.data(y,S);R.data(g,S);R.removeAttr("title")}R.data(n,new t(R,O,G))});if(!O.manual){this.on({"mouseenter.powertip":function J(P){k.powerTip.show(this,P)},"mouseleave.powertip":function L(){k.powerTip.hide(this)},"focus.powertip":function K(){k.powerTip.show(this)},"blur.powertip":function H(){k.powerTip.hide(this,true)},"keydown.powertip":function I(P){if(P.keyCode===27){k.powerTip.hide(this,true)}}})}return this};k.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false};k.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};k.powerTip={show:function z(F,G){if(G){i(G);c.previousX=G.pageX;c.previousY=G.pageY;k(F).data(n).show()}else{k(F).first().data(n).show(true,true)}return F},reposition:function r(F){k(F).first().data(n).resetPosition();return F},hide:function D(G,F){if(G){k(G).first().data(n).hide(F)}else{if(c.activeHover){c.activeHover.data(n).hide(true)}}return G},destroy:function C(G){k(G).off(".powertip").each(function F(){var I=k(this),H=[g,n,e,d];if(I.data(g)){I.attr("title",I.data(g));H.push(y)}I.removeData(H)});return G}};k.powerTip.showTip=k.powerTip.show;k.powerTip.closeTip=k.powerTip.hide;function b(){var F=this;F.top="auto";F.left="auto";F.right="auto";F.bottom="auto";F.set=function(H,G){if(k.isNumeric(G)){F[H]=Math.round(G)}}}function t(K,N,F){var J=null;function L(P,Q){M();if(!K.data(e)){if(!P){c.tipOpenImminent=true;J=setTimeout(function O(){J=null;I()},N.intentPollInterval)}else{if(Q){K.data(d,true)}F.showTip(K)}}}function G(P){M();c.tipOpenImminent=false;if(K.data(e)){K.data(d,false);if(!P){c.delayInProgress=true;J=setTimeout(function O(){J=null;F.hideTip(K);c.delayInProgress=false},N.closeDelay)}else{F.hideTip(K)}}}function I(){var Q=Math.abs(c.previousX-c.currentX),O=Math.abs(c.previousY-c.currentY),P=Q+O;if(P<N.intentSensitivity){F.showTip(K)}else{c.previousX=c.currentX;c.previousY=c.currentY;L()}}function M(){J=clearTimeout(J);c.delayInProgress=false}function H(){F.resetPosition(K)}this.show=L;this.hide=G;this.cancel=M;this.resetPosition=H}function j(){function G(M,L,J,O,P){var K=L.split("-")[0],N=new b(),I;if(q(M)){I=H(M,K)}else{I=F(M,K)}switch(L){case"n":N.set("left",I.left-(J/2));N.set("bottom",c.windowHeight-I.top+P);break;case"e":N.set("left",I.left+P);N.set("top",I.top-(O/2));break;case"s":N.set("left",I.left-(J/2));N.set("top",I.top+P);break;case"w":N.set("top",I.top-(O/2));N.set("right",c.windowWidth-I.left+P);break;case"nw":N.set("bottom",c.windowHeight-I.top+P);N.set("right",c.windowWidth-I.left-20);break;case"nw-alt":N.set("left",I.left);N.set("bottom",c.windowHeight-I.top+P);break;case"ne":N.set("left",I.left-20);N.set("bottom",c.windowHeight-I.top+P);break;case"ne-alt":N.set("bottom",c.windowHeight-I.top+P);N.set("right",c.windowWidth-I.left);break;case"sw":N.set("top",I.top+P);N.set("right",c.windowWidth-I.left-20);break;case"sw-alt":N.set("left",I.left);N.set("top",I.top+P);break;case"se":N.set("left",I.left-20);N.set("top",I.top+P);break;case"se-alt":N.set("top",I.top+P);N.set("right",c.windowWidth-I.left);break}return N}function F(K,J){var O=K.offset(),N=K.outerWidth(),I=K.outerHeight(),M,L;switch(J){case"n":M=O.left+N/2;L=O.top;break;case"e":M=O.left+N;L=O.top+I/2;break;case"s":M=O.left+N/2;L=O.top+I;break;case"w":M=O.left;L=O.top+I/2;break;case"nw":M=O.left;L=O.top;break;case"ne":M=O.left+N;L=O.top;break;case"sw":M=O.left;L=O.top+I;break;case"se":M=O.left+N;L=O.top+I;break}return{top:L,left:M}}function H(O,K){var S=O.closest("svg")[0],N=O[0],W=S.createSVGPoint(),L=N.getBBox(),V=N.getScreenCTM(),M=L.width/2,Q=L.height/2,P=[],I=["nw","n","ne","e","se","s","sw","w"],U,X,R,T;function J(){P.push(W.matrixTransform(V))}W.x=L.x;W.y=L.y;J();W.x+=M;J();W.x+=M;J();W.y+=Q;J();W.y+=Q;J();W.x-=M;J();W.x-=M;J();W.y-=Q;J();if(P[0].y!==P[1].y||P[0].x!==P[7].x){X=Math.atan2(V.b,V.a)*E;R=Math.ceil(((X%360)-22.5)/45);if(R<1){R+=8}while(R--){I.push(I.shift())}}for(T=0;T<P.length;T++){if(I[T]===K){U=P[T];break}}return{top:U.y+c.scrollTop,left:U.x+c.scrollLeft}}this.compute=G}function x(Q){var P=new j(),O=k("#"+Q.popupId);if(O.length===0){O=k("<div/>",{id:Q.popupId});if(w.length===0){w=k("body")}w.append(O)}if(Q.followMouse){if(!O.data(u)){A.on("mousemove",M);s.on("scroll",M);O.data(u,true)}}if(Q.mouseOnToPopup){O.on({mouseenter:function L(){if(O.data(f)){if(c.activeHover){c.activeHover.data(n).cancel()}}},mouseleave:function N(){if(c.activeHover){c.activeHover.data(n).hide()}}})}function I(S){S.data(e,true);O.queue(function R(T){H(S);T()})}function H(S){var U;if(!S.data(e)){return}if(c.isTipOpen){if(!c.isClosing){K(c.activeHover)}O.delay(100).queue(function R(V){H(S);V()});return}S.trigger("powerTipPreRender");U=B(S);if(U){O.empty().append(U)}else{return}S.trigger("powerTipRender");c.activeHover=S;c.isTipOpen=true;O.data(f,Q.mouseOnToPopup);if(!Q.followMouse){G(S);c.isFixedTipOpen=true}else{M()}O.fadeIn(Q.fadeInTime,function T(){if(!c.desyncTimeout){c.desyncTimeout=setInterval(J,500)}S.trigger("powerTipOpen")})}function K(R){c.isClosing=true;c.activeHover=null;c.isTipOpen=false;c.desyncTimeout=clearInterval(c.desyncTimeout);R.data(e,false);R.data(d,false);O.fadeOut(Q.fadeOutTime,function S(){var T=new b();c.isClosing=false;c.isFixedTipOpen=false;O.removeClass();T.set("top",c.currentY+Q.offset);T.set("left",c.currentX+Q.offset);O.css(T);R.trigger("powerTipClose")})}function M(){if(!c.isFixedTipOpen&&(c.isTipOpen||(c.tipOpenImminent&&O.data(u)))){var R=O.outerWidth(),V=O.outerHeight(),U=new b(),S,T;U.set("top",c.currentY+Q.offset);U.set("left",c.currentX+Q.offset);S=m(U,R,V);if(S!==p.none){T=a(S);if(T===1){if(S===p.right){U.set("left",c.windowWidth-R)}else{if(S===p.bottom){U.set("top",c.scrollTop+c.windowHeight-V)}}}else{U.set("left",c.currentX-R-Q.offset);U.set("top",c.currentY-V-Q.offset)}}O.css(U)}}function G(S){var R,T;if(Q.smartPlacement){R=k.fn.powerTip.smartPlacementLists[Q.placement];k.each(R,function(U,W){var V=m(F(S,W),O.outerWidth(),O.outerHeight());T=W;if(V===p.none){return false}})}else{F(S,Q.placement);T=Q.placement}O.addClass(T)}function F(U,T){var R=0,S,W,V=new b();V.set("top",0);V.set("left",0);O.css(V);do{S=O.outerWidth();W=O.outerHeight();V=P.compute(U,T,S,W,Q.offset);O.css(V)}while(++R<=5&&(S!==O.outerWidth()||W!==O.outerHeight()));return V}function J(){var R=false;if(c.isTipOpen&&!c.isClosing&&!c.delayInProgress){if(c.activeHover.data(e)===false||c.activeHover.is(":disabled")){R=true}else{if(!v(c.activeHover)&&!c.activeHover.is(":focus")&&!c.activeHover.data(d)){if(O.data(f)){if(!v(O)){R=true}}else{R=true}}}if(R){K(c.activeHover)}}}this.showTip=I;this.hideTip=K;this.resetPosition=G}function q(F){return window.SVGElement&&F[0] instanceof SVGElement}function h(){if(!c.mouseTrackingActive){c.mouseTrackingActive=true;k(function H(){c.scrollLeft=s.scrollLeft();c.scrollTop=s.scrollTop();c.windowWidth=s.width();c.windowHeight=s.height()});A.on("mousemove",i);s.on({resize:function G(){c.windowWidth=s.width();c.windowHeight=s.height()},scroll:function F(){var I=s.scrollLeft(),J=s.scrollTop();if(I!==c.scrollLeft){c.currentX+=I-c.scrollLeft;c.scrollLeft=I}if(J!==c.scrollTop){c.currentY+=J-c.scrollTop;c.scrollTop=J}}})}}function i(F){c.currentX=F.pageX;c.currentY=F.pageY}function v(F){var H=F.offset(),J=F[0].getBoundingClientRect(),I=J.right-J.left,G=J.bottom-J.top;return c.currentX>=H.left&&c.currentX<=H.left+I&&c.currentY>=H.top&&c.currentY<=H.top+G}function B(I){var G=I.data(y),F=I.data(o),K=I.data(l),H,J;if(G){if(k.isFunction(G)){G=G.call(I[0])}J=G}else{if(F){if(k.isFunction(F)){F=F.call(I[0])}if(F.length>0){J=F.clone(true,true)}}else{if(K){H=k("#"+K);if(H.length>0){J=H.html()}}}}return J}function m(M,L,K){var G=c.scrollTop,J=c.scrollLeft,I=G+c.windowHeight,F=J+c.windowWidth,H=p.none;if(M.top<G||Math.abs(M.bottom-c.windowHeight)-K<G){H|=p.top}if(M.top+K>I||Math.abs(M.bottom-c.windowHeight)>I){H|=p.bottom}if(M.left<J||M.right+L>F){H|=p.left}if(M.left+L>F||M.right<J){H|=p.right}return H}function a(G){var F=0;while(G){G&=G-1;F++}return F}}));/*!
+ * jQuery UI Touch Punch 0.2.3
+ *
+ * Copyright 2011–2014, Dave Furfero
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ *
+ * Depends:
+ *  jquery.ui.widget.js
+ *  jquery.ui.mouse.js
+ */
+(function(b){b.support.touch="ontouchend" in document;if(!b.support.touch){return}var d=b.ui.mouse.prototype,f=d._mouseInit,c=d._mouseDestroy,a;function e(h,i){if(h.originalEvent.touches.length>1){return}h.preventDefault();var j=h.originalEvent.changedTouches[0],g=document.createEvent("MouseEvents");g.initMouseEvent(i,true,true,window,1,j.screenX,j.screenY,j.clientX,j.clientY,false,false,false,false,0,null);h.target.dispatchEvent(g)}d._touchStart=function(h){var g=this;if(a||!g._mouseCapture(h.originalEvent.changedTouches[0])){return}a=true;g._touchMoved=false;e(h,"mouseover");e(h,"mousemove");e(h,"mousedown")};d._touchMove=function(g){if(!a){return}this._touchMoved=true;e(g,"mousemove")};d._touchEnd=function(g){if(!a){return}e(g,"mouseup");e(g,"mouseout");if(!this._touchMoved){e(g,"click")}a=false};d._mouseInit=function(){var g=this;g.element.bind({touchstart:b.proxy(g,"_touchStart"),touchmove:b.proxy(g,"_touchMove"),touchend:b.proxy(g,"_touchEnd")});f.call(g)};d._mouseDestroy=function(){var g=this;g.element.unbind({touchstart:b.proxy(g,"_touchStart"),touchmove:b.proxy(g,"_touchMove"),touchend:b.proxy(g,"_touchEnd")});c.call(g)}})(jQuery);/*!
+ * SmartMenus jQuery Plugin - v1.0.0 - January 27, 2016
+ * http://www.smartmenus.org/
+ *
+ * Copyright Vasil Dinkov, Vadikom Web Ltd.
+ * http://vadikom.com
+ *
+ * Licensed MIT
+ */
+(function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{if(typeof module==="object"&&typeof module.exports==="object"){module.exports=a(require("jquery"))}else{a(jQuery)}}}(function(a){var b=[],e=!!window.createPopup,f=false,d="ontouchstart" in window,h=false,g=window.requestAnimationFrame||function(l){return setTimeout(l,1000/60)},c=window.cancelAnimationFrame||function(l){clearTimeout(l)};function k(m){var n=".smartmenus_mouse";if(!h&&!m){var o=true,l=null;a(document).bind(i([["mousemove",function(s){var t={x:s.pageX,y:s.pageY,timeStamp:new Date().getTime()};if(l){var q=Math.abs(l.x-t.x),p=Math.abs(l.y-t.y);if((q>0||p>0)&&q<=2&&p<=2&&t.timeStamp-l.timeStamp<=300){f=true;if(o){var r=a(s.target).closest("a");if(r.is("a")){a.each(b,function(){if(a.contains(this.$root[0],r[0])){this.itemEnter({currentTarget:r[0]});return false}})}o=false}}}l=t}],[d?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut",function(p){if(j(p.originalEvent)){f=false}}]],n));h=true}else{if(h&&m){a(document).unbind(n);h=false}}}function j(l){return !/^(4|mouse)$/.test(l.pointerType)}function i(l,n){if(!n){n=""}var m={};a.each(l,function(o,p){m[p[0].split(" ").join(n+" ")+n]=p[1]});return m}a.SmartMenus=function(m,l){this.$root=a(m);this.opts=l;this.rootId="";this.accessIdPrefix="";this.$subArrow=null;this.activatedItems=[];this.visibleSubMenus=[];this.showTimeout=0;this.hideTimeout=0;this.scrollTimeout=0;this.clickActivated=false;this.focusActivated=false;this.zIndexInc=0;this.idInc=0;this.$firstLink=null;this.$firstSub=null;this.disabled=false;this.$disableOverlay=null;this.$touchScrollingSub=null;this.cssTransforms3d="perspective" in m.style||"webkitPerspective" in m.style;this.wasCollapsible=false;this.init()};a.extend(a.SmartMenus,{hideAll:function(){a.each(b,function(){this.menuHideAll()})},destroy:function(){while(b.length){b[0].destroy()}k(true)},prototype:{init:function(n){var l=this;if(!n){b.push(this);this.rootId=(new Date().getTime()+Math.random()+"").replace(/\D/g,"");this.accessIdPrefix="sm-"+this.rootId+"-";if(this.$root.hasClass("sm-rtl")){this.opts.rightToLeftSubMenus=true}var r=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).bind(i([["mouseover focusin",a.proxy(this.rootOver,this)],["mouseout focusout",a.proxy(this.rootOut,this)],["keydown",a.proxy(this.rootKeyDown,this)]],r)).delegate("a",i([["mouseenter",a.proxy(this.itemEnter,this)],["mouseleave",a.proxy(this.itemLeave,this)],["mousedown",a.proxy(this.itemDown,this)],["focus",a.proxy(this.itemFocus,this)],["blur",a.proxy(this.itemBlur,this)],["click",a.proxy(this.itemClick,this)]],r));r+=this.rootId;if(this.opts.hideOnClick){a(document).bind(i([["touchstart",a.proxy(this.docTouchStart,this)],["touchmove",a.proxy(this.docTouchMove,this)],["touchend",a.proxy(this.docTouchEnd,this)],["click",a.proxy(this.docClick,this)]],r))}a(window).bind(i([["resize orientationchange",a.proxy(this.winResize,this)]],r));if(this.opts.subIndicators){this.$subArrow=a("<span/>").addClass("sub-arrow");if(this.opts.subIndicatorsText){this.$subArrow.html(this.opts.subIndicatorsText)}}k()}this.$firstSub=this.$root.find("ul").each(function(){l.menuInit(a(this))}).eq(0);this.$firstLink=this.$root.find("a").eq(0);if(this.opts.markCurrentItem){var p=/(index|default)\.[^#\?\/]*/i,m=/#.*/,q=window.location.href.replace(p,""),o=q.replace(m,"");this.$root.find("a").each(function(){var s=this.href.replace(p,""),t=a(this);if(s==q||s==o){t.addClass("current");if(l.opts.markCurrentTree){t.parentsUntil("[data-smartmenus-id]","ul").each(function(){a(this).dataSM("parent-a").addClass("current")})}}})}this.wasCollapsible=this.isCollapsible()},destroy:function(m){if(!m){var n=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").unbind(n).undelegate(n);n+=this.rootId;a(document).unbind(n);a(window).unbind(n);if(this.opts.subIndicators){this.$subArrow=null}}this.menuHideAll();var l=this;this.$root.find("ul").each(function(){var o=a(this);if(o.dataSM("scroll-arrows")){o.dataSM("scroll-arrows").remove()}if(o.dataSM("shown-before")){if(l.opts.subMenusMinWidth||l.opts.subMenusMaxWidth){o.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap")}if(o.dataSM("scroll-arrows")){o.dataSM("scroll-arrows").remove()}o.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})}if((o.attr("id")||"").indexOf(l.accessIdPrefix)==0){o.removeAttr("id")}}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("ie-shim").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded");this.$root.find("a.has-submenu").each(function(){var o=a(this);if(o.attr("id").indexOf(l.accessIdPrefix)==0){o.removeAttr("id")}}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub");if(this.opts.subIndicators){this.$root.find("span.sub-arrow").remove()}if(this.opts.markCurrentItem){this.$root.find("a.current").removeClass("current")}if(!m){this.$root=null;this.$firstLink=null;this.$firstSub=null;if(this.$disableOverlay){this.$disableOverlay.remove();this.$disableOverlay=null}b.splice(a.inArray(this,b),1)}},disable:function(l){if(!this.disabled){this.menuHideAll();if(!l&&!this.opts.isPopup&&this.$root.is(":visible")){var m=this.$root.offset();this.$disableOverlay=a('<div class="sm-jquery-disable-overlay"/>').css({position:"absolute",top:m.top,left:m.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(true),opacity:0}).appendTo(document.body)}this.disabled=true}},docClick:function(l){if(this.$touchScrollingSub){this.$touchScrollingSub=null;return}if(this.visibleSubMenus.length&&!a.contains(this.$root[0],l.target)||a(l.target).is("a")){this.menuHideAll()}},docTouchEnd:function(m){if(!this.lastTouch){return}if(this.visibleSubMenus.length&&(this.lastTouch.x2===undefined||this.lastTouch.x1==this.lastTouch.x2)&&(this.lastTouch.y2===undefined||this.lastTouch.y1==this.lastTouch.y2)&&(!this.lastTouch.target||!a.contains(this.$root[0],this.lastTouch.target))){if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}var l=this;this.hideTimeout=setTimeout(function(){l.menuHideAll()},350)}this.lastTouch=null},docTouchMove:function(m){if(!this.lastTouch){return}var l=m.originalEvent.touches[0];this.lastTouch.x2=l.pageX;this.lastTouch.y2=l.pageY},docTouchStart:function(m){var l=m.originalEvent.touches[0];this.lastTouch={x1:l.pageX,y1:l.pageY,target:l.target}},enable:function(){if(this.disabled){if(this.$disableOverlay){this.$disableOverlay.remove();this.$disableOverlay=null}this.disabled=false}},getClosestMenu:function(m){var l=a(m).closest("ul");while(l.dataSM("in-mega")){l=l.parent().closest("ul")}return l[0]||null},getHeight:function(l){return this.getOffset(l,true)},getOffset:function(n,l){var m;if(n.css("display")=="none"){m={position:n[0].style.position,visibility:n[0].style.visibility};n.css({position:"absolute",visibility:"hidden"}).show()}var o=n[0].getBoundingClientRect&&n[0].getBoundingClientRect(),p=o&&(l?o.height||o.bottom-o.top:o.width||o.right-o.left);if(!p&&p!==0){p=l?n[0].offsetHeight:n[0].offsetWidth}if(m){n.hide().css(m)}return p},getStartZIndex:function(l){var m=parseInt(this[l?"$root":"$firstSub"].css("z-index"));if(!l&&isNaN(m)){m=parseInt(this.$root.css("z-index"))}return !isNaN(m)?m:1},getTouchPoint:function(l){return l.touches&&l.touches[0]||l.changedTouches&&l.changedTouches[0]||l},getViewport:function(l){var m=l?"Height":"Width",o=document.documentElement["client"+m],n=window["inner"+m];if(n){o=Math.min(o,n)}return o},getViewportHeight:function(){return this.getViewport(true)},getViewportWidth:function(){return this.getViewport()},getWidth:function(l){return this.getOffset(l)},handleEvents:function(){return !this.disabled&&this.isCSSOn()},handleItemEvents:function(l){return this.handleEvents()&&!this.isLinkInMegaMenu(l)},isCollapsible:function(){return this.$firstSub.css("position")=="static"},isCSSOn:function(){return this.$firstLink.css("display")=="block"},isFixed:function(){var l=this.$root.css("position")=="fixed";if(!l){this.$root.parentsUntil("body").each(function(){if(a(this).css("position")=="fixed"){l=true;return false}})}return l},isLinkInMegaMenu:function(l){return a(this.getClosestMenu(l[0])).hasClass("mega-menu")},isTouchMode:function(){return !f||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(p,l){var n=p.closest("ul"),q=n.dataSM("level");if(q>1&&(!this.activatedItems[q-2]||this.activatedItems[q-2][0]!=n.dataSM("parent-a")[0])){var m=this;a(n.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(n).each(function(){m.itemActivate(a(this).dataSM("parent-a"))})}if(!this.isCollapsible()||l){this.menuHideSubMenus(!this.activatedItems[q-1]||this.activatedItems[q-1][0]!=p[0]?q-1:q)}this.activatedItems[q-1]=p;if(this.$root.triggerHandler("activate.smapi",p[0])===false){return}var o=p.dataSM("sub");if(o&&(this.isTouchMode()||(!this.opts.showOnClick||this.clickActivated))){this.menuShow(o)}},itemBlur:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}this.$root.triggerHandler("blur.smapi",l[0])},itemClick:function(o){var n=a(o.currentTarget);if(!this.handleItemEvents(n)){return}if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==n.closest("ul")[0]){this.$touchScrollingSub=null;o.stopPropagation();return false}if(this.$root.triggerHandler("click.smapi",n[0])===false){return false}var p=a(o.target).is("span.sub-arrow"),m=n.dataSM("sub"),l=m?m.dataSM("level")==2:false;if(m&&!m.is(":visible")){if(this.opts.showOnClick&&l){this.clickActivated=true}this.itemActivate(n);if(m.is(":visible")){this.focusActivated=true;return false}}else{if(this.isCollapsible()&&p){this.itemActivate(n);this.menuHide(m);return false}}if(this.opts.showOnClick&&l||n.hasClass("disabled")||this.$root.triggerHandler("select.smapi",n[0])===false){return false}},itemDown:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}l.dataSM("mousedown",true)},itemEnter:function(n){var m=a(n.currentTarget);if(!this.handleItemEvents(m)){return}if(!this.isTouchMode()){if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}var l=this;this.showTimeout=setTimeout(function(){l.itemActivate(m)},this.opts.showOnClick&&m.closest("ul").dataSM("level")==1?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",m[0])},itemFocus:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}if(this.focusActivated&&(!this.isTouchMode()||!l.dataSM("mousedown"))&&(!this.activatedItems.length||this.activatedItems[this.activatedItems.length-1][0]!=l[0])){this.itemActivate(l,true)}this.$root.triggerHandler("focus.smapi",l[0])},itemLeave:function(m){var l=a(m.currentTarget);if(!this.handleItemEvents(l)){return}if(!this.isTouchMode()){l[0].blur();if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}}l.removeDataSM("mousedown");this.$root.triggerHandler("mouseleave.smapi",l[0])},menuHide:function(m){if(this.$root.triggerHandler("beforehide.smapi",m[0])===false){return}m.stop(true,true);if(m.css("display")!="none"){var l=function(){m.css("z-index","")};if(this.isCollapsible()){if(this.opts.collapsibleHideFunction){this.opts.collapsibleHideFunction.call(this,m,l)}else{m.hide(this.opts.collapsibleHideDuration,l)}}else{if(this.opts.hideFunction){this.opts.hideFunction.call(this,m,l)}else{m.hide(this.opts.hideDuration,l)}}if(m.dataSM("ie-shim")){m.dataSM("ie-shim").remove().css({"-webkit-transform":"",transform:""})}if(m.dataSM("scroll")){this.menuScrollStop(m);m.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).unbind(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()}m.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false");m.attr({"aria-expanded":"false","aria-hidden":"true"});var n=m.dataSM("level");this.activatedItems.splice(n-1,1);this.visibleSubMenus.splice(a.inArray(m,this.visibleSubMenus),1);this.$root.triggerHandler("hide.smapi",m[0])}},menuHideAll:function(){if(this.showTimeout){clearTimeout(this.showTimeout);this.showTimeout=0}var m=this.opts.isPopup?1:0;for(var l=this.visibleSubMenus.length-1;l>=m;l--){this.menuHide(this.visibleSubMenus[l])}if(this.opts.isPopup){this.$root.stop(true,true);if(this.$root.is(":visible")){if(this.opts.hideFunction){this.opts.hideFunction.call(this,this.$root)}else{this.$root.hide(this.opts.hideDuration)}if(this.$root.dataSM("ie-shim")){this.$root.dataSM("ie-shim").remove()}}}this.activatedItems=[];this.visibleSubMenus=[];this.clickActivated=false;this.focusActivated=false;this.zIndexInc=0;this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(n){for(var l=this.activatedItems.length-1;l>=n;l--){var m=this.activatedItems[l].dataSM("sub");if(m){this.menuHide(m)}}},menuIframeShim:function(l){if(e&&this.opts.overlapControlsInIE&&!l.dataSM("ie-shim")){l.dataSM("ie-shim",a("<iframe/>").attr({src:"javascript:0",tabindex:-9}).css({position:"absolute",top:"auto",left:"0",opacity:0,border:"0"}))}},menuInit:function(l){if(!l.dataSM("in-mega")){if(l.hasClass("mega-menu")){l.find("ul").dataSM("in-mega",true)}var q=2,m=l[0];while((m=m.parentNode.parentNode)!=this.$root[0]){q++}var n=l.prevAll("a").eq(-1);if(!n.length){n=l.prevAll().find("a").eq(-1)}n.addClass("has-submenu").dataSM("sub",l);l.dataSM("parent-a",n).dataSM("level",q).parent().dataSM("sub",l);var o=n.attr("id")||this.accessIdPrefix+(++this.idInc),p=l.attr("id")||this.accessIdPrefix+(++this.idInc);n.attr({id:o,"aria-haspopup":"true","aria-controls":p,"aria-expanded":"false"});l.attr({id:p,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"});if(this.opts.subIndicators){n[this.opts.subIndicatorsPos](this.$subArrow.clone())}}},menuPosition:function(K){var r=K.dataSM("parent-a"),D=r.closest("li"),E=D.parent(),l=K.dataSM("level"),t=this.getWidth(K),J=this.getHeight(K),u=r.offset(),o=u.left,m=u.top,q=this.getWidth(r),F=this.getHeight(r),H=a(window),v=H.scrollLeft(),s=H.scrollTop(),z=this.getViewportWidth(),L=this.getViewportHeight(),w=E.parent().is("[data-sm-horizontal-sub]")||l==2&&!E.hasClass("sm-vertical"),B=this.opts.rightToLeftSubMenus&&!D.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&D.is("[data-sm-reverse]"),p=l==2?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,n=l==2?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY,C,A;if(w){C=B?q-t-p:p;A=this.opts.bottomToTopSubMenus?-J-n:F+n}else{C=B?p-t:q-p;A=this.opts.bottomToTopSubMenus?F-n-J:n}if(this.opts.keepInViewport){var N=o+C,M=m+A;if(B&&N<v){C=w?v-N+C:q-p}else{if(!B&&N+t>v+z){C=w?v+z-t-N+C:p-t}}if(!w){if(J<L&&M+J>s+L){A+=s+L-J-M}else{if(J>=L||M<s){A+=s-M}}}if(w&&(M+J>s+L+0.49||M<s)||!w&&J>L+0.49){var G=this;if(!K.dataSM("scroll-arrows")){K.dataSM("scroll-arrows",a([a('<span class="scroll-up"><span class="scroll-up-arrow"></span></span>')[0],a('<span class="scroll-down"><span class="scroll-down-arrow"></span></span>')[0]]).bind({mouseenter:function(){K.dataSM("scroll").up=a(this).hasClass("scroll-up");G.menuScroll(K)},mouseleave:function(x){G.menuScrollStop(K);G.menuScrollOut(K,x)},"mousewheel DOMMouseScroll":function(x){x.preventDefault()}}).insertAfter(K))}var I=".smartmenus_scroll";K.dataSM("scroll",{y:this.cssTransforms3d?0:A-F,step:1,itemH:F,subH:J,arrowDownH:this.getHeight(K.dataSM("scroll-arrows").eq(1))}).bind(i([["mouseover",function(x){G.menuScrollOver(K,x)}],["mouseout",function(x){G.menuScrollOut(K,x)}],["mousewheel DOMMouseScroll",function(x){G.menuScrollMousewheel(K,x)}]],I)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:C+(parseInt(K.css("border-left-width"))||0),width:t-(parseInt(K.css("border-left-width"))||0)-(parseInt(K.css("border-right-width"))||0),zIndex:K.css("z-index")}).eq(w&&this.opts.bottomToTopSubMenus?0:1).show();if(this.isFixed()){K.css({"touch-action":"none","-ms-touch-action":"none"}).bind(i([[d?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp",function(x){G.menuScrollTouch(K,x)}]],I))}}}K.css({top:"auto",left:"0",marginLeft:C,marginTop:A-F});this.menuIframeShim(K);if(K.dataSM("ie-shim")){K.dataSM("ie-shim").css({zIndex:K.css("z-index"),width:t,height:J,marginLeft:C,marginTop:A-F})}},menuScroll:function(r,m,n){var p=r.dataSM("scroll"),q=r.dataSM("scroll-arrows"),o=p.up?p.upEnd:p.downEnd,s;if(!m&&p.momentum){p.momentum*=0.92;s=p.momentum;if(s<0.5){this.menuScrollStop(r);return}}else{s=n||(m||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(p.step))}var l=r.dataSM("level");if(this.activatedItems[l-1]&&this.activatedItems[l-1].dataSM("sub")&&this.activatedItems[l-1].dataSM("sub").is(":visible")){this.menuHideSubMenus(l-1)}p.y=p.up&&o<=p.y||!p.up&&o>=p.y?p.y:(Math.abs(o-p.y)>s?p.y+(p.up?s:-s):o);r.add(r.dataSM("ie-shim")).css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+p.y+"px, 0)",transform:"translate3d(0, "+p.y+"px, 0)"}:{marginTop:p.y});if(f&&(p.up&&p.y>p.downEnd||!p.up&&p.y<p.upEnd)){q.eq(p.up?1:0).show()}if(p.y==o){if(f){q.eq(p.up?0:1).hide()}this.menuScrollStop(r)}else{if(!m){if(this.opts.scrollAccelerate&&p.step<this.opts.scrollStep){p.step+=0.2}var t=this;this.scrollTimeout=g(function(){t.menuScroll(r)})}}},menuScrollMousewheel:function(m,n){if(this.getClosestMenu(n.target)==m[0]){n=n.originalEvent;var l=(n.wheelDelta||-n.detail)>0;if(m.dataSM("scroll-arrows").eq(l?0:1).is(":visible")){m.dataSM("scroll").up=l;this.menuScroll(m,true)}}n.preventDefault()},menuScrollOut:function(l,m){if(f){if(!/^scroll-(up|down)/.test((m.relatedTarget||"").className)&&(l[0]!=m.relatedTarget&&!a.contains(l[0],m.relatedTarget)||this.getClosestMenu(m.relatedTarget)!=l[0])){l.dataSM("scroll-arrows").css("visibility","hidden")}}},menuScrollOver:function(n,o){if(f){if(!/^scroll-(up|down)/.test(o.target.className)&&this.getClosestMenu(o.target)==n[0]){this.menuScrollRefreshData(n);var m=n.dataSM("scroll"),l=a(window).scrollTop()-n.dataSM("parent-a").offset().top-m.itemH;n.dataSM("scroll-arrows").eq(0).css("margin-top",l).end().eq(1).css("margin-top",l+this.getViewportHeight()-m.arrowDownH).end().css("visibility","visible")}}},menuScrollRefreshData:function(n){var m=n.dataSM("scroll"),l=a(window).scrollTop()-n.dataSM("parent-a").offset().top-m.itemH;if(this.cssTransforms3d){l=-(parseFloat(n.css("margin-top"))-l)}a.extend(m,{upEnd:l,downEnd:l+this.getViewportHeight()-m.subH})},menuScrollStop:function(l){if(this.scrollTimeout){c(this.scrollTimeout);this.scrollTimeout=0;l.dataSM("scroll").step=1;return true}},menuScrollTouch:function(p,q){q=q.originalEvent;if(j(q)){var m=this.getTouchPoint(q);if(this.getClosestMenu(m.target)==p[0]){var o=p.dataSM("scroll");if(/(start|down)$/i.test(q.type)){if(this.menuScrollStop(p)){q.preventDefault();this.$touchScrollingSub=p}else{this.$touchScrollingSub=null}this.menuScrollRefreshData(p);a.extend(o,{touchStartY:m.pageY,touchStartTime:q.timeStamp})}else{if(/move$/i.test(q.type)){var n=o.touchY!==undefined?o.touchY:o.touchStartY;if(n!==undefined&&n!=m.pageY){this.$touchScrollingSub=p;var l=n<m.pageY;if(o.up!==undefined&&o.up!=l){a.extend(o,{touchStartY:m.pageY,touchStartTime:q.timeStamp})}a.extend(o,{up:l,touchY:m.pageY});this.menuScroll(p,true,Math.abs(m.pageY-n))}q.preventDefault()}else{if(o.touchY!==undefined){if(o.momentum=Math.pow(Math.abs(m.pageY-o.touchStartY)/(q.timeStamp-o.touchStartTime),2)*15){this.menuScrollStop(p);this.menuScroll(p);q.preventDefault()}delete o.touchY}}}}}},menuShow:function(n){if(!n.dataSM("beforefirstshowfired")){n.dataSM("beforefirstshowfired",true);if(this.$root.triggerHandler("beforefirstshow.smapi",n[0])===false){return}}if(this.$root.triggerHandler("beforeshow.smapi",n[0])===false){return}n.dataSM("shown-before",true).stop(true,true);if(!n.is(":visible")){var m=n.dataSM("parent-a");if(this.opts.keepHighlighted||this.isCollapsible()){m.addClass("highlighted")}if(this.isCollapsible()){n.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""})}else{n.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1);if(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth){n.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap");if(this.opts.subMenusMinWidth){n.css("min-width",this.opts.subMenusMinWidth)}if(this.opts.subMenusMaxWidth){var o=this.getWidth(n);n.css("max-width",this.opts.subMenusMaxWidth);if(o>this.getWidth(n)){n.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}}}this.menuPosition(n);if(n.dataSM("ie-shim")){n.dataSM("ie-shim").insertBefore(n)}}var l=function(){n.css("overflow","")};if(this.isCollapsible()){if(this.opts.collapsibleShowFunction){this.opts.collapsibleShowFunction.call(this,n,l)}else{n.show(this.opts.collapsibleShowDuration,l)}}else{if(this.opts.showFunction){this.opts.showFunction.call(this,n,l)}else{n.show(this.opts.showDuration,l)}}m.attr("aria-expanded","true");n.attr({"aria-expanded":"true","aria-hidden":"false"});this.visibleSubMenus.push(n);this.$root.triggerHandler("show.smapi",n[0])}},popupHide:function(l){if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}var m=this;this.hideTimeout=setTimeout(function(){m.menuHideAll()},l?1:this.opts.hideTimeout)},popupShow:function(o,n){if(!this.opts.isPopup){alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.');return}if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}this.$root.dataSM("shown-before",true).stop(true,true);if(!this.$root.is(":visible")){this.$root.css({left:o,top:n});this.menuIframeShim(this.$root);if(this.$root.dataSM("ie-shim")){this.$root.dataSM("ie-shim").css({zIndex:this.$root.css("z-index"),width:this.getWidth(this.$root),height:this.getHeight(this.$root),left:o,top:n}).insertBefore(this.$root)}var m=this,l=function(){m.$root.css("overflow","")};if(this.opts.showFunction){this.opts.showFunction.call(this,this.$root,l)}else{this.$root.show(this.opts.showDuration,l)}this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(true);this.init(true)},rootKeyDown:function(o){if(!this.handleEvents()){return}switch(o.keyCode){case 27:var m=this.activatedItems[0];if(m){this.menuHideAll();m[0].focus();var n=m.dataSM("sub");if(n){this.menuHide(n)}}break;case 32:var l=a(o.target);if(l.is("a")&&this.handleItemEvents(l)){var n=l.dataSM("sub");if(n&&!n.is(":visible")){this.itemClick({currentTarget:o.target});o.preventDefault()}}break}},rootOut:function(m){if(!this.handleEvents()||this.isTouchMode()||m.target==this.$root[0]){return}if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}if(!this.opts.showOnClick||!this.opts.hideOnClick){var l=this;this.hideTimeout=setTimeout(function(){l.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(l){if(!this.handleEvents()||this.isTouchMode()||l.target==this.$root[0]){return}if(this.hideTimeout){clearTimeout(this.hideTimeout);this.hideTimeout=0}},winResize:function(m){if(!this.handleEvents()){if(this.$disableOverlay){var n=this.$root.offset();this.$disableOverlay.css({top:n.top,left:n.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}return}if(!("onorientationchange" in window)||m.type=="orientationchange"){var l=this.isCollapsible();if(!(this.wasCollapsible&&l)){if(this.activatedItems.length){this.activatedItems[this.activatedItems.length-1][0].blur()}this.menuHideAll()}this.wasCollapsible=l}}}});a.fn.dataSM=function(l,m){if(m){return this.data(l+"_smartmenus",m)}return this.data(l+"_smartmenus")};a.fn.removeDataSM=function(l){return this.removeData(l+"_smartmenus")};a.fn.smartmenus=function(m){if(typeof m=="string"){var l=arguments,o=m;Array.prototype.shift.call(l);return this.each(function(){var p=a(this).data("smartmenus");if(p&&p[o]){p[o].apply(p,l)}})}var n=a.extend({},a.fn.smartmenus.defaults,m);return this.each(function(){new a.SmartMenus(this,n)})};a.fn.smartmenus.defaults={isPopup:false,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:true,subIndicatorsPos:"prepend",subIndicatorsText:"+",scrollStep:30,scrollAccelerate:true,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(m,l){m.fadeOut(200,l)},collapsibleShowDuration:0,collapsibleShowFunction:function(m,l){m.slideDown(200,l)},collapsibleHideDuration:0,collapsibleHideFunction:function(m,l){m.slideUp(200,l)},showOnClick:false,hideOnClick:true,noMouseOver:false,keepInViewport:true,keepHighlighted:true,markCurrentItem:false,markCurrentTree:true,rightToLeftSubMenus:false,bottomToTopSubMenus:false,overlapControlsInIE:true};return a}));
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/list_8h.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,1556 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/list.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a> &#124;
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">list.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Doubly linked list implementation.  
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="allocator_8h_source.html">allocator.h</a>&quot;</code><br />
+</div>
+<p><a href="list_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxList.html">UcxList</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">UCX list structure.  <a href="structUcxList.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a4b143b6526a410aa4d22cb3bb9365d70"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#a4b143b6526a410aa4d22cb3bb9365d70">UCX_FOREACH</a>(elem,  list)&#160;&#160;&#160;for (<a class="el" href="structUcxList.html">UcxList</a>* elem = (<a class="el" href="structUcxList.html">UcxList</a>*) list ; elem != NULL ; elem = elem-&gt;next)</td></tr>
+<tr class="memdesc:a4b143b6526a410aa4d22cb3bb9365d70"><td class="mdescLeft">&#160;</td><td class="mdescRight">Loop statement for UCX lists.  <a href="#a4b143b6526a410aa4d22cb3bb9365d70">More...</a><br /></td></tr>
+<tr class="separator:a4b143b6526a410aa4d22cb3bb9365d70"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:aa6f89f91c1081c9a7c6866c298f497a2"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structUcxList.html">UcxList</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#aa6f89f91c1081c9a7c6866c298f497a2">UcxList</a></td></tr>
+<tr class="memdesc:aa6f89f91c1081c9a7c6866c298f497a2"><td class="mdescLeft">&#160;</td><td class="mdescRight">UCX list type.  <a href="#aa6f89f91c1081c9a7c6866c298f497a2">More...</a><br /></td></tr>
+<tr class="separator:aa6f89f91c1081c9a7c6866c298f497a2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae7054a41c289b24e6caf5cb07ac850ed"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#ae7054a41c289b24e6caf5cb07ac850ed">ucx_list_clone</a> (const <a class="el" href="structUcxList.html">UcxList</a> *list, <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpyfnc, void *data)</td></tr>
+<tr class="memdesc:ae7054a41c289b24e6caf5cb07ac850ed"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates an element-wise copy of a list.  <a href="#ae7054a41c289b24e6caf5cb07ac850ed">More...</a><br /></td></tr>
+<tr class="separator:ae7054a41c289b24e6caf5cb07ac850ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a08ca1ba0d2e82258b0408714c1f4c425"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#a08ca1ba0d2e82258b0408714c1f4c425">ucx_list_clone_a</a> (<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *allocator, const <a class="el" href="structUcxList.html">UcxList</a> *list, <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpyfnc, void *data)</td></tr>
+<tr class="memdesc:a08ca1ba0d2e82258b0408714c1f4c425"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates an element-wise copy of a list using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>.  <a href="#a08ca1ba0d2e82258b0408714c1f4c425">More...</a><br /></td></tr>
+<tr class="separator:a08ca1ba0d2e82258b0408714c1f4c425"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adc435447cecf885bc63d232191085bbe"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#adc435447cecf885bc63d232191085bbe">ucx_list_equals</a> (const <a class="el" href="structUcxList.html">UcxList</a> *list1, const <a class="el" href="structUcxList.html">UcxList</a> *list2, <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, void *data)</td></tr>
+<tr class="memdesc:adc435447cecf885bc63d232191085bbe"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two UCX lists element-wise by using a compare function.  <a href="#adc435447cecf885bc63d232191085bbe">More...</a><br /></td></tr>
+<tr class="separator:adc435447cecf885bc63d232191085bbe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a0fa2c5b1e478a96da19b0c3f013668"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#a1a0fa2c5b1e478a96da19b0c3f013668">ucx_list_free</a> (<a class="el" href="structUcxList.html">UcxList</a> *list)</td></tr>
+<tr class="memdesc:a1a0fa2c5b1e478a96da19b0c3f013668"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys the entire list.  <a href="#a1a0fa2c5b1e478a96da19b0c3f013668">More...</a><br /></td></tr>
+<tr class="separator:a1a0fa2c5b1e478a96da19b0c3f013668"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a944e11f76c38767cd1100d72a4e3b25b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#a944e11f76c38767cd1100d72a4e3b25b">ucx_list_free_a</a> (<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *allocator, <a class="el" href="structUcxList.html">UcxList</a> *list)</td></tr>
+<tr class="memdesc:a944e11f76c38767cd1100d72a4e3b25b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys the entire list using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>.  <a href="#a944e11f76c38767cd1100d72a4e3b25b">More...</a><br /></td></tr>
+<tr class="separator:a944e11f76c38767cd1100d72a4e3b25b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ba6c96642f72ea046cc22627c72979c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#a4ba6c96642f72ea046cc22627c72979c">ucx_list_free_content</a> (<a class="el" href="structUcxList.html">UcxList</a> *list, <a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a> destr)</td></tr>
+<tr class="memdesc:a4ba6c96642f72ea046cc22627c72979c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys the contents of the specified list by calling the specified destructor on each of them.  <a href="#a4ba6c96642f72ea046cc22627c72979c">More...</a><br /></td></tr>
+<tr class="separator:a4ba6c96642f72ea046cc22627c72979c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a00c122c8a26d35b60676939df4161621"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#a00c122c8a26d35b60676939df4161621">ucx_list_append</a> (<a class="el" href="structUcxList.html">UcxList</a> *list, void *data)</td></tr>
+<tr class="memdesc:a00c122c8a26d35b60676939df4161621"><td class="mdescLeft">&#160;</td><td class="mdescRight">Inserts an element at the end of the list.  <a href="#a00c122c8a26d35b60676939df4161621">More...</a><br /></td></tr>
+<tr class="separator:a00c122c8a26d35b60676939df4161621"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adf3b3e2e0ff977d8928671d6bd82fc60"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#adf3b3e2e0ff977d8928671d6bd82fc60">ucx_list_append_a</a> (<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *allocator, <a class="el" href="structUcxList.html">UcxList</a> *list, void *data)</td></tr>
+<tr class="memdesc:adf3b3e2e0ff977d8928671d6bd82fc60"><td class="mdescLeft">&#160;</td><td class="mdescRight">Inserts an element at the end of the list using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>.  <a href="#adf3b3e2e0ff977d8928671d6bd82fc60">More...</a><br /></td></tr>
+<tr class="separator:adf3b3e2e0ff977d8928671d6bd82fc60"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8fcb68e4556395b15180eec2d0b77aa4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#a8fcb68e4556395b15180eec2d0b77aa4">ucx_list_prepend</a> (<a class="el" href="structUcxList.html">UcxList</a> *list, void *data)</td></tr>
+<tr class="memdesc:a8fcb68e4556395b15180eec2d0b77aa4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Inserts an element at the beginning of the list.  <a href="#a8fcb68e4556395b15180eec2d0b77aa4">More...</a><br /></td></tr>
+<tr class="separator:a8fcb68e4556395b15180eec2d0b77aa4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a54654e6dc60e1c3de9e886c150e404ec"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#a54654e6dc60e1c3de9e886c150e404ec">ucx_list_prepend_a</a> (<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *allocator, <a class="el" href="structUcxList.html">UcxList</a> *list, void *data)</td></tr>
+<tr class="memdesc:a54654e6dc60e1c3de9e886c150e404ec"><td class="mdescLeft">&#160;</td><td class="mdescRight">Inserts an element at the beginning of the list using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>.  <a href="#a54654e6dc60e1c3de9e886c150e404ec">More...</a><br /></td></tr>
+<tr class="separator:a54654e6dc60e1c3de9e886c150e404ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a77163a0cc82fae52bec26c8c0c3674d9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#a77163a0cc82fae52bec26c8c0c3674d9">ucx_list_concat</a> (<a class="el" href="structUcxList.html">UcxList</a> *list1, <a class="el" href="structUcxList.html">UcxList</a> *list2)</td></tr>
+<tr class="memdesc:a77163a0cc82fae52bec26c8c0c3674d9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Concatenates two lists.  <a href="#a77163a0cc82fae52bec26c8c0c3674d9">More...</a><br /></td></tr>
+<tr class="separator:a77163a0cc82fae52bec26c8c0c3674d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6aa0e34ebc5f0dca6f52d0f7626b4bd5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#a6aa0e34ebc5f0dca6f52d0f7626b4bd5">ucx_list_first</a> (const <a class="el" href="structUcxList.html">UcxList</a> *elem)</td></tr>
+<tr class="memdesc:a6aa0e34ebc5f0dca6f52d0f7626b4bd5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the first element of a list.  <a href="#a6aa0e34ebc5f0dca6f52d0f7626b4bd5">More...</a><br /></td></tr>
+<tr class="separator:a6aa0e34ebc5f0dca6f52d0f7626b4bd5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:add5ec40c5006e29c629d23c2eb5a6553"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#add5ec40c5006e29c629d23c2eb5a6553">ucx_list_last</a> (const <a class="el" href="structUcxList.html">UcxList</a> *elem)</td></tr>
+<tr class="memdesc:add5ec40c5006e29c629d23c2eb5a6553"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the last element of a list.  <a href="#add5ec40c5006e29c629d23c2eb5a6553">More...</a><br /></td></tr>
+<tr class="separator:add5ec40c5006e29c629d23c2eb5a6553"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2509ffe19bce6a8708c77f89480c75fb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#a2509ffe19bce6a8708c77f89480c75fb">ucx_list_get</a> (const <a class="el" href="structUcxList.html">UcxList</a> *list, size_t index)</td></tr>
+<tr class="memdesc:a2509ffe19bce6a8708c77f89480c75fb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the list element at the specified index.  <a href="#a2509ffe19bce6a8708c77f89480c75fb">More...</a><br /></td></tr>
+<tr class="separator:a2509ffe19bce6a8708c77f89480c75fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae2ff2974812ca185870f80bc4ed9337e"><td class="memItemLeft" align="right" valign="top">ssize_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#ae2ff2974812ca185870f80bc4ed9337e">ucx_list_indexof</a> (const <a class="el" href="structUcxList.html">UcxList</a> *list, const <a class="el" href="structUcxList.html">UcxList</a> *elem)</td></tr>
+<tr class="memdesc:ae2ff2974812ca185870f80bc4ed9337e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the index of an element.  <a href="#ae2ff2974812ca185870f80bc4ed9337e">More...</a><br /></td></tr>
+<tr class="separator:ae2ff2974812ca185870f80bc4ed9337e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae88001cc8ae40b946560f31434abed8f"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#ae88001cc8ae40b946560f31434abed8f">ucx_list_size</a> (const <a class="el" href="structUcxList.html">UcxList</a> *list)</td></tr>
+<tr class="memdesc:ae88001cc8ae40b946560f31434abed8f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the element count of the list.  <a href="#ae88001cc8ae40b946560f31434abed8f">More...</a><br /></td></tr>
+<tr class="separator:ae88001cc8ae40b946560f31434abed8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9b3b6842d3be572e06a7f519e198cb83"><td class="memItemLeft" align="right" valign="top">ssize_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#a9b3b6842d3be572e06a7f519e198cb83">ucx_list_find</a> (const <a class="el" href="structUcxList.html">UcxList</a> *list, void *elem, <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, void *data)</td></tr>
+<tr class="memdesc:a9b3b6842d3be572e06a7f519e198cb83"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the index of an element containing the specified data.  <a href="#a9b3b6842d3be572e06a7f519e198cb83">More...</a><br /></td></tr>
+<tr class="separator:a9b3b6842d3be572e06a7f519e198cb83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8b0fa051fcfe12e1a82cca1087973852"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#a8b0fa051fcfe12e1a82cca1087973852">ucx_list_contains</a> (const <a class="el" href="structUcxList.html">UcxList</a> *list, void *elem, <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, void *data)</td></tr>
+<tr class="memdesc:a8b0fa051fcfe12e1a82cca1087973852"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks, if a list contains a specific element.  <a href="#a8b0fa051fcfe12e1a82cca1087973852">More...</a><br /></td></tr>
+<tr class="separator:a8b0fa051fcfe12e1a82cca1087973852"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac74962d9bd7cfc9d3e2e09651469377b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#ac74962d9bd7cfc9d3e2e09651469377b">ucx_list_sort</a> (<a class="el" href="structUcxList.html">UcxList</a> *list, <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, void *data)</td></tr>
+<tr class="memdesc:ac74962d9bd7cfc9d3e2e09651469377b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sorts a <a class="el" href="structUcxList.html" title="UCX list structure. ">UcxList</a> with natural merge sort.  <a href="#ac74962d9bd7cfc9d3e2e09651469377b">More...</a><br /></td></tr>
+<tr class="separator:ac74962d9bd7cfc9d3e2e09651469377b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a410cb3e8260037ba56c72d14b899b468"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#a410cb3e8260037ba56c72d14b899b468">ucx_list_remove</a> (<a class="el" href="structUcxList.html">UcxList</a> *list, <a class="el" href="structUcxList.html">UcxList</a> *element)</td></tr>
+<tr class="memdesc:a410cb3e8260037ba56c72d14b899b468"><td class="mdescLeft">&#160;</td><td class="mdescRight">Removes an element from the list.  <a href="#a410cb3e8260037ba56c72d14b899b468">More...</a><br /></td></tr>
+<tr class="separator:a410cb3e8260037ba56c72d14b899b468"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aca687b7c4e7170175f447e549125aa52"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#aca687b7c4e7170175f447e549125aa52">ucx_list_remove_a</a> (<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *allocator, <a class="el" href="structUcxList.html">UcxList</a> *list, <a class="el" href="structUcxList.html">UcxList</a> *element)</td></tr>
+<tr class="memdesc:aca687b7c4e7170175f447e549125aa52"><td class="mdescLeft">&#160;</td><td class="mdescRight">Removes an element from the list using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>.  <a href="#aca687b7c4e7170175f447e549125aa52">More...</a><br /></td></tr>
+<tr class="separator:aca687b7c4e7170175f447e549125aa52"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a94ecdb0cea1633ad7074f027fa8485fa"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#a94ecdb0cea1633ad7074f027fa8485fa">ucx_list_union</a> (const <a class="el" href="structUcxList.html">UcxList</a> *left, const <a class="el" href="structUcxList.html">UcxList</a> *right, <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, void *cmpdata, <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, void *cpdata)</td></tr>
+<tr class="memdesc:a94ecdb0cea1633ad7074f027fa8485fa"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the union of two lists.  <a href="#a94ecdb0cea1633ad7074f027fa8485fa">More...</a><br /></td></tr>
+<tr class="separator:a94ecdb0cea1633ad7074f027fa8485fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a65b4355536f4ebc4130211b46469f4c1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#a65b4355536f4ebc4130211b46469f4c1">ucx_list_union_a</a> (<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *allocator, const <a class="el" href="structUcxList.html">UcxList</a> *left, const <a class="el" href="structUcxList.html">UcxList</a> *right, <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, void *cmpdata, <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, void *cpdata)</td></tr>
+<tr class="memdesc:a65b4355536f4ebc4130211b46469f4c1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the union of two lists.  <a href="#a65b4355536f4ebc4130211b46469f4c1">More...</a><br /></td></tr>
+<tr class="separator:a65b4355536f4ebc4130211b46469f4c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a259f9b754978aeca23dfabba16e20f39"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#a259f9b754978aeca23dfabba16e20f39">ucx_list_intersection</a> (const <a class="el" href="structUcxList.html">UcxList</a> *left, const <a class="el" href="structUcxList.html">UcxList</a> *right, <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, void *cmpdata, <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, void *cpdata)</td></tr>
+<tr class="memdesc:a259f9b754978aeca23dfabba16e20f39"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the intersection of two lists.  <a href="#a259f9b754978aeca23dfabba16e20f39">More...</a><br /></td></tr>
+<tr class="separator:a259f9b754978aeca23dfabba16e20f39"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1d0b00514dbb81ba6270b58da0c5b9a8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#a1d0b00514dbb81ba6270b58da0c5b9a8">ucx_list_intersection_a</a> (<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *allocator, const <a class="el" href="structUcxList.html">UcxList</a> *left, const <a class="el" href="structUcxList.html">UcxList</a> *right, <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, void *cmpdata, <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, void *cpdata)</td></tr>
+<tr class="memdesc:a1d0b00514dbb81ba6270b58da0c5b9a8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the intersection of two lists.  <a href="#a1d0b00514dbb81ba6270b58da0c5b9a8">More...</a><br /></td></tr>
+<tr class="separator:a1d0b00514dbb81ba6270b58da0c5b9a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6c5db5d1d11ad28b6fe1a80ee1c1e449"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#a6c5db5d1d11ad28b6fe1a80ee1c1e449">ucx_list_difference</a> (const <a class="el" href="structUcxList.html">UcxList</a> *left, const <a class="el" href="structUcxList.html">UcxList</a> *right, <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, void *cmpdata, <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, void *cpdata)</td></tr>
+<tr class="memdesc:a6c5db5d1d11ad28b6fe1a80ee1c1e449"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the difference of two lists.  <a href="#a6c5db5d1d11ad28b6fe1a80ee1c1e449">More...</a><br /></td></tr>
+<tr class="separator:a6c5db5d1d11ad28b6fe1a80ee1c1e449"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4a2a2fc5cc41073c516db6235bbc51d5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="list_8h.html#a4a2a2fc5cc41073c516db6235bbc51d5">ucx_list_difference_a</a> (<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *allocator, const <a class="el" href="structUcxList.html">UcxList</a> *left, const <a class="el" href="structUcxList.html">UcxList</a> *right, <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, void *cmpdata, <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, void *cpdata)</td></tr>
+<tr class="memdesc:a4a2a2fc5cc41073c516db6235bbc51d5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the difference of two lists.  <a href="#a4a2a2fc5cc41073c516db6235bbc51d5">More...</a><br /></td></tr>
+<tr class="separator:a4a2a2fc5cc41073c516db6235bbc51d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Doubly linked list implementation. </p>
+<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
+<dd>
+Olaf Wintermann </dd></dl>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a4b143b6526a410aa4d22cb3bb9365d70"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4b143b6526a410aa4d22cb3bb9365d70">&#9670;&nbsp;</a></span>UCX_FOREACH</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UCX_FOREACH</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">elem, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">list&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;for (<a class="el" href="structUcxList.html">UcxList</a>* elem = (<a class="el" href="structUcxList.html">UcxList</a>*) list ; elem != NULL ; elem = elem-&gt;next)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Loop statement for UCX lists. </p>
+<p>The first argument is the name of the iteration variable. The scope of this variable is limited to the <code>UCX_FOREACH</code> statement.</p>
+<p>The second argument is a pointer to the list. In most cases this will be the pointer to the first element of the list, but it may also be an arbitrary element of the list. The iteration will then start with that element.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">list</td><td>The first element of the list </td></tr>
+    <tr><td class="paramname">elem</td><td>The variable name of the element </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="aa6f89f91c1081c9a7c6866c298f497a2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa6f89f91c1081c9a7c6866c298f497a2">&#9670;&nbsp;</a></span>UcxList</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structUcxList.html">UcxList</a> <a class="el" href="structUcxList.html">UcxList</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>UCX list type. </p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="structUcxList.html" title="UCX list structure. ">UcxList</a> </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a00c122c8a26d35b60676939df4161621"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a00c122c8a26d35b60676939df4161621">&#9670;&nbsp;</a></span>ucx_list_append()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_append </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>list</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Inserts an element at the end of the list. </p>
+<p>This is generally an O(n) operation, as the end of the list is retrieved with <a class="el" href="list_8h.html#add5ec40c5006e29c629d23c2eb5a6553" title="Returns the last element of a list. ">ucx_list_last()</a>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">list</td><td>the list where to append the data, or <code>NULL</code> to create a new list </td></tr>
+    <tr><td class="paramname">data</td><td>the data to insert </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><code>list</code>, if it is not <code>NULL</code> or a pointer to the newly created list otherwise </dd></dl>
+
+</div>
+</div>
+<a id="adf3b3e2e0ff977d8928671d6bd82fc60"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adf3b3e2e0ff977d8928671d6bd82fc60">&#9670;&nbsp;</a></span>ucx_list_append_a()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_append_a </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>list</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Inserts an element at the end of the list using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>. </p>
+<p>See <a class="el" href="list_8h.html#a00c122c8a26d35b60676939df4161621" title="Inserts an element at the end of the list. ">ucx_list_append()</a> for details.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
+    <tr><td class="paramname">list</td><td>the list where to append the data, or <code>NULL</code> to create a new list </td></tr>
+    <tr><td class="paramname">data</td><td>the data to insert </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><code>list</code>, if it is not <code>NULL</code> or a pointer to the newly created list otherwise </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="list_8h.html#a00c122c8a26d35b60676939df4161621" title="Inserts an element at the end of the list. ">ucx_list_append()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ae7054a41c289b24e6caf5cb07ac850ed"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae7054a41c289b24e6caf5cb07ac850ed">&#9670;&nbsp;</a></span>ucx_list_clone()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_clone </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>list</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
+          <td class="paramname"><em>cpyfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Creates an element-wise copy of a list. </p>
+<p>This function clones the specified list by creating new list elements and copying the data with the specified <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967" title="Function pointer to a copy function. ">copy_func()</a>. If no <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967" title="Function pointer to a copy function. ">copy_func()</a> is specified, a shallow copy is created and the new list will reference the same data as the source list.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">list</td><td>the list to copy </td></tr>
+    <tr><td class="paramname">cpyfnc</td><td>a pointer to the function that shall copy an element (may be <code>NULL</code>) </td></tr>
+    <tr><td class="paramname">data</td><td>additional data for the <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967" title="Function pointer to a copy function. ">copy_func()</a> </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the copy </dd></dl>
+
+</div>
+</div>
+<a id="a08ca1ba0d2e82258b0408714c1f4c425"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a08ca1ba0d2e82258b0408714c1f4c425">&#9670;&nbsp;</a></span>ucx_list_clone_a()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_clone_a </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>list</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
+          <td class="paramname"><em>cpyfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Creates an element-wise copy of a list using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>. </p>
+<p>See <a class="el" href="list_8h.html#ae7054a41c289b24e6caf5cb07ac850ed" title="Creates an element-wise copy of a list. ">ucx_list_clone()</a> for details.</p>
+<p>You might want to pass the allocator via the <code>data</code> parameter, to access it within the copy function for making deep copies.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
+    <tr><td class="paramname">list</td><td>the list to copy </td></tr>
+    <tr><td class="paramname">cpyfnc</td><td>a pointer to the function that shall copy an element (may be <code>NULL</code>) </td></tr>
+    <tr><td class="paramname">data</td><td>additional data for the <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967" title="Function pointer to a copy function. ">copy_func()</a> </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the copy </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="list_8h.html#ae7054a41c289b24e6caf5cb07ac850ed" title="Creates an element-wise copy of a list. ">ucx_list_clone()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a77163a0cc82fae52bec26c8c0c3674d9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a77163a0cc82fae52bec26c8c0c3674d9">&#9670;&nbsp;</a></span>ucx_list_concat()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_concat </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>list1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>list2</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Concatenates two lists. </p>
+<p>Either of the two arguments may be <code>NULL</code>.</p>
+<p>This function modifies the references to the next/previous element of the last/first element of <code>list1</code>/<code> list2</code>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">list1</td><td>first list </td></tr>
+    <tr><td class="paramname">list2</td><td>second list </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>if <code>list1</code> is <code>NULL</code>, <code>list2</code> is returned, otherwise <code>list1</code> is returned </dd></dl>
+
+</div>
+</div>
+<a id="a8b0fa051fcfe12e1a82cca1087973852"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8b0fa051fcfe12e1a82cca1087973852">&#9670;&nbsp;</a></span>ucx_list_contains()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_list_contains </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>list</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>elem</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
+          <td class="paramname"><em>cmpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Checks, if a list contains a specific element. </p>
+<p>An element is found, if <a class="el" href="list_8h.html#a9b3b6842d3be572e06a7f519e198cb83" title="Returns the index of an element containing the specified data. ">ucx_list_find()</a> returns a value greater than -1.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">list</td><td>the list where to search for the data </td></tr>
+    <tr><td class="paramname">elem</td><td>the element data </td></tr>
+    <tr><td class="paramname">cmpfnc</td><td>the compare function </td></tr>
+    <tr><td class="paramname">data</td><td>additional data for the compare function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1, if and only if the list contains the specified element data </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="list_8h.html#a9b3b6842d3be572e06a7f519e198cb83" title="Returns the index of an element containing the specified data. ">ucx_list_find()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a6c5db5d1d11ad28b6fe1a80ee1c1e449"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6c5db5d1d11ad28b6fe1a80ee1c1e449">&#9670;&nbsp;</a></span>ucx_list_difference()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_difference </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>left</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>right</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
+          <td class="paramname"><em>cmpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>cmpdata</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
+          <td class="paramname"><em>cpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>cpdata</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns the difference of two lists. </p>
+<p>The difference contains all elements of the left list (including duplicates) that are not equal to any element of the right list.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">left</td><td>the left source list </td></tr>
+    <tr><td class="paramname">right</td><td>the right source list </td></tr>
+    <tr><td class="paramname">cmpfnc</td><td>a function to compare elements </td></tr>
+    <tr><td class="paramname">cmpdata</td><td>additional data for the compare function </td></tr>
+    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
+    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new list containing the difference </dd></dl>
+
+</div>
+</div>
+<a id="a4a2a2fc5cc41073c516db6235bbc51d5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4a2a2fc5cc41073c516db6235bbc51d5">&#9670;&nbsp;</a></span>ucx_list_difference_a()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_difference_a </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>left</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>right</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
+          <td class="paramname"><em>cmpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>cmpdata</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
+          <td class="paramname"><em>cpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>cpdata</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns the difference of two lists. </p>
+<p>The difference contains all elements of the left list (including duplicates) that are not equal to any element of the right list.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>allocates the new list elements </td></tr>
+    <tr><td class="paramname">left</td><td>the left source list </td></tr>
+    <tr><td class="paramname">right</td><td>the right source list </td></tr>
+    <tr><td class="paramname">cmpfnc</td><td>a function to compare elements </td></tr>
+    <tr><td class="paramname">cmpdata</td><td>additional data for the compare function </td></tr>
+    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
+    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new list containing the difference </dd></dl>
+
+</div>
+</div>
+<a id="adc435447cecf885bc63d232191085bbe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adc435447cecf885bc63d232191085bbe">&#9670;&nbsp;</a></span>ucx_list_equals()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_list_equals </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>list1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>list2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
+          <td class="paramname"><em>cmpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Compares two UCX lists element-wise by using a compare function. </p>
+<p>Each element of the two specified lists are compared by using the specified compare function and the additional data. The type and content of this additional data depends on the <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791" title="Function pointer to a compare function. ">cmp_func()</a> used.</p>
+<p>If the list pointers denote elements within a list, the lists are compared starting with the denoted elements. Thus any previous elements are not taken into account. This might be useful to check, if certain list tails match each other.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">list1</td><td>the first list </td></tr>
+    <tr><td class="paramname">list2</td><td>the second list </td></tr>
+    <tr><td class="paramname">cmpfnc</td><td>the compare function </td></tr>
+    <tr><td class="paramname">data</td><td>additional data for the compare function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1, if and only if the two lists equal element-wise, 0 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a9b3b6842d3be572e06a7f519e198cb83"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9b3b6842d3be572e06a7f519e198cb83">&#9670;&nbsp;</a></span>ucx_list_find()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">ssize_t ucx_list_find </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>list</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>elem</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
+          <td class="paramname"><em>cmpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns the index of an element containing the specified data. </p>
+<p>This function uses a <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791" title="Function pointer to a compare function. ">cmp_func()</a> to compare the data of each list element with the specified data. If no cmp_func is provided, the pointers are compared.</p>
+<p>If the list contains the data more than once, the index of the first occurrence is returned.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">list</td><td>the list where to search for the data </td></tr>
+    <tr><td class="paramname">elem</td><td>the element data </td></tr>
+    <tr><td class="paramname">cmpfnc</td><td>the compare function </td></tr>
+    <tr><td class="paramname">data</td><td>additional data for the compare function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the index of the element containing the specified data or -1 if the data is not found in this list </dd></dl>
+
+</div>
+</div>
+<a id="a6aa0e34ebc5f0dca6f52d0f7626b4bd5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6aa0e34ebc5f0dca6f52d0f7626b4bd5">&#9670;&nbsp;</a></span>ucx_list_first()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_first </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>elem</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns the first element of a list. </p>
+<p>If the argument is the list pointer, it is directly returned. Otherwise this function traverses to the first element of the list and returns the list pointer.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">elem</td><td>one element of the list </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the first element of the list, the specified element is a member of </dd></dl>
+
+</div>
+</div>
+<a id="a1a0fa2c5b1e478a96da19b0c3f013668"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1a0fa2c5b1e478a96da19b0c3f013668">&#9670;&nbsp;</a></span>ucx_list_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_list_free </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>list</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Destroys the entire list. </p>
+<p>The members of the list are not automatically freed, so ensure they are otherwise referenced or destroyed by ucx_list_free_contents(). Otherwise, a memory leak is likely to occur.</p>
+<p><b>Caution:</b> the argument <b>MUST</b> denote an entire list (i.e. a call to <a class="el" href="list_8h.html#a6aa0e34ebc5f0dca6f52d0f7626b4bd5" title="Returns the first element of a list. ">ucx_list_first()</a> on the argument must return the argument itself)</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">list</td><td>the list to free </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd>ucx_list_free_contents() </dd></dl>
+
+</div>
+</div>
+<a id="a944e11f76c38767cd1100d72a4e3b25b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a944e11f76c38767cd1100d72a4e3b25b">&#9670;&nbsp;</a></span>ucx_list_free_a()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_list_free_a </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>list</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Destroys the entire list using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>. </p>
+<p>See <a class="el" href="list_8h.html#a1a0fa2c5b1e478a96da19b0c3f013668" title="Destroys the entire list. ">ucx_list_free()</a> for details.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
+    <tr><td class="paramname">list</td><td>the list to free </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="list_8h.html#a1a0fa2c5b1e478a96da19b0c3f013668" title="Destroys the entire list. ">ucx_list_free()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a4ba6c96642f72ea046cc22627c72979c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4ba6c96642f72ea046cc22627c72979c">&#9670;&nbsp;</a></span>ucx_list_free_content()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_list_free_content </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>list</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a>&#160;</td>
+          <td class="paramname"><em>destr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Destroys the contents of the specified list by calling the specified destructor on each of them. </p>
+<p>Note, that the contents are not usable afterwards and the list should be destroyed with <a class="el" href="list_8h.html#a1a0fa2c5b1e478a96da19b0c3f013668" title="Destroys the entire list. ">ucx_list_free()</a>.</p>
+<p>If no destructor is specified (<code>NULL</code>), stdlib's free() is used.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">list</td><td>the list for which the contents shall be freed </td></tr>
+    <tr><td class="paramname">destr</td><td>optional destructor function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="list_8h.html#a1a0fa2c5b1e478a96da19b0c3f013668" title="Destroys the entire list. ">ucx_list_free()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a2509ffe19bce6a8708c77f89480c75fb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2509ffe19bce6a8708c77f89480c75fb">&#9670;&nbsp;</a></span>ucx_list_get()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_get </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>list</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>index</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns the list element at the specified index. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">list</td><td>the list to retrieve the element from </td></tr>
+    <tr><td class="paramname">index</td><td>index of the element to return </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the element at the specified index or <code>NULL</code>, if the index is greater than the list size </dd></dl>
+
+</div>
+</div>
+<a id="ae2ff2974812ca185870f80bc4ed9337e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae2ff2974812ca185870f80bc4ed9337e">&#9670;&nbsp;</a></span>ucx_list_indexof()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">ssize_t ucx_list_indexof </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>list</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>elem</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns the index of an element. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">list</td><td>the list where to search for the element </td></tr>
+    <tr><td class="paramname">elem</td><td>the element to find </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the index of the element or -1 if the list does not contain the element </dd></dl>
+
+</div>
+</div>
+<a id="a259f9b754978aeca23dfabba16e20f39"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a259f9b754978aeca23dfabba16e20f39">&#9670;&nbsp;</a></span>ucx_list_intersection()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_intersection </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>left</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>right</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
+          <td class="paramname"><em>cmpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>cmpdata</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
+          <td class="paramname"><em>cpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>cpdata</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns the intersection of two lists. </p>
+<p>The intersection contains all elements of the left list (including duplicates) that can be found in the right list.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">left</td><td>the left source list </td></tr>
+    <tr><td class="paramname">right</td><td>the right source list </td></tr>
+    <tr><td class="paramname">cmpfnc</td><td>a function to compare elements </td></tr>
+    <tr><td class="paramname">cmpdata</td><td>additional data for the compare function </td></tr>
+    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
+    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new list containing the intersection </dd></dl>
+
+</div>
+</div>
+<a id="a1d0b00514dbb81ba6270b58da0c5b9a8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1d0b00514dbb81ba6270b58da0c5b9a8">&#9670;&nbsp;</a></span>ucx_list_intersection_a()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_intersection_a </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>left</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>right</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
+          <td class="paramname"><em>cmpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>cmpdata</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
+          <td class="paramname"><em>cpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>cpdata</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns the intersection of two lists. </p>
+<p>The intersection contains all elements of the left list (including duplicates) that can be found in the right list.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>allocates the new list elements </td></tr>
+    <tr><td class="paramname">left</td><td>the left source list </td></tr>
+    <tr><td class="paramname">right</td><td>the right source list </td></tr>
+    <tr><td class="paramname">cmpfnc</td><td>a function to compare elements </td></tr>
+    <tr><td class="paramname">cmpdata</td><td>additional data for the compare function </td></tr>
+    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
+    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new list containing the intersection </dd></dl>
+
+</div>
+</div>
+<a id="add5ec40c5006e29c629d23c2eb5a6553"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#add5ec40c5006e29c629d23c2eb5a6553">&#9670;&nbsp;</a></span>ucx_list_last()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_last </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>elem</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns the last element of a list. </p>
+<p>If the argument has no successor, it is the last element and therefore directly returned. Otherwise this function traverses to the last element of the list and returns it.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">elem</td><td>one element of the list </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the last element of the list, the specified element is a member of </dd></dl>
+
+</div>
+</div>
+<a id="a8fcb68e4556395b15180eec2d0b77aa4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8fcb68e4556395b15180eec2d0b77aa4">&#9670;&nbsp;</a></span>ucx_list_prepend()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_prepend </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>list</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Inserts an element at the beginning of the list. </p>
+<p>You <em>should</em> overwrite the old list pointer by calling <code>mylist = ucx_list_prepend(mylist, mydata);</code>. However, you may also perform successive calls of <a class="el" href="list_8h.html#a8fcb68e4556395b15180eec2d0b77aa4" title="Inserts an element at the beginning of the list. ">ucx_list_prepend()</a> on the same list pointer, as this function always searchs for the head of the list with <a class="el" href="list_8h.html#a6aa0e34ebc5f0dca6f52d0f7626b4bd5" title="Returns the first element of a list. ">ucx_list_first()</a>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">list</td><td>the list where to insert the data or <code>NULL</code> to create a new list </td></tr>
+    <tr><td class="paramname">data</td><td>the data to insert </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the new list head </dd></dl>
+
+</div>
+</div>
+<a id="a54654e6dc60e1c3de9e886c150e404ec"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a54654e6dc60e1c3de9e886c150e404ec">&#9670;&nbsp;</a></span>ucx_list_prepend_a()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_prepend_a </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>list</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Inserts an element at the beginning of the list using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>. </p>
+<p>See <a class="el" href="list_8h.html#a8fcb68e4556395b15180eec2d0b77aa4" title="Inserts an element at the beginning of the list. ">ucx_list_prepend()</a> for details.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
+    <tr><td class="paramname">list</td><td>the list where to insert the data or <code>NULL</code> to create a new list </td></tr>
+    <tr><td class="paramname">data</td><td>the data to insert </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the new list head </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="list_8h.html#a8fcb68e4556395b15180eec2d0b77aa4" title="Inserts an element at the beginning of the list. ">ucx_list_prepend()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a410cb3e8260037ba56c72d14b899b468"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a410cb3e8260037ba56c72d14b899b468">&#9670;&nbsp;</a></span>ucx_list_remove()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_remove </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>list</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>element</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Removes an element from the list. </p>
+<p>If the first element is removed, the list pointer changes. So it is <em>highly recommended</em> to <em>always</em> update the pointer by calling <code>mylist = ucx_list_remove(mylist, myelem);</code>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">list</td><td>the list from which the element shall be removed </td></tr>
+    <tr><td class="paramname">element</td><td>the element to remove </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>returns the updated list pointer or <code>NULL</code>, if the list is now empty </dd></dl>
+
+</div>
+</div>
+<a id="aca687b7c4e7170175f447e549125aa52"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aca687b7c4e7170175f447e549125aa52">&#9670;&nbsp;</a></span>ucx_list_remove_a()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_remove_a </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>list</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>element</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Removes an element from the list using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>. </p>
+<p>See <a class="el" href="list_8h.html#a410cb3e8260037ba56c72d14b899b468" title="Removes an element from the list. ">ucx_list_remove()</a> for details.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
+    <tr><td class="paramname">list</td><td>the list from which the element shall be removed </td></tr>
+    <tr><td class="paramname">element</td><td>the element to remove </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>returns the updated list pointer or <code>NULL</code>, if the list </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="list_8h.html#a410cb3e8260037ba56c72d14b899b468" title="Removes an element from the list. ">ucx_list_remove()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ae88001cc8ae40b946560f31434abed8f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae88001cc8ae40b946560f31434abed8f">&#9670;&nbsp;</a></span>ucx_list_size()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t ucx_list_size </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>list</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns the element count of the list. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">list</td><td>the list whose elements are counted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the element count </dd></dl>
+
+</div>
+</div>
+<a id="ac74962d9bd7cfc9d3e2e09651469377b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac74962d9bd7cfc9d3e2e09651469377b">&#9670;&nbsp;</a></span>ucx_list_sort()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_sort </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>list</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
+          <td class="paramname"><em>cmpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Sorts a <a class="el" href="structUcxList.html" title="UCX list structure. ">UcxList</a> with natural merge sort. </p>
+<p>This function uses O(n) additional temporary memory for merge operations that is automatically freed after each merge.</p>
+<p>As the head of the list might change, you <b>MUST</b> call this function as follows: <code>mylist = ucx_list_sort(mylist, mycmpfnc, mydata);</code>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">list</td><td>the list to sort </td></tr>
+    <tr><td class="paramname">cmpfnc</td><td>the function that shall be used to compare the element data </td></tr>
+    <tr><td class="paramname">data</td><td>additional data for the <a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791" title="Function pointer to a compare function. ">cmp_func()</a> </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the sorted list </dd></dl>
+
+</div>
+</div>
+<a id="a94ecdb0cea1633ad7074f027fa8485fa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a94ecdb0cea1633ad7074f027fa8485fa">&#9670;&nbsp;</a></span>ucx_list_union()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_union </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>left</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>right</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
+          <td class="paramname"><em>cmpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>cmpdata</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
+          <td class="paramname"><em>cpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>cpdata</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns the union of two lists. </p>
+<p>The union is a list of unique elements regarding cmpfnc obtained from both source lists.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">left</td><td>the left source list </td></tr>
+    <tr><td class="paramname">right</td><td>the right source list </td></tr>
+    <tr><td class="paramname">cmpfnc</td><td>a function to compare elements </td></tr>
+    <tr><td class="paramname">cmpdata</td><td>additional data for the compare function </td></tr>
+    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
+    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new list containing the union </dd></dl>
+
+</div>
+</div>
+<a id="a65b4355536f4ebc4130211b46469f4c1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a65b4355536f4ebc4130211b46469f4c1">&#9670;&nbsp;</a></span>ucx_list_union_a()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxList.html">UcxList</a>* ucx_list_union_a </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>left</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structUcxList.html">UcxList</a> *&#160;</td>
+          <td class="paramname"><em>right</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td>
+          <td class="paramname"><em>cmpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>cmpdata</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
+          <td class="paramname"><em>cpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>cpdata</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns the union of two lists. </p>
+<p>The union is a list of unique elements regarding cmpfnc obtained from both source lists.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>allocates the new list elements </td></tr>
+    <tr><td class="paramname">left</td><td>the left source list </td></tr>
+    <tr><td class="paramname">right</td><td>the right source list </td></tr>
+    <tr><td class="paramname">cmpfnc</td><td>a function to compare elements </td></tr>
+    <tr><td class="paramname">cmpdata</td><td>additional data for the compare function </td></tr>
+    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
+    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new list containing the union </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/list_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/list.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">list.h</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a href="list_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment"> * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"> * Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment"> * modification, are permitted provided that the following conditions are met:</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> *   1. Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> *   2. Redistributions in binary form must reproduce the above copyright</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer in the</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment"> *      documentation and/or other materials provided with the distribution.</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment"> * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment"> * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment"> * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"> * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment"> * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment"> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment"> * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE</span></div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> * POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;<span class="preprocessor">#ifndef UCX_LIST_H</span></div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;<span class="preprocessor">#define UCX_LIST_H</span></div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;</div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ucx_8h.html">ucx.h</a>&quot;</span></div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="allocator_8h.html">allocator.h</a>&quot;</span></div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;</div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;</div><div class="line"><a name="l00059"></a><span class="lineno"><a class="line" href="list_8h.html#a4b143b6526a410aa4d22cb3bb9365d70">   59</a></span>&#160;<span class="preprocessor">#define UCX_FOREACH(elem,list) \</span></div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;<span class="preprocessor">        for (UcxList* elem = (UcxList*) list ; elem != NULL ; elem = elem-&gt;next)</span></div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;</div><div class="line"><a name="l00066"></a><span class="lineno"><a class="line" href="list_8h.html#aa6f89f91c1081c9a7c6866c298f497a2">   66</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structUcxList.html">UcxList</a> <a class="code" href="structUcxList.html">UcxList</a>;</div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;</div><div class="line"><a name="l00071"></a><span class="lineno"><a class="line" href="structUcxList.html">   71</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structUcxList.html">UcxList</a> {</div><div class="line"><a name="l00075"></a><span class="lineno"><a class="line" href="structUcxList.html#a4a44905121b6fc2a088084ce578a9ea2">   75</a></span>&#160;    <span class="keywordtype">void</span>    *<a class="code" href="structUcxList.html#a4a44905121b6fc2a088084ce578a9ea2">data</a>;</div><div class="line"><a name="l00080"></a><span class="lineno"><a class="line" href="structUcxList.html#a82a1818f1abf765b026fa91478569a8f">   80</a></span>&#160;    <a class="code" href="structUcxList.html">UcxList</a> *<a class="code" href="structUcxList.html#a82a1818f1abf765b026fa91478569a8f">next</a>;</div><div class="line"><a name="l00085"></a><span class="lineno"><a class="line" href="structUcxList.html#a0f1fddce9088b9c1414745d0b1b5c08b">   85</a></span>&#160;    <a class="code" href="structUcxList.html">UcxList</a> *<a class="code" href="structUcxList.html#a0f1fddce9088b9c1414745d0b1b5c08b">prev</a>;</div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;};</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;<a class="code" href="structUcxList.html">UcxList</a> *<a class="code" href="list_8h.html#ae7054a41c289b24e6caf5cb07ac850ed">ucx_list_clone</a>(<span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *list, <a class="code" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpyfnc, <span class="keywordtype">void</span>* <a class="code" href="structUcxList.html#a4a44905121b6fc2a088084ce578a9ea2">data</a>);</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;<a class="code" href="structUcxList.html">UcxList</a> *<a class="code" href="list_8h.html#a08ca1ba0d2e82258b0408714c1f4c425">ucx_list_clone_a</a>(<a class="code" href="structUcxAllocator.html">UcxAllocator</a> *allocator, <span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *list,</div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;        <a class="code" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpyfnc, <span class="keywordtype">void</span>* <a class="code" href="structUcxList.html#a4a44905121b6fc2a088084ce578a9ea2">data</a>);</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;<span class="keywordtype">int</span> <a class="code" href="list_8h.html#adc435447cecf885bc63d232191085bbe">ucx_list_equals</a>(<span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *list1, <span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *list2,</div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;        <a class="code" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, <span class="keywordtype">void</span>* <a class="code" href="structUcxList.html#a4a44905121b6fc2a088084ce578a9ea2">data</a>);</div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;</div><div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;<span class="keywordtype">void</span> <a class="code" href="list_8h.html#a1a0fa2c5b1e478a96da19b0c3f013668">ucx_list_free</a>(<a class="code" href="structUcxList.html">UcxList</a> *list);</div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;</div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;<span class="keywordtype">void</span> <a class="code" href="list_8h.html#a944e11f76c38767cd1100d72a4e3b25b">ucx_list_free_a</a>(<a class="code" href="structUcxAllocator.html">UcxAllocator</a> *allocator, <a class="code" href="structUcxList.html">UcxList</a> *list);</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;</div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;<span class="keywordtype">void</span> <a class="code" href="list_8h.html#a4ba6c96642f72ea046cc22627c72979c">ucx_list_free_content</a>(<a class="code" href="structUcxList.html">UcxList</a>* list, <a class="code" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a> destr);</div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;</div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;</div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;<a class="code" href="structUcxList.html">UcxList</a> *<a class="code" href="list_8h.html#a00c122c8a26d35b60676939df4161621">ucx_list_append</a>(<a class="code" href="structUcxList.html">UcxList</a> *list, <span class="keywordtype">void</span> *<a class="code" href="structUcxList.html#a4a44905121b6fc2a088084ce578a9ea2">data</a>);</div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;</div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;<a class="code" href="structUcxList.html">UcxList</a> *<a class="code" href="list_8h.html#adf3b3e2e0ff977d8928671d6bd82fc60">ucx_list_append_a</a>(<a class="code" href="structUcxAllocator.html">UcxAllocator</a> *allocator, <a class="code" href="structUcxList.html">UcxList</a> *list, <span class="keywordtype">void</span> *<a class="code" href="structUcxList.html#a4a44905121b6fc2a088084ce578a9ea2">data</a>);</div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;</div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;<a class="code" href="structUcxList.html">UcxList</a> *<a class="code" href="list_8h.html#a8fcb68e4556395b15180eec2d0b77aa4">ucx_list_prepend</a>(<a class="code" href="structUcxList.html">UcxList</a> *list, <span class="keywordtype">void</span> *<a class="code" href="structUcxList.html#a4a44905121b6fc2a088084ce578a9ea2">data</a>);</div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;</div><div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;<a class="code" href="structUcxList.html">UcxList</a> *<a class="code" href="list_8h.html#a54654e6dc60e1c3de9e886c150e404ec">ucx_list_prepend_a</a>(<a class="code" href="structUcxAllocator.html">UcxAllocator</a> *allocator, <a class="code" href="structUcxList.html">UcxList</a> *list, <span class="keywordtype">void</span> *<a class="code" href="structUcxList.html#a4a44905121b6fc2a088084ce578a9ea2">data</a>);</div><div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;</div><div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;<a class="code" href="structUcxList.html">UcxList</a> *<a class="code" href="list_8h.html#a77163a0cc82fae52bec26c8c0c3674d9">ucx_list_concat</a>(<a class="code" href="structUcxList.html">UcxList</a> *list1, <a class="code" href="structUcxList.html">UcxList</a> *list2);</div><div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;</div><div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;<a class="code" href="structUcxList.html">UcxList</a> *<a class="code" href="list_8h.html#a6aa0e34ebc5f0dca6f52d0f7626b4bd5">ucx_list_first</a>(<span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *elem);</div><div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;</div><div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;<a class="code" href="structUcxList.html">UcxList</a> *<a class="code" href="list_8h.html#add5ec40c5006e29c629d23c2eb5a6553">ucx_list_last</a>(<span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *elem);</div><div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;</div><div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;<a class="code" href="structUcxList.html">UcxList</a> *<a class="code" href="list_8h.html#a2509ffe19bce6a8708c77f89480c75fb">ucx_list_get</a>(<span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *list, <span class="keywordtype">size_t</span> index);</div><div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;</div><div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;ssize_t <a class="code" href="list_8h.html#ae2ff2974812ca185870f80bc4ed9337e">ucx_list_indexof</a>(<span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *list, <span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *elem);</div><div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;</div><div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;<span class="keywordtype">size_t</span> <a class="code" href="list_8h.html#ae88001cc8ae40b946560f31434abed8f">ucx_list_size</a>(<span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *list);</div><div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;</div><div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;ssize_t <a class="code" href="list_8h.html#a9b3b6842d3be572e06a7f519e198cb83">ucx_list_find</a>(<span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *list, <span class="keywordtype">void</span> *elem,</div><div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;    <a class="code" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, <span class="keywordtype">void</span> *<a class="code" href="structUcxList.html#a4a44905121b6fc2a088084ce578a9ea2">data</a>);</div><div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;</div><div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;<span class="keywordtype">int</span> <a class="code" href="list_8h.html#a8b0fa051fcfe12e1a82cca1087973852">ucx_list_contains</a>(<span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *list, <span class="keywordtype">void</span> *elem,</div><div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;    <a class="code" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, <span class="keywordtype">void</span> *<a class="code" href="structUcxList.html#a4a44905121b6fc2a088084ce578a9ea2">data</a>);</div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;</div><div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;<a class="code" href="structUcxList.html">UcxList</a> *<a class="code" href="list_8h.html#ac74962d9bd7cfc9d3e2e09651469377b">ucx_list_sort</a>(<a class="code" href="structUcxList.html">UcxList</a> *list, <a class="code" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, <span class="keywordtype">void</span> *<a class="code" href="structUcxList.html#a4a44905121b6fc2a088084ce578a9ea2">data</a>);</div><div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;</div><div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;<a class="code" href="structUcxList.html">UcxList</a> *<a class="code" href="list_8h.html#a410cb3e8260037ba56c72d14b899b468">ucx_list_remove</a>(<a class="code" href="structUcxList.html">UcxList</a> *list, <a class="code" href="structUcxList.html">UcxList</a> *element);</div><div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;</div><div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;<a class="code" href="structUcxList.html">UcxList</a> *<a class="code" href="list_8h.html#aca687b7c4e7170175f447e549125aa52">ucx_list_remove_a</a>(<a class="code" href="structUcxAllocator.html">UcxAllocator</a> *allocator, <a class="code" href="structUcxList.html">UcxList</a> *list,</div><div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;        <a class="code" href="structUcxList.html">UcxList</a> *element);</div><div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;</div><div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;<a class="code" href="structUcxList.html">UcxList</a>* <a class="code" href="list_8h.html#a94ecdb0cea1633ad7074f027fa8485fa">ucx_list_union</a>(<span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *left, <span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *right,</div><div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;    <a class="code" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, <span class="keywordtype">void</span>* cmpdata,</div><div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;    <a class="code" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, <span class="keywordtype">void</span>* cpdata);</div><div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;</div><div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;<a class="code" href="structUcxList.html">UcxList</a>* <a class="code" href="list_8h.html#a65b4355536f4ebc4130211b46469f4c1">ucx_list_union_a</a>(<a class="code" href="structUcxAllocator.html">UcxAllocator</a> *allocator,</div><div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;    <span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *left, <span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *right,</div><div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;    <a class="code" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, <span class="keywordtype">void</span>* cmpdata,</div><div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;    <a class="code" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, <span class="keywordtype">void</span>* cpdata);</div><div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;</div><div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;<a class="code" href="structUcxList.html">UcxList</a>* <a class="code" href="list_8h.html#a259f9b754978aeca23dfabba16e20f39">ucx_list_intersection</a>(<span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *left, <span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *right,</div><div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;    <a class="code" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, <span class="keywordtype">void</span>* cmpdata,</div><div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;    <a class="code" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, <span class="keywordtype">void</span>* cpdata);</div><div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;</div><div class="line"><a name="l00464"></a><span class="lineno">  464</span>&#160;<a class="code" href="structUcxList.html">UcxList</a>* <a class="code" href="list_8h.html#a1d0b00514dbb81ba6270b58da0c5b9a8">ucx_list_intersection_a</a>(<a class="code" href="structUcxAllocator.html">UcxAllocator</a> *allocator,</div><div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;    <span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *left, <span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *right,</div><div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;    <a class="code" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, <span class="keywordtype">void</span>* cmpdata,</div><div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;    <a class="code" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, <span class="keywordtype">void</span>* cpdata);</div><div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;</div><div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;<a class="code" href="structUcxList.html">UcxList</a>* <a class="code" href="list_8h.html#a6c5db5d1d11ad28b6fe1a80ee1c1e449">ucx_list_difference</a>(<span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *left, <span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *right,</div><div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;    <a class="code" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, <span class="keywordtype">void</span>* cmpdata,</div><div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;    <a class="code" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, <span class="keywordtype">void</span>* cpdata);</div><div class="line"><a name="l00486"></a><span class="lineno">  486</span>&#160;</div><div class="line"><a name="l00502"></a><span class="lineno">  502</span>&#160;<a class="code" href="structUcxList.html">UcxList</a>* <a class="code" href="list_8h.html#a4a2a2fc5cc41073c516db6235bbc51d5">ucx_list_difference_a</a>(<a class="code" href="structUcxAllocator.html">UcxAllocator</a> *allocator,</div><div class="line"><a name="l00503"></a><span class="lineno">  503</span>&#160;    <span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *left, <span class="keyword">const</span> <a class="code" href="structUcxList.html">UcxList</a> *right,</div><div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;    <a class="code" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> cmpfnc, <span class="keywordtype">void</span>* cmpdata,</div><div class="line"><a name="l00505"></a><span class="lineno">  505</span>&#160;    <a class="code" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, <span class="keywordtype">void</span>* cpdata);</div><div class="line"><a name="l00506"></a><span class="lineno">  506</span>&#160;</div><div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;}</div><div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;</div><div class="line"><a name="l00511"></a><span class="lineno">  511</span>&#160;<span class="preprocessor">#endif  </span><span class="comment">/* UCX_LIST_H */</span><span class="preprocessor"></span></div><div class="line"><a name="l00512"></a><span class="lineno">  512</span>&#160;</div><div class="ttc" id="ucx_8h_html_aab917a5fe0965673c73e8ebd0a1fc967"><div class="ttname"><a href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a></div><div class="ttdeci">void *(* copy_func)(const void *, void *)</div><div class="ttdoc">Function pointer to a copy function. </div><div class="ttdef"><b>Definition:</b> ucx.h:106</div></div>
+<div class="ttc" id="list_8h_html_adf3b3e2e0ff977d8928671d6bd82fc60"><div class="ttname"><a href="list_8h.html#adf3b3e2e0ff977d8928671d6bd82fc60">ucx_list_append_a</a></div><div class="ttdeci">UcxList * ucx_list_append_a(UcxAllocator *allocator, UcxList *list, void *data)</div><div class="ttdoc">Inserts an element at the end of the list using a UcxAllocator. </div><div class="ttdef"><b>Definition:</b> list.c:91</div></div>
+<div class="ttc" id="list_8h_html_a2509ffe19bce6a8708c77f89480c75fb"><div class="ttname"><a href="list_8h.html#a2509ffe19bce6a8708c77f89480c75fb">ucx_list_get</a></div><div class="ttdeci">UcxList * ucx_list_get(const UcxList *list, size_t index)</div><div class="ttdoc">Returns the list element at the specified index. </div><div class="ttdef"><b>Definition:</b> list.c:163</div></div>
+<div class="ttc" id="list_8h_html_a00c122c8a26d35b60676939df4161621"><div class="ttname"><a href="list_8h.html#a00c122c8a26d35b60676939df4161621">ucx_list_append</a></div><div class="ttdeci">UcxList * ucx_list_append(UcxList *list, void *data)</div><div class="ttdoc">Inserts an element at the end of the list. </div><div class="ttdef"><b>Definition:</b> list.c:87</div></div>
+<div class="ttc" id="ucx_8h_html_afe5e2d5dbf34778e0e97852051570791"><div class="ttname"><a href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a></div><div class="ttdeci">int(* cmp_func)(const void *, const void *, void *)</div><div class="ttdoc">Function pointer to a compare function. </div><div class="ttdef"><b>Definition:</b> ucx.h:84</div></div>
+<div class="ttc" id="list_8h_html_a8fcb68e4556395b15180eec2d0b77aa4"><div class="ttname"><a href="list_8h.html#a8fcb68e4556395b15180eec2d0b77aa4">ucx_list_prepend</a></div><div class="ttdeci">UcxList * ucx_list_prepend(UcxList *list, void *data)</div><div class="ttdoc">Inserts an element at the beginning of the list. </div><div class="ttdef"><b>Definition:</b> list.c:110</div></div>
+<div class="ttc" id="ucx_8h_html"><div class="ttname"><a href="ucx_8h.html">ucx.h</a></div><div class="ttdoc">Main UCX Header providing most common definitions. </div></div>
+<div class="ttc" id="list_8h_html_a6aa0e34ebc5f0dca6f52d0f7626b4bd5"><div class="ttname"><a href="list_8h.html#a6aa0e34ebc5f0dca6f52d0f7626b4bd5">ucx_list_first</a></div><div class="ttdeci">UcxList * ucx_list_first(const UcxList *elem)</div><div class="ttdoc">Returns the first element of a list. </div><div class="ttdef"><b>Definition:</b> list.c:307</div></div>
+<div class="ttc" id="list_8h_html_a944e11f76c38767cd1100d72a4e3b25b"><div class="ttname"><a href="list_8h.html#a944e11f76c38767cd1100d72a4e3b25b">ucx_list_free_a</a></div><div class="ttdeci">void ucx_list_free_a(UcxAllocator *allocator, UcxList *list)</div><div class="ttdoc">Destroys the entire list using a UcxAllocator. </div><div class="ttdef"><b>Definition:</b> list.c:70</div></div>
+<div class="ttc" id="structUcxList_html"><div class="ttname"><a href="structUcxList.html">UcxList</a></div><div class="ttdoc">UCX list structure. </div><div class="ttdef"><b>Definition:</b> list.h:71</div></div>
+<div class="ttc" id="list_8h_html_a9b3b6842d3be572e06a7f519e198cb83"><div class="ttname"><a href="list_8h.html#a9b3b6842d3be572e06a7f519e198cb83">ucx_list_find</a></div><div class="ttdeci">ssize_t ucx_list_find(const UcxList *list, void *elem, cmp_func cmpfnc, void *data)</div><div class="ttdoc">Returns the index of an element containing the specified data. </div><div class="ttdef"><b>Definition:</b> list.c:175</div></div>
+<div class="ttc" id="list_8h_html_a4a2a2fc5cc41073c516db6235bbc51d5"><div class="ttname"><a href="list_8h.html#a4a2a2fc5cc41073c516db6235bbc51d5">ucx_list_difference_a</a></div><div class="ttdeci">UcxList * ucx_list_difference_a(UcxAllocator *allocator, const UcxList *left, const UcxList *right, cmp_func cmpfnc, void *cmpdata, copy_func cpfnc, void *cpdata)</div><div class="ttdoc">Returns the difference of two lists. </div><div class="ttdef"><b>Definition:</b> list.c:421</div></div>
+<div class="ttc" id="list_8h_html_a08ca1ba0d2e82258b0408714c1f4c425"><div class="ttname"><a href="list_8h.html#a08ca1ba0d2e82258b0408714c1f4c425">ucx_list_clone_a</a></div><div class="ttdeci">UcxList * ucx_list_clone_a(UcxAllocator *allocator, const UcxList *list, copy_func cpyfnc, void *data)</div><div class="ttdoc">Creates an element-wise copy of a list using a UcxAllocator. </div><div class="ttdef"><b>Definition:</b> list.c:35</div></div>
+<div class="ttc" id="list_8h_html_a94ecdb0cea1633ad7074f027fa8485fa"><div class="ttname"><a href="list_8h.html#a94ecdb0cea1633ad7074f027fa8485fa">ucx_list_union</a></div><div class="ttdeci">UcxList * ucx_list_union(const UcxList *left, const UcxList *right, cmp_func cmpfnc, void *cmpdata, copy_func cpfnc, void *cpdata)</div><div class="ttdoc">Returns the union of two lists. </div><div class="ttdef"><b>Definition:</b> list.c:382</div></div>
+<div class="ttc" id="list_8h_html_a77163a0cc82fae52bec26c8c0c3674d9"><div class="ttname"><a href="list_8h.html#a77163a0cc82fae52bec26c8c0c3674d9">ucx_list_concat</a></div><div class="ttdeci">UcxList * ucx_list_concat(UcxList *list1, UcxList *list2)</div><div class="ttdoc">Concatenates two lists. </div><div class="ttdef"><b>Definition:</b> list.c:128</div></div>
+<div class="ttc" id="list_8h_html_add5ec40c5006e29c629d23c2eb5a6553"><div class="ttname"><a href="list_8h.html#add5ec40c5006e29c629d23c2eb5a6553">ucx_list_last</a></div><div class="ttdeci">UcxList * ucx_list_last(const UcxList *elem)</div><div class="ttdoc">Returns the last element of a list. </div><div class="ttdef"><b>Definition:</b> list.c:141</div></div>
+<div class="ttc" id="list_8h_html_a410cb3e8260037ba56c72d14b899b468"><div class="ttname"><a href="list_8h.html#a410cb3e8260037ba56c72d14b899b468">ucx_list_remove</a></div><div class="ttdeci">UcxList * ucx_list_remove(UcxList *list, UcxList *element)</div><div class="ttdoc">Removes an element from the list. </div><div class="ttdef"><b>Definition:</b> list.c:319</div></div>
+<div class="ttc" id="structUcxList_html_a4a44905121b6fc2a088084ce578a9ea2"><div class="ttname"><a href="structUcxList.html#a4a44905121b6fc2a088084ce578a9ea2">UcxList::data</a></div><div class="ttdeci">void * data</div><div class="ttdoc">List element payload. </div><div class="ttdef"><b>Definition:</b> list.h:75</div></div>
+<div class="ttc" id="list_8h_html_ae2ff2974812ca185870f80bc4ed9337e"><div class="ttname"><a href="list_8h.html#ae2ff2974812ca185870f80bc4ed9337e">ucx_list_indexof</a></div><div class="ttdeci">ssize_t ucx_list_indexof(const UcxList *list, const UcxList *elem)</div><div class="ttdoc">Returns the index of an element. </div><div class="ttdef"><b>Definition:</b> list.c:151</div></div>
+<div class="ttc" id="list_8h_html_aca687b7c4e7170175f447e549125aa52"><div class="ttname"><a href="list_8h.html#aca687b7c4e7170175f447e549125aa52">ucx_list_remove_a</a></div><div class="ttdeci">UcxList * ucx_list_remove_a(UcxAllocator *allocator, UcxList *list, UcxList *element)</div><div class="ttdoc">Removes an element from the list using a UcxAllocator. </div><div class="ttdef"><b>Definition:</b> list.c:323</div></div>
+<div class="ttc" id="list_8h_html_a6c5db5d1d11ad28b6fe1a80ee1c1e449"><div class="ttname"><a href="list_8h.html#a6c5db5d1d11ad28b6fe1a80ee1c1e449">ucx_list_difference</a></div><div class="ttdeci">UcxList * ucx_list_difference(const UcxList *left, const UcxList *right, cmp_func cmpfnc, void *cmpdata, copy_func cpfnc, void *cpdata)</div><div class="ttdoc">Returns the difference of two lists. </div><div class="ttdef"><b>Definition:</b> list.c:414</div></div>
+<div class="ttc" id="structUcxAllocator_html"><div class="ttname"><a href="structUcxAllocator.html">UcxAllocator</a></div><div class="ttdoc">UCX allocator data structure containing memory management functions. </div><div class="ttdef"><b>Definition:</b> allocator.h:88</div></div>
+<div class="ttc" id="list_8h_html_a4ba6c96642f72ea046cc22627c72979c"><div class="ttname"><a href="list_8h.html#a4ba6c96642f72ea046cc22627c72979c">ucx_list_free_content</a></div><div class="ttdeci">void ucx_list_free_content(UcxList *list, ucx_destructor destr)</div><div class="ttdoc">Destroys the contents of the specified list by calling the specified destructor on each of them...</div><div class="ttdef"><b>Definition:</b> list.c:79</div></div>
+<div class="ttc" id="structUcxList_html_a82a1818f1abf765b026fa91478569a8f"><div class="ttname"><a href="structUcxList.html#a82a1818f1abf765b026fa91478569a8f">UcxList::next</a></div><div class="ttdeci">UcxList * next</div><div class="ttdoc">Pointer to the next list element or NULL, if this is the last element. </div><div class="ttdef"><b>Definition:</b> list.h:80</div></div>
+<div class="ttc" id="list_8h_html_a1d0b00514dbb81ba6270b58da0c5b9a8"><div class="ttname"><a href="list_8h.html#a1d0b00514dbb81ba6270b58da0c5b9a8">ucx_list_intersection_a</a></div><div class="ttdeci">UcxList * ucx_list_intersection_a(UcxAllocator *allocator, const UcxList *left, const UcxList *right, cmp_func cmpfnc, void *cmpdata, copy_func cpfnc, void *cpdata)</div><div class="ttdoc">Returns the intersection of two lists. </div><div class="ttdef"><b>Definition:</b> list.c:405</div></div>
+<div class="ttc" id="list_8h_html_a259f9b754978aeca23dfabba16e20f39"><div class="ttname"><a href="list_8h.html#a259f9b754978aeca23dfabba16e20f39">ucx_list_intersection</a></div><div class="ttdeci">UcxList * ucx_list_intersection(const UcxList *left, const UcxList *right, cmp_func cmpfnc, void *cmpdata, copy_func cpfnc, void *cpdata)</div><div class="ttdoc">Returns the intersection of two lists. </div><div class="ttdef"><b>Definition:</b> list.c:398</div></div>
+<div class="ttc" id="list_8h_html_ac74962d9bd7cfc9d3e2e09651469377b"><div class="ttname"><a href="list_8h.html#ac74962d9bd7cfc9d3e2e09651469377b">ucx_list_sort</a></div><div class="ttdeci">UcxList * ucx_list_sort(UcxList *list, cmp_func cmpfnc, void *data)</div><div class="ttdoc">Sorts a UcxList with natural merge sort. </div><div class="ttdef"><b>Definition:</b> list.c:254</div></div>
+<div class="ttc" id="list_8h_html_ae7054a41c289b24e6caf5cb07ac850ed"><div class="ttname"><a href="list_8h.html#ae7054a41c289b24e6caf5cb07ac850ed">ucx_list_clone</a></div><div class="ttdeci">UcxList * ucx_list_clone(const UcxList *list, copy_func cpyfnc, void *data)</div><div class="ttdoc">Creates an element-wise copy of a list. </div><div class="ttdef"><b>Definition:</b> list.c:31</div></div>
+<div class="ttc" id="allocator_8h_html"><div class="ttname"><a href="allocator_8h.html">allocator.h</a></div><div class="ttdoc">Allocator for custom memory management. </div></div>
+<div class="ttc" id="list_8h_html_a54654e6dc60e1c3de9e886c150e404ec"><div class="ttname"><a href="list_8h.html#a54654e6dc60e1c3de9e886c150e404ec">ucx_list_prepend_a</a></div><div class="ttdeci">UcxList * ucx_list_prepend_a(UcxAllocator *allocator, UcxList *list, void *data)</div><div class="ttdoc">Inserts an element at the beginning of the list using a UcxAllocator. </div><div class="ttdef"><b>Definition:</b> list.c:114</div></div>
+<div class="ttc" id="list_8h_html_a1a0fa2c5b1e478a96da19b0c3f013668"><div class="ttname"><a href="list_8h.html#a1a0fa2c5b1e478a96da19b0c3f013668">ucx_list_free</a></div><div class="ttdeci">void ucx_list_free(UcxList *list)</div><div class="ttdoc">Destroys the entire list. </div><div class="ttdef"><b>Definition:</b> list.c:66</div></div>
+<div class="ttc" id="structUcxList_html_a0f1fddce9088b9c1414745d0b1b5c08b"><div class="ttname"><a href="structUcxList.html#a0f1fddce9088b9c1414745d0b1b5c08b">UcxList::prev</a></div><div class="ttdeci">UcxList * prev</div><div class="ttdoc">Pointer to the previous list element or NULL, if this is the first element. </div><div class="ttdef"><b>Definition:</b> list.h:85</div></div>
+<div class="ttc" id="list_8h_html_a65b4355536f4ebc4130211b46469f4c1"><div class="ttname"><a href="list_8h.html#a65b4355536f4ebc4130211b46469f4c1">ucx_list_union_a</a></div><div class="ttdeci">UcxList * ucx_list_union_a(UcxAllocator *allocator, const UcxList *left, const UcxList *right, cmp_func cmpfnc, void *cmpdata, copy_func cpfnc, void *cpdata)</div><div class="ttdoc">Returns the union of two lists. </div><div class="ttdef"><b>Definition:</b> list.c:389</div></div>
+<div class="ttc" id="list_8h_html_adc435447cecf885bc63d232191085bbe"><div class="ttname"><a href="list_8h.html#adc435447cecf885bc63d232191085bbe">ucx_list_equals</a></div><div class="ttdeci">int ucx_list_equals(const UcxList *list1, const UcxList *list2, cmp_func cmpfnc, void *data)</div><div class="ttdoc">Compares two UCX lists element-wise by using a compare function. </div><div class="ttdef"><b>Definition:</b> list.c:49</div></div>
+<div class="ttc" id="list_8h_html_a8b0fa051fcfe12e1a82cca1087973852"><div class="ttname"><a href="list_8h.html#a8b0fa051fcfe12e1a82cca1087973852">ucx_list_contains</a></div><div class="ttdeci">int ucx_list_contains(const UcxList *list, void *elem, cmp_func cmpfnc, void *data)</div><div class="ttdoc">Checks, if a list contains a specific element. </div><div class="ttdef"><b>Definition:</b> list.c:193</div></div>
+<div class="ttc" id="list_8h_html_ae88001cc8ae40b946560f31434abed8f"><div class="ttname"><a href="list_8h.html#ae88001cc8ae40b946560f31434abed8f">ucx_list_size</a></div><div class="ttdeci">size_t ucx_list_size(const UcxList *list)</div><div class="ttdoc">Returns the element count of the list. </div><div class="ttdef"><b>Definition:</b> list.c:198</div></div>
+<div class="ttc" id="ucx_8h_html_ad2b370c2809914c8b7fedab163c266b3"><div class="ttname"><a href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a></div><div class="ttdeci">void(* ucx_destructor)(void *)</div><div class="ttdoc">A function pointer to a destructor function. </div><div class="ttdef"><b>Definition:</b> ucx.h:72</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/logging_8h.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,716 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/logging.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">logging.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Logging API.  
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="map_8h_source.html">map.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="string_8h_source.html">string.h</a>&quot;</code><br />
+<code>#include &lt;stdio.h&gt;</code><br />
+</div>
+<p><a href="logging_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxLogger.html">UcxLogger</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">The UCX Logger object.  <a href="structUcxLogger.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:aa254c07fe3a907613e2256a318d5c9a8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="logging_8h.html#aa254c07fe3a907613e2256a318d5c9a8">UCX_LOGGER_ERROR</a>&#160;&#160;&#160;0x00</td></tr>
+<tr class="memdesc:aa254c07fe3a907613e2256a318d5c9a8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Log level for error messages.  <a href="#aa254c07fe3a907613e2256a318d5c9a8">More...</a><br /></td></tr>
+<tr class="separator:aa254c07fe3a907613e2256a318d5c9a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abd01ca11486226ba34e8f7028d9fffba"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="logging_8h.html#abd01ca11486226ba34e8f7028d9fffba">UCX_LOGGER_WARN</a>&#160;&#160;&#160;0x10</td></tr>
+<tr class="memdesc:abd01ca11486226ba34e8f7028d9fffba"><td class="mdescLeft">&#160;</td><td class="mdescRight">Log level for warning messages.  <a href="#abd01ca11486226ba34e8f7028d9fffba">More...</a><br /></td></tr>
+<tr class="separator:abd01ca11486226ba34e8f7028d9fffba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4b0178bf60a6129373ffc59114ca4c9b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="logging_8h.html#a4b0178bf60a6129373ffc59114ca4c9b">UCX_LOGGER_INFO</a>&#160;&#160;&#160;0x20</td></tr>
+<tr class="memdesc:a4b0178bf60a6129373ffc59114ca4c9b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Log level for information messages.  <a href="#a4b0178bf60a6129373ffc59114ca4c9b">More...</a><br /></td></tr>
+<tr class="separator:a4b0178bf60a6129373ffc59114ca4c9b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acff01d1ef919ea997cfce755fc1b83d8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="logging_8h.html#acff01d1ef919ea997cfce755fc1b83d8">UCX_LOGGER_DEBUG</a>&#160;&#160;&#160;0x30</td></tr>
+<tr class="memdesc:acff01d1ef919ea997cfce755fc1b83d8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Log level for debug messages.  <a href="#acff01d1ef919ea997cfce755fc1b83d8">More...</a><br /></td></tr>
+<tr class="separator:acff01d1ef919ea997cfce755fc1b83d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a55b88d1fec7036d841b3ddd6195c5586"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="logging_8h.html#a55b88d1fec7036d841b3ddd6195c5586">UCX_LOGGER_TRACE</a>&#160;&#160;&#160;0x40</td></tr>
+<tr class="memdesc:a55b88d1fec7036d841b3ddd6195c5586"><td class="mdescLeft">&#160;</td><td class="mdescRight">Log level for trace messages.  <a href="#a55b88d1fec7036d841b3ddd6195c5586">More...</a><br /></td></tr>
+<tr class="separator:a55b88d1fec7036d841b3ddd6195c5586"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aee18bc20e58ffb69910121512c350839"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="logging_8h.html#aee18bc20e58ffb69910121512c350839">UCX_LOGGER_LEVEL</a>&#160;&#160;&#160;0x01</td></tr>
+<tr class="memdesc:aee18bc20e58ffb69910121512c350839"><td class="mdescLeft">&#160;</td><td class="mdescRight">Output flag for the log level.  <a href="#aee18bc20e58ffb69910121512c350839">More...</a><br /></td></tr>
+<tr class="separator:aee18bc20e58ffb69910121512c350839"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a38607008268b4f776ee500fb95d2e823"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="logging_8h.html#a38607008268b4f776ee500fb95d2e823">UCX_LOGGER_TIMESTAMP</a>&#160;&#160;&#160;0x02</td></tr>
+<tr class="memdesc:a38607008268b4f776ee500fb95d2e823"><td class="mdescLeft">&#160;</td><td class="mdescRight">Output flag for the timestmap.  <a href="#a38607008268b4f776ee500fb95d2e823">More...</a><br /></td></tr>
+<tr class="separator:a38607008268b4f776ee500fb95d2e823"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0e0d72b12616c1e49ff8834eaf4cb8a2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="logging_8h.html#a0e0d72b12616c1e49ff8834eaf4cb8a2">UCX_LOGGER_SOURCE</a>&#160;&#160;&#160;0x04</td></tr>
+<tr class="memdesc:a0e0d72b12616c1e49ff8834eaf4cb8a2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Output flag for the source.  <a href="#a0e0d72b12616c1e49ff8834eaf4cb8a2">More...</a><br /></td></tr>
+<tr class="separator:a0e0d72b12616c1e49ff8834eaf4cb8a2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5cffc19502c4c90bfb3bd3bbcd18170a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="logging_8h.html#a5cffc19502c4c90bfb3bd3bbcd18170a">ucx_logger_register_level</a>(logger,  level,  name)</td></tr>
+<tr class="memdesc:a5cffc19502c4c90bfb3bd3bbcd18170a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Registers a custom log level.  <a href="#a5cffc19502c4c90bfb3bd3bbcd18170a">More...</a><br /></td></tr>
+<tr class="separator:a5cffc19502c4c90bfb3bd3bbcd18170a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa0245325031d95799b28def177fd14ec"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="logging_8h.html#aa0245325031d95799b28def177fd14ec">ucx_logger_log</a>(logger,  level, ...)&#160;&#160;&#160;<a class="el" href="logging_8h.html#ac337e5d02ebea565012d4c11bd643801">ucx_logger_logf</a>(logger, level, __FILE__, __LINE__, __VA_ARGS__)</td></tr>
+<tr class="memdesc:aa0245325031d95799b28def177fd14ec"><td class="mdescLeft">&#160;</td><td class="mdescRight">Logs a message at the specified level.  <a href="#aa0245325031d95799b28def177fd14ec">More...</a><br /></td></tr>
+<tr class="separator:aa0245325031d95799b28def177fd14ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6a9e472e14d6768e59d96d245e065397"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="logging_8h.html#a6a9e472e14d6768e59d96d245e065397">ucx_logger_error</a>(logger, ...)&#160;&#160;&#160;<a class="el" href="logging_8h.html#aa0245325031d95799b28def177fd14ec">ucx_logger_log</a>(logger, <a class="el" href="logging_8h.html#aa254c07fe3a907613e2256a318d5c9a8">UCX_LOGGER_ERROR</a>, __VA_ARGS__)</td></tr>
+<tr class="memdesc:a6a9e472e14d6768e59d96d245e065397"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shortcut for logging an error message.  <a href="#a6a9e472e14d6768e59d96d245e065397">More...</a><br /></td></tr>
+<tr class="separator:a6a9e472e14d6768e59d96d245e065397"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a98464d8d51376ce2716dcc4eca00d5da"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="logging_8h.html#a98464d8d51376ce2716dcc4eca00d5da">ucx_logger_info</a>(logger, ...)&#160;&#160;&#160;<a class="el" href="logging_8h.html#aa0245325031d95799b28def177fd14ec">ucx_logger_log</a>(logger, <a class="el" href="logging_8h.html#a4b0178bf60a6129373ffc59114ca4c9b">UCX_LOGGER_INFO</a>, __VA_ARGS__)</td></tr>
+<tr class="memdesc:a98464d8d51376ce2716dcc4eca00d5da"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shortcut for logging an information message.  <a href="#a98464d8d51376ce2716dcc4eca00d5da">More...</a><br /></td></tr>
+<tr class="separator:a98464d8d51376ce2716dcc4eca00d5da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aca7bd861b646892813fd7310c0aa69af"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="logging_8h.html#aca7bd861b646892813fd7310c0aa69af">ucx_logger_warn</a>(logger, ...)&#160;&#160;&#160;<a class="el" href="logging_8h.html#aa0245325031d95799b28def177fd14ec">ucx_logger_log</a>(logger, <a class="el" href="logging_8h.html#abd01ca11486226ba34e8f7028d9fffba">UCX_LOGGER_WARN</a>, __VA_ARGS__)</td></tr>
+<tr class="memdesc:aca7bd861b646892813fd7310c0aa69af"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shortcut for logging a warning message.  <a href="#aca7bd861b646892813fd7310c0aa69af">More...</a><br /></td></tr>
+<tr class="separator:aca7bd861b646892813fd7310c0aa69af"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2936402799892db5138e5f1f8c25db0c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="logging_8h.html#a2936402799892db5138e5f1f8c25db0c">ucx_logger_debug</a>(logger, ...)&#160;&#160;&#160;<a class="el" href="logging_8h.html#aa0245325031d95799b28def177fd14ec">ucx_logger_log</a>(logger, <a class="el" href="logging_8h.html#acff01d1ef919ea997cfce755fc1b83d8">UCX_LOGGER_DEBUG</a>, __VA_ARGS__)</td></tr>
+<tr class="memdesc:a2936402799892db5138e5f1f8c25db0c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shortcut for logging a debug message.  <a href="#a2936402799892db5138e5f1f8c25db0c">More...</a><br /></td></tr>
+<tr class="separator:a2936402799892db5138e5f1f8c25db0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3031b7ff13f4cfae9c2916543be2877c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="logging_8h.html#a3031b7ff13f4cfae9c2916543be2877c">ucx_logger_trace</a>(logger, ...)&#160;&#160;&#160;<a class="el" href="logging_8h.html#aa0245325031d95799b28def177fd14ec">ucx_logger_log</a>(logger, <a class="el" href="logging_8h.html#a55b88d1fec7036d841b3ddd6195c5586">UCX_LOGGER_TRACE</a>, __VA_ARGS__)</td></tr>
+<tr class="memdesc:a3031b7ff13f4cfae9c2916543be2877c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shortcut for logging a trace message.  <a href="#a3031b7ff13f4cfae9c2916543be2877c">More...</a><br /></td></tr>
+<tr class="separator:a3031b7ff13f4cfae9c2916543be2877c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac560f8517d2172794c9d2691735ec48c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxLogger.html">UcxLogger</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="logging_8h.html#ac560f8517d2172794c9d2691735ec48c">ucx_logger_new</a> (void *stream, unsigned int level, unsigned int mask)</td></tr>
+<tr class="memdesc:ac560f8517d2172794c9d2691735ec48c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new logger.  <a href="#ac560f8517d2172794c9d2691735ec48c">More...</a><br /></td></tr>
+<tr class="separator:ac560f8517d2172794c9d2691735ec48c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac4697b784e01ec990d2acea192e21658"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="logging_8h.html#ac4697b784e01ec990d2acea192e21658">ucx_logger_free</a> (<a class="el" href="structUcxLogger.html">UcxLogger</a> *logger)</td></tr>
+<tr class="memdesc:ac4697b784e01ec990d2acea192e21658"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys the logger.  <a href="#ac4697b784e01ec990d2acea192e21658">More...</a><br /></td></tr>
+<tr class="separator:ac4697b784e01ec990d2acea192e21658"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac337e5d02ebea565012d4c11bd643801"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="logging_8h.html#ac337e5d02ebea565012d4c11bd643801">ucx_logger_logf</a> (<a class="el" href="structUcxLogger.html">UcxLogger</a> *logger, unsigned int level, const char *file, const unsigned int line, const char *format,...)</td></tr>
+<tr class="memdesc:ac337e5d02ebea565012d4c11bd643801"><td class="mdescLeft">&#160;</td><td class="mdescRight">Internal log function - use macros instead.  <a href="#ac337e5d02ebea565012d4c11bd643801">More...</a><br /></td></tr>
+<tr class="separator:ac337e5d02ebea565012d4c11bd643801"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Logging API. </p>
+<dl class="section author"><dt>Author</dt><dd>Mike Becker, Olaf Wintermann </dd></dl>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="acff01d1ef919ea997cfce755fc1b83d8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acff01d1ef919ea997cfce755fc1b83d8">&#9670;&nbsp;</a></span>UCX_LOGGER_DEBUG</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UCX_LOGGER_DEBUG&#160;&#160;&#160;0x30</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Log level for debug messages. </p>
+
+</div>
+</div>
+<a id="a2936402799892db5138e5f1f8c25db0c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2936402799892db5138e5f1f8c25db0c">&#9670;&nbsp;</a></span>ucx_logger_debug</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_logger_debug</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">logger, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><em>...</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="logging_8h.html#aa0245325031d95799b28def177fd14ec">ucx_logger_log</a>(logger, <a class="el" href="logging_8h.html#acff01d1ef919ea997cfce755fc1b83d8">UCX_LOGGER_DEBUG</a>, __VA_ARGS__)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shortcut for logging a debug message. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">logger</td><td>the logger to use </td></tr>
+    <tr><td class="paramname">...</td><td>format string and arguments </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="logging_8h.html#ac337e5d02ebea565012d4c11bd643801" title="Internal log function - use macros instead. ">ucx_logger_logf()</a> </dd></dl>
+
+</div>
+</div>
+<a id="aa254c07fe3a907613e2256a318d5c9a8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa254c07fe3a907613e2256a318d5c9a8">&#9670;&nbsp;</a></span>UCX_LOGGER_ERROR</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UCX_LOGGER_ERROR&#160;&#160;&#160;0x00</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Log level for error messages. </p>
+
+</div>
+</div>
+<a id="a6a9e472e14d6768e59d96d245e065397"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6a9e472e14d6768e59d96d245e065397">&#9670;&nbsp;</a></span>ucx_logger_error</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_logger_error</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">logger, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><em>...</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="logging_8h.html#aa0245325031d95799b28def177fd14ec">ucx_logger_log</a>(logger, <a class="el" href="logging_8h.html#aa254c07fe3a907613e2256a318d5c9a8">UCX_LOGGER_ERROR</a>, __VA_ARGS__)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shortcut for logging an error message. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">logger</td><td>the logger to use </td></tr>
+    <tr><td class="paramname">...</td><td>format string and arguments </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="logging_8h.html#ac337e5d02ebea565012d4c11bd643801" title="Internal log function - use macros instead. ">ucx_logger_logf()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a4b0178bf60a6129373ffc59114ca4c9b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4b0178bf60a6129373ffc59114ca4c9b">&#9670;&nbsp;</a></span>UCX_LOGGER_INFO</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UCX_LOGGER_INFO&#160;&#160;&#160;0x20</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Log level for information messages. </p>
+
+</div>
+</div>
+<a id="a98464d8d51376ce2716dcc4eca00d5da"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a98464d8d51376ce2716dcc4eca00d5da">&#9670;&nbsp;</a></span>ucx_logger_info</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_logger_info</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">logger, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><em>...</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="logging_8h.html#aa0245325031d95799b28def177fd14ec">ucx_logger_log</a>(logger, <a class="el" href="logging_8h.html#a4b0178bf60a6129373ffc59114ca4c9b">UCX_LOGGER_INFO</a>, __VA_ARGS__)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shortcut for logging an information message. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">logger</td><td>the logger to use </td></tr>
+    <tr><td class="paramname">...</td><td>format string and arguments </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="logging_8h.html#ac337e5d02ebea565012d4c11bd643801" title="Internal log function - use macros instead. ">ucx_logger_logf()</a> </dd></dl>
+
+</div>
+</div>
+<a id="aee18bc20e58ffb69910121512c350839"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aee18bc20e58ffb69910121512c350839">&#9670;&nbsp;</a></span>UCX_LOGGER_LEVEL</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UCX_LOGGER_LEVEL&#160;&#160;&#160;0x01</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Output flag for the log level. </p>
+<p>If this flag is set, the log message will contain the log level. </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="structUcxLogger.html#a1de0db2e02dcf03366268f6943f8b97c" title="A configuration mask for automatic output. ">UcxLogger.mask</a> </dd></dl>
+
+</div>
+</div>
+<a id="aa0245325031d95799b28def177fd14ec"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa0245325031d95799b28def177fd14ec">&#9670;&nbsp;</a></span>ucx_logger_log</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_logger_log</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">logger, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">level, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><em>...</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="logging_8h.html#ac337e5d02ebea565012d4c11bd643801">ucx_logger_logf</a>(logger, level, __FILE__, __LINE__, __VA_ARGS__)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Logs a message at the specified level. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">logger</td><td>the logger to use </td></tr>
+    <tr><td class="paramname">level</td><td>the level to log the message on </td></tr>
+    <tr><td class="paramname">...</td><td>format string and arguments </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="logging_8h.html#ac337e5d02ebea565012d4c11bd643801" title="Internal log function - use macros instead. ">ucx_logger_logf()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a5cffc19502c4c90bfb3bd3bbcd18170a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5cffc19502c4c90bfb3bd3bbcd18170a">&#9670;&nbsp;</a></span>ucx_logger_register_level</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_logger_register_level</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">logger, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">level, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">name&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">{\</div><div class="line">        unsigned <span class="keywordtype">int</span> l; \</div><div class="line">            l = level; \</div><div class="line">            ucx_map_int_put(logger-&gt;levels, l, (<span class="keywordtype">void</span>*) <span class="stringliteral">&quot;[&quot;</span> name <span class="stringliteral">&quot;]&quot;</span>); \</div><div class="line">        } <span class="keywordflow">while</span> (0);</div></div><!-- fragment -->
+<p>Registers a custom log level. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">logger</td><td>the logger </td></tr>
+    <tr><td class="paramname">level</td><td>the log level as unsigned integer </td></tr>
+    <tr><td class="paramname">name</td><td>a string literal describing the level </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a0e0d72b12616c1e49ff8834eaf4cb8a2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0e0d72b12616c1e49ff8834eaf4cb8a2">&#9670;&nbsp;</a></span>UCX_LOGGER_SOURCE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UCX_LOGGER_SOURCE&#160;&#160;&#160;0x04</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Output flag for the source. </p>
+<p>If this flag is set, the log message will contain the source file and line number. </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="structUcxLogger.html#a1de0db2e02dcf03366268f6943f8b97c" title="A configuration mask for automatic output. ">UcxLogger.mask</a> </dd></dl>
+
+</div>
+</div>
+<a id="a38607008268b4f776ee500fb95d2e823"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a38607008268b4f776ee500fb95d2e823">&#9670;&nbsp;</a></span>UCX_LOGGER_TIMESTAMP</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UCX_LOGGER_TIMESTAMP&#160;&#160;&#160;0x02</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Output flag for the timestmap. </p>
+<p>If this flag is set, the log message will contain the timestmap. </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="structUcxLogger.html#a1de0db2e02dcf03366268f6943f8b97c" title="A configuration mask for automatic output. ">UcxLogger.mask</a> </dd></dl>
+
+</div>
+</div>
+<a id="a55b88d1fec7036d841b3ddd6195c5586"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a55b88d1fec7036d841b3ddd6195c5586">&#9670;&nbsp;</a></span>UCX_LOGGER_TRACE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UCX_LOGGER_TRACE&#160;&#160;&#160;0x40</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Log level for trace messages. </p>
+
+</div>
+</div>
+<a id="a3031b7ff13f4cfae9c2916543be2877c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3031b7ff13f4cfae9c2916543be2877c">&#9670;&nbsp;</a></span>ucx_logger_trace</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_logger_trace</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">logger, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><em>...</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="logging_8h.html#aa0245325031d95799b28def177fd14ec">ucx_logger_log</a>(logger, <a class="el" href="logging_8h.html#a55b88d1fec7036d841b3ddd6195c5586">UCX_LOGGER_TRACE</a>, __VA_ARGS__)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shortcut for logging a trace message. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">logger</td><td>the logger to use </td></tr>
+    <tr><td class="paramname">...</td><td>format string and arguments </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="logging_8h.html#ac337e5d02ebea565012d4c11bd643801" title="Internal log function - use macros instead. ">ucx_logger_logf()</a> </dd></dl>
+
+</div>
+</div>
+<a id="abd01ca11486226ba34e8f7028d9fffba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abd01ca11486226ba34e8f7028d9fffba">&#9670;&nbsp;</a></span>UCX_LOGGER_WARN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UCX_LOGGER_WARN&#160;&#160;&#160;0x10</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Log level for warning messages. </p>
+
+</div>
+</div>
+<a id="aca7bd861b646892813fd7310c0aa69af"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aca7bd861b646892813fd7310c0aa69af">&#9670;&nbsp;</a></span>ucx_logger_warn</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_logger_warn</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">logger, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><em>...</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="logging_8h.html#aa0245325031d95799b28def177fd14ec">ucx_logger_log</a>(logger, <a class="el" href="logging_8h.html#abd01ca11486226ba34e8f7028d9fffba">UCX_LOGGER_WARN</a>, __VA_ARGS__)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shortcut for logging a warning message. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">logger</td><td>the logger to use </td></tr>
+    <tr><td class="paramname">...</td><td>format string and arguments </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="logging_8h.html#ac337e5d02ebea565012d4c11bd643801" title="Internal log function - use macros instead. ">ucx_logger_logf()</a> </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ac4697b784e01ec990d2acea192e21658"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac4697b784e01ec990d2acea192e21658">&#9670;&nbsp;</a></span>ucx_logger_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_logger_free </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxLogger.html">UcxLogger</a> *&#160;</td>
+          <td class="paramname"><em>logger</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Destroys the logger. </p>
+<p>The map containing the valid log levels is also automatically destroyed.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">logger</td><td>the logger to destroy </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ac337e5d02ebea565012d4c11bd643801"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac337e5d02ebea565012d4c11bd643801">&#9670;&nbsp;</a></span>ucx_logger_logf()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_logger_logf </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxLogger.html">UcxLogger</a> *&#160;</td>
+          <td class="paramname"><em>logger</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">unsigned int&#160;</td>
+          <td class="paramname"><em>level</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>file</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const unsigned int&#160;</td>
+          <td class="paramname"><em>line</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>format</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><em>...</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Internal log function - use macros instead. </p>
+<p>This function uses the <code>format</code> and variadic arguments for a printf()-style output of the log message.</p>
+<p>Dependent on the <a class="el" href="structUcxLogger.html#a1de0db2e02dcf03366268f6943f8b97c" title="A configuration mask for automatic output. ">UcxLogger.mask</a> some information is prepended. The complete format is:</p>
+<p><code>[LEVEL] [TIMESTAMP] [SOURCEFILE]:[LINENO] message</code></p>
+<p><b>Attention:</b> the message (including automatically generated information) is limited to 4096 characters. The level description is limited to 256 characters and the timestamp string is limited to 128 characters.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">logger</td><td>the logger to use </td></tr>
+    <tr><td class="paramname">level</td><td>the level to log on </td></tr>
+    <tr><td class="paramname">file</td><td>information about the source file </td></tr>
+    <tr><td class="paramname">line</td><td>information about the source line number </td></tr>
+    <tr><td class="paramname">format</td><td>format string </td></tr>
+    <tr><td class="paramname">...</td><td>arguments </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="logging_8h.html#aa0245325031d95799b28def177fd14ec" title="Logs a message at the specified level. ">ucx_logger_log()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ac560f8517d2172794c9d2691735ec48c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac560f8517d2172794c9d2691735ec48c">&#9670;&nbsp;</a></span>ucx_logger_new()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxLogger.html">UcxLogger</a>* ucx_logger_new </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">unsigned int&#160;</td>
+          <td class="paramname"><em>level</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">unsigned int&#160;</td>
+          <td class="paramname"><em>mask</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Creates a new logger. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">stream</td><td>the stream, which the logger shall write to </td></tr>
+    <tr><td class="paramname">level</td><td>the level on which the logger shall operate </td></tr>
+    <tr><td class="paramname">mask</td><td>configuration mask (cf. <a class="el" href="structUcxLogger.html#a1de0db2e02dcf03366268f6943f8b97c" title="A configuration mask for automatic output. ">UcxLogger.mask</a>) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new logger object </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/logging_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,94 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/logging.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">logging.h</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a href="logging_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment"> * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"> * Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment"> * modification, are permitted provided that the following conditions are met:</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> *   1. Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> *   2. Redistributions in binary form must reproduce the above copyright</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer in the</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment"> *      documentation and/or other materials provided with the distribution.</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment"> * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment"> * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment"> * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"> * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment"> * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment"> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment"> * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE</span></div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> * POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;<span class="preprocessor">#ifndef UCX_LOGGING_H</span></div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;<span class="preprocessor">#define UCX_LOGGING_H</span></div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;</div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ucx_8h.html">ucx.h</a>&quot;</span></div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="map_8h.html">map.h</a>&quot;</span></div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="string_8h.html">string.h</a>&quot;</span></div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;<span class="preprocessor">#include &lt;stdio.h&gt;</span></div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;</div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;</div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;<span class="comment">/* leave enough space for custom log levels */</span></div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;</div><div class="line"><a name="l00049"></a><span class="lineno"><a class="line" href="logging_8h.html#aa254c07fe3a907613e2256a318d5c9a8">   49</a></span>&#160;<span class="preprocessor">#define UCX_LOGGER_ERROR        0x00</span></div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;    </div><div class="line"><a name="l00052"></a><span class="lineno"><a class="line" href="logging_8h.html#abd01ca11486226ba34e8f7028d9fffba">   52</a></span>&#160;<span class="preprocessor">#define UCX_LOGGER_WARN         0x10</span></div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;</div><div class="line"><a name="l00055"></a><span class="lineno"><a class="line" href="logging_8h.html#a4b0178bf60a6129373ffc59114ca4c9b">   55</a></span>&#160;<span class="preprocessor">#define UCX_LOGGER_INFO         0x20</span></div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;</div><div class="line"><a name="l00058"></a><span class="lineno"><a class="line" href="logging_8h.html#acff01d1ef919ea997cfce755fc1b83d8">   58</a></span>&#160;<span class="preprocessor">#define UCX_LOGGER_DEBUG        0x30</span></div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;</div><div class="line"><a name="l00061"></a><span class="lineno"><a class="line" href="logging_8h.html#a55b88d1fec7036d841b3ddd6195c5586">   61</a></span>&#160;<span class="preprocessor">#define UCX_LOGGER_TRACE        0x40</span></div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;</div><div class="line"><a name="l00068"></a><span class="lineno"><a class="line" href="logging_8h.html#aee18bc20e58ffb69910121512c350839">   68</a></span>&#160;<span class="preprocessor">#define UCX_LOGGER_LEVEL        0x01</span></div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;</div><div class="line"><a name="l00075"></a><span class="lineno"><a class="line" href="logging_8h.html#a38607008268b4f776ee500fb95d2e823">   75</a></span>&#160;<span class="preprocessor">#define UCX_LOGGER_TIMESTAMP    0x02</span></div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;</div><div class="line"><a name="l00083"></a><span class="lineno"><a class="line" href="logging_8h.html#a0e0d72b12616c1e49ff8834eaf4cb8a2">   83</a></span>&#160;<span class="preprocessor">#define UCX_LOGGER_SOURCE       0x04</span></div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;</div><div class="line"><a name="l00088"></a><span class="lineno"><a class="line" href="structUcxLogger.html">   88</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span>{</div><div class="line"><a name="l00090"></a><span class="lineno"><a class="line" href="structUcxLogger.html#a33fddf4791e8d49e479ecc78bf5d1b9e">   90</a></span>&#160;    <span class="keywordtype">void</span> *<a class="code" href="structUcxLogger.html#a33fddf4791e8d49e479ecc78bf5d1b9e">stream</a>;</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;</div><div class="line"><a name="l00097"></a><span class="lineno"><a class="line" href="structUcxLogger.html#ada13bba090a9dc4f8d6cd9be73c60930">   97</a></span>&#160;    <a class="code" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a> <a class="code" href="structUcxLogger.html#ada13bba090a9dc4f8d6cd9be73c60930">writer</a>;</div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;</div><div class="line"><a name="l00104"></a><span class="lineno"><a class="line" href="structUcxLogger.html#a086f75df0f6c81ec491f25c0a4d9262b">  104</a></span>&#160;    <span class="keywordtype">char</span> *<a class="code" href="structUcxLogger.html#a086f75df0f6c81ec491f25c0a4d9262b">dateformat</a>;</div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;</div><div class="line"><a name="l00111"></a><span class="lineno"><a class="line" href="structUcxLogger.html#a2e0ee94c25b2307096c7970280d189cd">  111</a></span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structUcxLogger.html#a2e0ee94c25b2307096c7970280d189cd">level</a>;</div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;</div><div class="line"><a name="l00119"></a><span class="lineno"><a class="line" href="structUcxLogger.html#a1de0db2e02dcf03366268f6943f8b97c">  119</a></span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structUcxLogger.html#a1de0db2e02dcf03366268f6943f8b97c">mask</a>;</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;</div><div class="line"><a name="l00132"></a><span class="lineno"><a class="line" href="structUcxLogger.html#a187129f7bc6e5064b3d92a5f1217f396">  132</a></span>&#160;    <a class="code" href="structUcxMap.html">UcxMap</a>* <a class="code" href="structUcxLogger.html#a187129f7bc6e5064b3d92a5f1217f396">levels</a>;</div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;} <a class="code" href="structUcxLogger.html">UcxLogger</a>;</div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;</div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;<a class="code" href="structUcxLogger.html">UcxLogger</a> *<a class="code" href="logging_8h.html#ac560f8517d2172794c9d2691735ec48c">ucx_logger_new</a>(<span class="keywordtype">void</span> *stream, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> level, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> mask);</div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;<span class="keywordtype">void</span> <a class="code" href="logging_8h.html#ac4697b784e01ec990d2acea192e21658">ucx_logger_free</a>(<a class="code" href="structUcxLogger.html">UcxLogger</a>* logger);</div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;</div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;<span class="keywordtype">void</span> <a class="code" href="logging_8h.html#ac337e5d02ebea565012d4c11bd643801">ucx_logger_logf</a>(<a class="code" href="structUcxLogger.html">UcxLogger</a> *logger, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> level, <span class="keyword">const</span> <span class="keywordtype">char</span>* file,</div><div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> line, <span class="keyword">const</span> <span class="keywordtype">char</span>* format, ...);</div><div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;</div><div class="line"><a name="l00185"></a><span class="lineno"><a class="line" href="logging_8h.html#a5cffc19502c4c90bfb3bd3bbcd18170a">  185</a></span>&#160;<span class="preprocessor">#define ucx_logger_register_level(logger, level, name) {\</span></div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;<span class="preprocessor">        unsigned int l; \</span></div><div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;<span class="preprocessor">            l = level; \</span></div><div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;<span class="preprocessor">            ucx_map_int_put(logger-&gt;levels, l, (void*) &quot;[&quot; name &quot;]&quot;); \</span></div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;<span class="preprocessor">        } while (0);</span></div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;</div><div class="line"><a name="l00198"></a><span class="lineno"><a class="line" href="logging_8h.html#aa0245325031d95799b28def177fd14ec">  198</a></span>&#160;<span class="preprocessor">#define ucx_logger_log(logger, level, ...) \</span></div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;<span class="preprocessor">    ucx_logger_logf(logger, level, __FILE__, __LINE__, __VA_ARGS__)</span></div><div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;</div><div class="line"><a name="l00207"></a><span class="lineno"><a class="line" href="logging_8h.html#a6a9e472e14d6768e59d96d245e065397">  207</a></span>&#160;<span class="preprocessor">#define ucx_logger_error(logger, ...) \</span></div><div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;<span class="preprocessor">    ucx_logger_log(logger, UCX_LOGGER_ERROR, __VA_ARGS__)</span></div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;</div><div class="line"><a name="l00216"></a><span class="lineno"><a class="line" href="logging_8h.html#a98464d8d51376ce2716dcc4eca00d5da">  216</a></span>&#160;<span class="preprocessor">#define ucx_logger_info(logger, ...) \</span></div><div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;<span class="preprocessor">    ucx_logger_log(logger, UCX_LOGGER_INFO, __VA_ARGS__)</span></div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;</div><div class="line"><a name="l00225"></a><span class="lineno"><a class="line" href="logging_8h.html#aca7bd861b646892813fd7310c0aa69af">  225</a></span>&#160;<span class="preprocessor">#define ucx_logger_warn(logger, ...) \</span></div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;<span class="preprocessor">    ucx_logger_log(logger, UCX_LOGGER_WARN, __VA_ARGS__)</span></div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;</div><div class="line"><a name="l00234"></a><span class="lineno"><a class="line" href="logging_8h.html#a2936402799892db5138e5f1f8c25db0c">  234</a></span>&#160;<span class="preprocessor">#define ucx_logger_debug(logger, ...) \</span></div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;<span class="preprocessor">    ucx_logger_log(logger, UCX_LOGGER_DEBUG, __VA_ARGS__)</span></div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;</div><div class="line"><a name="l00243"></a><span class="lineno"><a class="line" href="logging_8h.html#a3031b7ff13f4cfae9c2916543be2877c">  243</a></span>&#160;<span class="preprocessor">#define ucx_logger_trace(logger, ...) \</span></div><div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;<span class="preprocessor">    ucx_logger_log(logger, UCX_LOGGER_TRACE, __VA_ARGS__)</span></div><div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;</div><div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;}</div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;</div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* UCX_LOGGING_H */</span><span class="preprocessor"></span></div><div class="ttc" id="structUcxLogger_html_ada13bba090a9dc4f8d6cd9be73c60930"><div class="ttname"><a href="structUcxLogger.html#ada13bba090a9dc4f8d6cd9be73c60930">UcxLogger::writer</a></div><div class="ttdeci">write_func writer</div><div class="ttdoc">The write function that shall be used. </div><div class="ttdef"><b>Definition:</b> logging.h:97</div></div>
+<div class="ttc" id="string_8h_html"><div class="ttname"><a href="string_8h.html">string.h</a></div><div class="ttdoc">Bounded string implementation. </div></div>
+<div class="ttc" id="ucx_8h_html"><div class="ttname"><a href="ucx_8h.html">ucx.h</a></div><div class="ttdoc">Main UCX Header providing most common definitions. </div></div>
+<div class="ttc" id="structUcxLogger_html"><div class="ttname"><a href="structUcxLogger.html">UcxLogger</a></div><div class="ttdoc">The UCX Logger object. </div><div class="ttdef"><b>Definition:</b> logging.h:88</div></div>
+<div class="ttc" id="structUcxLogger_html_a086f75df0f6c81ec491f25c0a4d9262b"><div class="ttname"><a href="structUcxLogger.html#a086f75df0f6c81ec491f25c0a4d9262b">UcxLogger::dateformat</a></div><div class="ttdeci">char * dateformat</div><div class="ttdoc">The date format for timestamp outputs including the delimiter (default: &quot;%F %T %z &quot;)...</div><div class="ttdef"><b>Definition:</b> logging.h:104</div></div>
+<div class="ttc" id="structUcxLogger_html_a1de0db2e02dcf03366268f6943f8b97c"><div class="ttname"><a href="structUcxLogger.html#a1de0db2e02dcf03366268f6943f8b97c">UcxLogger::mask</a></div><div class="ttdeci">unsigned int mask</div><div class="ttdoc">A configuration mask for automatic output. </div><div class="ttdef"><b>Definition:</b> logging.h:119</div></div>
+<div class="ttc" id="logging_8h_html_ac560f8517d2172794c9d2691735ec48c"><div class="ttname"><a href="logging_8h.html#ac560f8517d2172794c9d2691735ec48c">ucx_logger_new</a></div><div class="ttdeci">UcxLogger * ucx_logger_new(void *stream, unsigned int level, unsigned int mask)</div><div class="ttdoc">Creates a new logger. </div><div class="ttdef"><b>Definition:</b> logging.c:36</div></div>
+<div class="ttc" id="structUcxLogger_html_a33fddf4791e8d49e479ecc78bf5d1b9e"><div class="ttname"><a href="structUcxLogger.html#a33fddf4791e8d49e479ecc78bf5d1b9e">UcxLogger::stream</a></div><div class="ttdeci">void * stream</div><div class="ttdoc">The stream this logger writes its messages to. </div><div class="ttdef"><b>Definition:</b> logging.h:90</div></div>
+<div class="ttc" id="structUcxMap_html"><div class="ttname"><a href="structUcxMap.html">UcxMap</a></div><div class="ttdoc">Structure for the UCX map. </div><div class="ttdef"><b>Definition:</b> map.h:81</div></div>
+<div class="ttc" id="map_8h_html"><div class="ttname"><a href="map_8h.html">map.h</a></div><div class="ttdoc">Hash map implementation. </div></div>
+<div class="ttc" id="ucx_8h_html_a989b3f0fa4d307d278378fde435641ed"><div class="ttname"><a href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a></div><div class="ttdeci">size_t(* write_func)(const void *, size_t, size_t, void *)</div><div class="ttdoc">Function pointer to a write function. </div><div class="ttdef"><b>Definition:</b> ucx.h:119</div></div>
+<div class="ttc" id="structUcxLogger_html_a187129f7bc6e5064b3d92a5f1217f396"><div class="ttname"><a href="structUcxLogger.html#a187129f7bc6e5064b3d92a5f1217f396">UcxLogger::levels</a></div><div class="ttdeci">UcxMap * levels</div><div class="ttdoc">A map of valid log levels for this logger. </div><div class="ttdef"><b>Definition:</b> logging.h:132</div></div>
+<div class="ttc" id="structUcxLogger_html_a2e0ee94c25b2307096c7970280d189cd"><div class="ttname"><a href="structUcxLogger.html#a2e0ee94c25b2307096c7970280d189cd">UcxLogger::level</a></div><div class="ttdeci">unsigned int level</div><div class="ttdoc">The level, this logger operates on. </div><div class="ttdef"><b>Definition:</b> logging.h:111</div></div>
+<div class="ttc" id="logging_8h_html_ac337e5d02ebea565012d4c11bd643801"><div class="ttname"><a href="logging_8h.html#ac337e5d02ebea565012d4c11bd643801">ucx_logger_logf</a></div><div class="ttdeci">void ucx_logger_logf(UcxLogger *logger, unsigned int level, const char *file, const unsigned int line, const char *format,...)</div><div class="ttdoc">Internal log function - use macros instead. </div><div class="ttdef"><b>Definition:</b> logging.c:70</div></div>
+<div class="ttc" id="logging_8h_html_ac4697b784e01ec990d2acea192e21658"><div class="ttname"><a href="logging_8h.html#ac4697b784e01ec990d2acea192e21658">ucx_logger_free</a></div><div class="ttdeci">void ucx_logger_free(UcxLogger *logger)</div><div class="ttdoc">Destroys the logger. </div><div class="ttdef"><b>Definition:</b> logging.c:62</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/map_8h.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,1689 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/map.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a> &#124;
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">map.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Hash map implementation.  
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="string_8h_source.html">string.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="allocator_8h_source.html">allocator.h</a>&quot;</code><br />
+<code>#include &lt;stdio.h&gt;</code><br />
+</div>
+<p><a href="map_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxMap.html">UcxMap</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Structure for the UCX map.  <a href="structUcxMap.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxKey.html">UcxKey</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Structure to publicly denote a key of a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>.  <a href="structUcxKey.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxMapKey.html">UcxMapKey</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Internal structure for a key of a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>.  <a href="structUcxMapKey.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxMapElement.html">UcxMapElement</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Structure for an element of a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>.  <a href="structUcxMapElement.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxMapIterator.html">UcxMapIterator</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Structure for an iterator over a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>.  <a href="structUcxMapIterator.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a940896c4aa1b13e54c55c04c3efc186b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#a940896c4aa1b13e54c55c04c3efc186b">UCX_MAP_FOREACH</a>(key,  value,  iter)&#160;&#160;&#160;for(<a class="el" href="structUcxKey.html">UcxKey</a> key;<a class="el" href="map_8h.html#aceb8675abf44860b4bbc301bbada5b91">ucx_map_iter_next</a>(&amp;iter,&amp;key, (void**)&amp;value);)</td></tr>
+<tr class="memdesc:a940896c4aa1b13e54c55c04c3efc186b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Loop statement for UCX maps.  <a href="#a940896c4aa1b13e54c55c04c3efc186b">More...</a><br /></td></tr>
+<tr class="separator:a940896c4aa1b13e54c55c04c3efc186b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac26a8615bfc8f47ee9eaceb47645f98e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#ac26a8615bfc8f47ee9eaceb47645f98e">ucx_map_sstr_put</a>(map,  key,  value)&#160;&#160;&#160;<a class="el" href="map_8h.html#ac04a08b604217070254d4c58f0e82498">ucx_map_put</a>(map, <a class="el" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">ucx_key</a>(key.ptr, key.length), (void*)value)</td></tr>
+<tr class="memdesc:ac26a8615bfc8f47ee9eaceb47645f98e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shorthand for putting data with a <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> key into the map.  <a href="#ac26a8615bfc8f47ee9eaceb47645f98e">More...</a><br /></td></tr>
+<tr class="separator:ac26a8615bfc8f47ee9eaceb47645f98e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad9356b01425b934ab237b52339ac0cc3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#ad9356b01425b934ab237b52339ac0cc3">ucx_map_cstr_put</a>(map,  key,  value)&#160;&#160;&#160;<a class="el" href="map_8h.html#ac04a08b604217070254d4c58f0e82498">ucx_map_put</a>(map, <a class="el" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">ucx_key</a>(key, strlen(key)), (void*)value)</td></tr>
+<tr class="memdesc:ad9356b01425b934ab237b52339ac0cc3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shorthand for putting data with a C string key into the map.  <a href="#ad9356b01425b934ab237b52339ac0cc3">More...</a><br /></td></tr>
+<tr class="separator:ad9356b01425b934ab237b52339ac0cc3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaa30af79b4068c923895619e83f44367"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#aaa30af79b4068c923895619e83f44367">ucx_map_int_put</a>(map,  key,  value)&#160;&#160;&#160;<a class="el" href="map_8h.html#ac04a08b604217070254d4c58f0e82498">ucx_map_put</a>(map, <a class="el" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">ucx_key</a>(&amp;key, sizeof(key)), (void*)value)</td></tr>
+<tr class="memdesc:aaa30af79b4068c923895619e83f44367"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shorthand for putting data with an integer key into the map.  <a href="#aaa30af79b4068c923895619e83f44367">More...</a><br /></td></tr>
+<tr class="separator:aaa30af79b4068c923895619e83f44367"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a14d385f6b7f371f0507861cabd2eab4e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#a14d385f6b7f371f0507861cabd2eab4e">ucx_map_sstr_get</a>(map,  key)&#160;&#160;&#160;<a class="el" href="map_8h.html#ab61192c5af2e06ecb9ad73880d1c95a6">ucx_map_get</a>(map, <a class="el" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">ucx_key</a>(key.ptr, key.length))</td></tr>
+<tr class="memdesc:a14d385f6b7f371f0507861cabd2eab4e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shorthand for getting data from the map with a <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> key.  <a href="#a14d385f6b7f371f0507861cabd2eab4e">More...</a><br /></td></tr>
+<tr class="separator:a14d385f6b7f371f0507861cabd2eab4e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a64e1fb55498fa502dd2ed8ed69062cdd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#a64e1fb55498fa502dd2ed8ed69062cdd">ucx_map_cstr_get</a>(map,  key)&#160;&#160;&#160;<a class="el" href="map_8h.html#ab61192c5af2e06ecb9ad73880d1c95a6">ucx_map_get</a>(map, <a class="el" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">ucx_key</a>(key, strlen(key)))</td></tr>
+<tr class="memdesc:a64e1fb55498fa502dd2ed8ed69062cdd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shorthand for getting data from the map with a C string key.  <a href="#a64e1fb55498fa502dd2ed8ed69062cdd">More...</a><br /></td></tr>
+<tr class="separator:a64e1fb55498fa502dd2ed8ed69062cdd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa1681bd2178553cd092fd24c4d681d3c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#aa1681bd2178553cd092fd24c4d681d3c">ucx_map_int_get</a>(map,  key)&#160;&#160;&#160;<a class="el" href="map_8h.html#ab61192c5af2e06ecb9ad73880d1c95a6">ucx_map_get</a>(map, <a class="el" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">ucx_key</a>(&amp;key, sizeof(int)))</td></tr>
+<tr class="memdesc:aa1681bd2178553cd092fd24c4d681d3c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shorthand for getting data from the map with an integer key.  <a href="#aa1681bd2178553cd092fd24c4d681d3c">More...</a><br /></td></tr>
+<tr class="separator:aa1681bd2178553cd092fd24c4d681d3c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a48700ea86fadb9ea54d13010f9124df2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#a48700ea86fadb9ea54d13010f9124df2">ucx_map_sstr_remove</a>(map,  key)&#160;&#160;&#160;<a class="el" href="map_8h.html#a17248a4888eb8f9ae18be522d64632aa">ucx_map_remove</a>(map, <a class="el" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">ucx_key</a>(key.ptr, key.length))</td></tr>
+<tr class="memdesc:a48700ea86fadb9ea54d13010f9124df2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shorthand for removing data from the map with a <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> key.  <a href="#a48700ea86fadb9ea54d13010f9124df2">More...</a><br /></td></tr>
+<tr class="separator:a48700ea86fadb9ea54d13010f9124df2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9c4405a5a75ecf64e2ef3d0c6501a9fe"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#a9c4405a5a75ecf64e2ef3d0c6501a9fe">ucx_map_cstr_remove</a>(map,  key)&#160;&#160;&#160;<a class="el" href="map_8h.html#a17248a4888eb8f9ae18be522d64632aa">ucx_map_remove</a>(map, <a class="el" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">ucx_key</a>(key, strlen(key)))</td></tr>
+<tr class="memdesc:a9c4405a5a75ecf64e2ef3d0c6501a9fe"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shorthand for removing data from the map with a C string key.  <a href="#a9c4405a5a75ecf64e2ef3d0c6501a9fe">More...</a><br /></td></tr>
+<tr class="separator:a9c4405a5a75ecf64e2ef3d0c6501a9fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa767958b5468737755c09f7185b1770c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#aa767958b5468737755c09f7185b1770c">ucx_map_int_remove</a>(map,  key)&#160;&#160;&#160;<a class="el" href="map_8h.html#a17248a4888eb8f9ae18be522d64632aa">ucx_map_remove</a>(map, <a class="el" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">ucx_key</a>(&amp;key, sizeof(key)))</td></tr>
+<tr class="memdesc:aa767958b5468737755c09f7185b1770c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shorthand for removing data from the map with an integer key.  <a href="#aa767958b5468737755c09f7185b1770c">More...</a><br /></td></tr>
+<tr class="separator:aa767958b5468737755c09f7185b1770c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:a18e21948725b2da68c35da587a722033"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structUcxMap.html">UcxMap</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#a18e21948725b2da68c35da587a722033">UcxMap</a></td></tr>
+<tr class="memdesc:a18e21948725b2da68c35da587a722033"><td class="mdescLeft">&#160;</td><td class="mdescRight">Type for the UCX map.  <a href="#a18e21948725b2da68c35da587a722033">More...</a><br /></td></tr>
+<tr class="separator:a18e21948725b2da68c35da587a722033"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad63828bb23123fc01a5315a2bac3b142"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structUcxKey.html">UcxKey</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#ad63828bb23123fc01a5315a2bac3b142">UcxKey</a></td></tr>
+<tr class="memdesc:ad63828bb23123fc01a5315a2bac3b142"><td class="mdescLeft">&#160;</td><td class="mdescRight">Type for a key of a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>.  <a href="#ad63828bb23123fc01a5315a2bac3b142">More...</a><br /></td></tr>
+<tr class="separator:ad63828bb23123fc01a5315a2bac3b142"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad7d7a910a32113eb93eae11c3dc97b4b"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structUcxMapElement.html">UcxMapElement</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#ad7d7a910a32113eb93eae11c3dc97b4b">UcxMapElement</a></td></tr>
+<tr class="memdesc:ad7d7a910a32113eb93eae11c3dc97b4b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Type for an element of a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>.  <a href="#ad7d7a910a32113eb93eae11c3dc97b4b">More...</a><br /></td></tr>
+<tr class="separator:ad7d7a910a32113eb93eae11c3dc97b4b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae36aff5f645948c54f51578b11fd87fb"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structUcxMapIterator.html">UcxMapIterator</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#ae36aff5f645948c54f51578b11fd87fb">UcxMapIterator</a></td></tr>
+<tr class="memdesc:ae36aff5f645948c54f51578b11fd87fb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Type for an iterator over a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>.  <a href="#ae36aff5f645948c54f51578b11fd87fb">More...</a><br /></td></tr>
+<tr class="separator:ae36aff5f645948c54f51578b11fd87fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a79f31de8b93814493759dbc8b940cf0c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#a79f31de8b93814493759dbc8b940cf0c">ucx_map_new</a> (size_t size)</td></tr>
+<tr class="memdesc:a79f31de8b93814493759dbc8b940cf0c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new hash map with the specified size.  <a href="#a79f31de8b93814493759dbc8b940cf0c">More...</a><br /></td></tr>
+<tr class="separator:a79f31de8b93814493759dbc8b940cf0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aed508a94c66cc15372503c64b70eb03e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#aed508a94c66cc15372503c64b70eb03e">ucx_map_new_a</a> (<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *allocator, size_t size)</td></tr>
+<tr class="memdesc:aed508a94c66cc15372503c64b70eb03e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new hash map with the specified size using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>.  <a href="#aed508a94c66cc15372503c64b70eb03e">More...</a><br /></td></tr>
+<tr class="separator:aed508a94c66cc15372503c64b70eb03e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abe3d9688e4224bf7bb962abf25ff8c2e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#abe3d9688e4224bf7bb962abf25ff8c2e">ucx_map_free</a> (<a class="el" href="structUcxMap.html">UcxMap</a> *map)</td></tr>
+<tr class="memdesc:abe3d9688e4224bf7bb962abf25ff8c2e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Frees a hash map.  <a href="#abe3d9688e4224bf7bb962abf25ff8c2e">More...</a><br /></td></tr>
+<tr class="separator:abe3d9688e4224bf7bb962abf25ff8c2e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a750f3d9d83e2f3788a14c17a9d160618"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#a750f3d9d83e2f3788a14c17a9d160618">ucx_map_free_content</a> (<a class="el" href="structUcxMap.html">UcxMap</a> *map, <a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a> destr)</td></tr>
+<tr class="memdesc:a750f3d9d83e2f3788a14c17a9d160618"><td class="mdescLeft">&#160;</td><td class="mdescRight">Frees the contents of a hash map.  <a href="#a750f3d9d83e2f3788a14c17a9d160618">More...</a><br /></td></tr>
+<tr class="separator:a750f3d9d83e2f3788a14c17a9d160618"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a285e90e40681c6d9631c935dda0967f2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#a285e90e40681c6d9631c935dda0967f2">ucx_map_clear</a> (<a class="el" href="structUcxMap.html">UcxMap</a> *map)</td></tr>
+<tr class="memdesc:a285e90e40681c6d9631c935dda0967f2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Clears a hash map.  <a href="#a285e90e40681c6d9631c935dda0967f2">More...</a><br /></td></tr>
+<tr class="separator:a285e90e40681c6d9631c935dda0967f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adfeb2d61003fd2896bcfdc9a57f36425"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#adfeb2d61003fd2896bcfdc9a57f36425">ucx_map_copy</a> (<a class="el" href="structUcxMap.html">UcxMap</a> const *from, <a class="el" href="structUcxMap.html">UcxMap</a> *to, <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> fnc, void *data)</td></tr>
+<tr class="memdesc:adfeb2d61003fd2896bcfdc9a57f36425"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copies contents from a map to another map using a copy function.  <a href="#adfeb2d61003fd2896bcfdc9a57f36425">More...</a><br /></td></tr>
+<tr class="separator:adfeb2d61003fd2896bcfdc9a57f36425"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a62c6c30cbb0d824ba710f5030ff9a4e4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#a62c6c30cbb0d824ba710f5030ff9a4e4">ucx_map_clone</a> (<a class="el" href="structUcxMap.html">UcxMap</a> const *map, <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> fnc, void *data)</td></tr>
+<tr class="memdesc:a62c6c30cbb0d824ba710f5030ff9a4e4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Clones the map and rehashes if necessary.  <a href="#a62c6c30cbb0d824ba710f5030ff9a4e4">More...</a><br /></td></tr>
+<tr class="separator:a62c6c30cbb0d824ba710f5030ff9a4e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9aea9103703d5c168420bb6bf85549ea"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#a9aea9103703d5c168420bb6bf85549ea">ucx_map_clone_a</a> (<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *allocator, <a class="el" href="structUcxMap.html">UcxMap</a> const *map, <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> fnc, void *data)</td></tr>
+<tr class="memdesc:a9aea9103703d5c168420bb6bf85549ea"><td class="mdescLeft">&#160;</td><td class="mdescRight">Clones the map and rehashes if necessary.  <a href="#a9aea9103703d5c168420bb6bf85549ea">More...</a><br /></td></tr>
+<tr class="separator:a9aea9103703d5c168420bb6bf85549ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a174bce9fad554dd92b8da354e0d32512"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#a174bce9fad554dd92b8da354e0d32512">ucx_map_rehash</a> (<a class="el" href="structUcxMap.html">UcxMap</a> *map)</td></tr>
+<tr class="memdesc:a174bce9fad554dd92b8da354e0d32512"><td class="mdescLeft">&#160;</td><td class="mdescRight">Increases size of the hash map, if necessary.  <a href="#a174bce9fad554dd92b8da354e0d32512">More...</a><br /></td></tr>
+<tr class="separator:a174bce9fad554dd92b8da354e0d32512"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac04a08b604217070254d4c58f0e82498"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#ac04a08b604217070254d4c58f0e82498">ucx_map_put</a> (<a class="el" href="structUcxMap.html">UcxMap</a> *map, <a class="el" href="structUcxKey.html">UcxKey</a> key, void *value)</td></tr>
+<tr class="memdesc:ac04a08b604217070254d4c58f0e82498"><td class="mdescLeft">&#160;</td><td class="mdescRight">Puts a key/value-pair into the map.  <a href="#ac04a08b604217070254d4c58f0e82498">More...</a><br /></td></tr>
+<tr class="separator:ac04a08b604217070254d4c58f0e82498"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab61192c5af2e06ecb9ad73880d1c95a6"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#ab61192c5af2e06ecb9ad73880d1c95a6">ucx_map_get</a> (<a class="el" href="structUcxMap.html">UcxMap</a> const *map, <a class="el" href="structUcxKey.html">UcxKey</a> key)</td></tr>
+<tr class="memdesc:ab61192c5af2e06ecb9ad73880d1c95a6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves a value by using a key.  <a href="#ab61192c5af2e06ecb9ad73880d1c95a6">More...</a><br /></td></tr>
+<tr class="separator:ab61192c5af2e06ecb9ad73880d1c95a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a17248a4888eb8f9ae18be522d64632aa"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#a17248a4888eb8f9ae18be522d64632aa">ucx_map_remove</a> (<a class="el" href="structUcxMap.html">UcxMap</a> *map, <a class="el" href="structUcxKey.html">UcxKey</a> key)</td></tr>
+<tr class="memdesc:a17248a4888eb8f9ae18be522d64632aa"><td class="mdescLeft">&#160;</td><td class="mdescRight">Removes a key/value-pair from the map by using the key.  <a href="#a17248a4888eb8f9ae18be522d64632aa">More...</a><br /></td></tr>
+<tr class="separator:a17248a4888eb8f9ae18be522d64632aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3e540bb46b8ee19789aed63fd8919200"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxKey.html">UcxKey</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">ucx_key</a> (const void *data, size_t len)</td></tr>
+<tr class="memdesc:a3e540bb46b8ee19789aed63fd8919200"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a <a class="el" href="structUcxKey.html" title="Structure to publicly denote a key of a UcxMap. ">UcxKey</a> based on the given data.  <a href="#a3e540bb46b8ee19789aed63fd8919200">More...</a><br /></td></tr>
+<tr class="separator:a3e540bb46b8ee19789aed63fd8919200"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aea3be97254c05595d986ef6a9faae87b"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#aea3be97254c05595d986ef6a9faae87b">ucx_hash</a> (const char *data, size_t len)</td></tr>
+<tr class="memdesc:aea3be97254c05595d986ef6a9faae87b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes a murmur hash-2.  <a href="#aea3be97254c05595d986ef6a9faae87b">More...</a><br /></td></tr>
+<tr class="separator:aea3be97254c05595d986ef6a9faae87b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9150e9c64fdf4dfcc2cad106b91aa110"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxMapIterator.html">UcxMapIterator</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#a9150e9c64fdf4dfcc2cad106b91aa110">ucx_map_iterator</a> (<a class="el" href="structUcxMap.html">UcxMap</a> const *map)</td></tr>
+<tr class="memdesc:a9150e9c64fdf4dfcc2cad106b91aa110"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates an iterator for a map.  <a href="#a9150e9c64fdf4dfcc2cad106b91aa110">More...</a><br /></td></tr>
+<tr class="separator:a9150e9c64fdf4dfcc2cad106b91aa110"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aceb8675abf44860b4bbc301bbada5b91"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#aceb8675abf44860b4bbc301bbada5b91">ucx_map_iter_next</a> (<a class="el" href="structUcxMapIterator.html">UcxMapIterator</a> *iterator, <a class="el" href="structUcxKey.html">UcxKey</a> *key, void **value)</td></tr>
+<tr class="memdesc:aceb8675abf44860b4bbc301bbada5b91"><td class="mdescLeft">&#160;</td><td class="mdescRight">Proceeds to the next element of the map (if any).  <a href="#aceb8675abf44860b4bbc301bbada5b91">More...</a><br /></td></tr>
+<tr class="separator:aceb8675abf44860b4bbc301bbada5b91"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3f65978c481af7f637cad021d93522d5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#a3f65978c481af7f637cad021d93522d5">ucx_map_union</a> (const <a class="el" href="structUcxMap.html">UcxMap</a> *first, const <a class="el" href="structUcxMap.html">UcxMap</a> *second, <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, void *cpdata)</td></tr>
+<tr class="memdesc:a3f65978c481af7f637cad021d93522d5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the union of two maps.  <a href="#a3f65978c481af7f637cad021d93522d5">More...</a><br /></td></tr>
+<tr class="separator:a3f65978c481af7f637cad021d93522d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab6370c3fa8113fdad593ce4b0460c9c6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#ab6370c3fa8113fdad593ce4b0460c9c6">ucx_map_union_a</a> (<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *allocator, const <a class="el" href="structUcxMap.html">UcxMap</a> *first, const <a class="el" href="structUcxMap.html">UcxMap</a> *second, <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, void *cpdata)</td></tr>
+<tr class="memdesc:ab6370c3fa8113fdad593ce4b0460c9c6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the union of two maps.  <a href="#ab6370c3fa8113fdad593ce4b0460c9c6">More...</a><br /></td></tr>
+<tr class="separator:ab6370c3fa8113fdad593ce4b0460c9c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa594d7a5afebc3bed6bb265348cf6b0d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#aa594d7a5afebc3bed6bb265348cf6b0d">ucx_map_intersection</a> (const <a class="el" href="structUcxMap.html">UcxMap</a> *first, const <a class="el" href="structUcxMap.html">UcxMap</a> *second, <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, void *cpdata)</td></tr>
+<tr class="memdesc:aa594d7a5afebc3bed6bb265348cf6b0d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the intersection of two maps.  <a href="#aa594d7a5afebc3bed6bb265348cf6b0d">More...</a><br /></td></tr>
+<tr class="separator:aa594d7a5afebc3bed6bb265348cf6b0d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a169e0470a20484dd76425fdf77e3651e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#a169e0470a20484dd76425fdf77e3651e">ucx_map_intersection_a</a> (<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *allocator, const <a class="el" href="structUcxMap.html">UcxMap</a> *first, const <a class="el" href="structUcxMap.html">UcxMap</a> *second, <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, void *cpdata)</td></tr>
+<tr class="memdesc:a169e0470a20484dd76425fdf77e3651e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the intersection of two maps.  <a href="#a169e0470a20484dd76425fdf77e3651e">More...</a><br /></td></tr>
+<tr class="separator:a169e0470a20484dd76425fdf77e3651e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a774fcff87d1e58b6c5af77dd19a8c3dc"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#a774fcff87d1e58b6c5af77dd19a8c3dc">ucx_map_difference</a> (const <a class="el" href="structUcxMap.html">UcxMap</a> *first, const <a class="el" href="structUcxMap.html">UcxMap</a> *second, <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, void *cpdata)</td></tr>
+<tr class="memdesc:a774fcff87d1e58b6c5af77dd19a8c3dc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the difference of two maps.  <a href="#a774fcff87d1e58b6c5af77dd19a8c3dc">More...</a><br /></td></tr>
+<tr class="separator:a774fcff87d1e58b6c5af77dd19a8c3dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad0ba103494247d798ac3037c50fc8831"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="map_8h.html#ad0ba103494247d798ac3037c50fc8831">ucx_map_difference_a</a> (<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *allocator, const <a class="el" href="structUcxMap.html">UcxMap</a> *first, const <a class="el" href="structUcxMap.html">UcxMap</a> *second, <a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, void *cpdata)</td></tr>
+<tr class="memdesc:ad0ba103494247d798ac3037c50fc8831"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the difference of two maps.  <a href="#ad0ba103494247d798ac3037c50fc8831">More...</a><br /></td></tr>
+<tr class="separator:ad0ba103494247d798ac3037c50fc8831"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Hash map implementation. </p>
+<p>This implementation uses murmur hash 2 and separate chaining with linked lists.</p>
+<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
+<dd>
+Olaf Wintermann </dd></dl>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a64e1fb55498fa502dd2ed8ed69062cdd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a64e1fb55498fa502dd2ed8ed69062cdd">&#9670;&nbsp;</a></span>ucx_map_cstr_get</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_map_cstr_get</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">map, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">key&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="map_8h.html#ab61192c5af2e06ecb9ad73880d1c95a6">ucx_map_get</a>(map, <a class="el" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">ucx_key</a>(key, strlen(key)))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shorthand for getting data from the map with a C string key. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">map</td><td>the map </td></tr>
+    <tr><td class="paramname">key</td><td>the key </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the value </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="map_8h.html#ab61192c5af2e06ecb9ad73880d1c95a6" title="Retrieves a value by using a key. ">ucx_map_get()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ad9356b01425b934ab237b52339ac0cc3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad9356b01425b934ab237b52339ac0cc3">&#9670;&nbsp;</a></span>ucx_map_cstr_put</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_map_cstr_put</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">map, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">key, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">value&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="map_8h.html#ac04a08b604217070254d4c58f0e82498">ucx_map_put</a>(map, <a class="el" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">ucx_key</a>(key, strlen(key)), (void*)value)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shorthand for putting data with a C string key into the map. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">map</td><td>the map </td></tr>
+    <tr><td class="paramname">key</td><td>the key </td></tr>
+    <tr><td class="paramname">value</td><td>the value </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>0 on success, non-zero value on failure </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="map_8h.html#ac04a08b604217070254d4c58f0e82498" title="Puts a key/value-pair into the map. ">ucx_map_put()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a9c4405a5a75ecf64e2ef3d0c6501a9fe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9c4405a5a75ecf64e2ef3d0c6501a9fe">&#9670;&nbsp;</a></span>ucx_map_cstr_remove</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_map_cstr_remove</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">map, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">key&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="map_8h.html#a17248a4888eb8f9ae18be522d64632aa">ucx_map_remove</a>(map, <a class="el" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">ucx_key</a>(key, strlen(key)))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shorthand for removing data from the map with a C string key. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">map</td><td>the map </td></tr>
+    <tr><td class="paramname">key</td><td>the key </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the removed value </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="map_8h.html#a17248a4888eb8f9ae18be522d64632aa" title="Removes a key/value-pair from the map by using the key. ">ucx_map_remove()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a940896c4aa1b13e54c55c04c3efc186b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a940896c4aa1b13e54c55c04c3efc186b">&#9670;&nbsp;</a></span>UCX_MAP_FOREACH</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UCX_MAP_FOREACH</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">key, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">value, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">iter&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;for(<a class="el" href="structUcxKey.html">UcxKey</a> key;<a class="el" href="map_8h.html#aceb8675abf44860b4bbc301bbada5b91">ucx_map_iter_next</a>(&amp;iter,&amp;key, (void**)&amp;value);)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Loop statement for UCX maps. </p>
+<p>The <code>key</code> variable is implicitly defined, but the <code>value</code> variable must be already declared as type information cannot be inferred.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">key</td><td>the variable name for the key </td></tr>
+    <tr><td class="paramname">value</td><td>the variable name for the value </td></tr>
+    <tr><td class="paramname">iter</td><td>a <a class="el" href="structUcxMapIterator.html" title="Structure for an iterator over a UcxMap. ">UcxMapIterator</a> </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="map_8h.html#a9150e9c64fdf4dfcc2cad106b91aa110" title="Creates an iterator for a map. ">ucx_map_iterator()</a> </dd></dl>
+
+</div>
+</div>
+<a id="aa1681bd2178553cd092fd24c4d681d3c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa1681bd2178553cd092fd24c4d681d3c">&#9670;&nbsp;</a></span>ucx_map_int_get</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_map_int_get</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">map, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">key&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="map_8h.html#ab61192c5af2e06ecb9ad73880d1c95a6">ucx_map_get</a>(map, <a class="el" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">ucx_key</a>(&amp;key, sizeof(int)))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shorthand for getting data from the map with an integer key. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">map</td><td>the map </td></tr>
+    <tr><td class="paramname">key</td><td>the key </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the value </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="map_8h.html#ab61192c5af2e06ecb9ad73880d1c95a6" title="Retrieves a value by using a key. ">ucx_map_get()</a> </dd></dl>
+
+</div>
+</div>
+<a id="aaa30af79b4068c923895619e83f44367"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaa30af79b4068c923895619e83f44367">&#9670;&nbsp;</a></span>ucx_map_int_put</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_map_int_put</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">map, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">key, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">value&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="map_8h.html#ac04a08b604217070254d4c58f0e82498">ucx_map_put</a>(map, <a class="el" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">ucx_key</a>(&amp;key, sizeof(key)), (void*)value)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shorthand for putting data with an integer key into the map. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">map</td><td>the map </td></tr>
+    <tr><td class="paramname">key</td><td>the key </td></tr>
+    <tr><td class="paramname">value</td><td>the value </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>0 on success, non-zero value on failure </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="map_8h.html#ac04a08b604217070254d4c58f0e82498" title="Puts a key/value-pair into the map. ">ucx_map_put()</a> </dd></dl>
+
+</div>
+</div>
+<a id="aa767958b5468737755c09f7185b1770c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa767958b5468737755c09f7185b1770c">&#9670;&nbsp;</a></span>ucx_map_int_remove</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_map_int_remove</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">map, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">key&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="map_8h.html#a17248a4888eb8f9ae18be522d64632aa">ucx_map_remove</a>(map, <a class="el" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">ucx_key</a>(&amp;key, sizeof(key)))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shorthand for removing data from the map with an integer key. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">map</td><td>the map </td></tr>
+    <tr><td class="paramname">key</td><td>the key </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the removed value </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="map_8h.html#a17248a4888eb8f9ae18be522d64632aa" title="Removes a key/value-pair from the map by using the key. ">ucx_map_remove()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a14d385f6b7f371f0507861cabd2eab4e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a14d385f6b7f371f0507861cabd2eab4e">&#9670;&nbsp;</a></span>ucx_map_sstr_get</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_map_sstr_get</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">map, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">key&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="map_8h.html#ab61192c5af2e06ecb9ad73880d1c95a6">ucx_map_get</a>(map, <a class="el" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">ucx_key</a>(key.ptr, key.length))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shorthand for getting data from the map with a <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> key. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">map</td><td>the map </td></tr>
+    <tr><td class="paramname">key</td><td>the key </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the value </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="map_8h.html#ab61192c5af2e06ecb9ad73880d1c95a6" title="Retrieves a value by using a key. ">ucx_map_get()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ac26a8615bfc8f47ee9eaceb47645f98e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac26a8615bfc8f47ee9eaceb47645f98e">&#9670;&nbsp;</a></span>ucx_map_sstr_put</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_map_sstr_put</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">map, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">key, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">value&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="map_8h.html#ac04a08b604217070254d4c58f0e82498">ucx_map_put</a>(map, <a class="el" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">ucx_key</a>(key.ptr, key.length), (void*)value)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shorthand for putting data with a <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> key into the map. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">map</td><td>the map </td></tr>
+    <tr><td class="paramname">key</td><td>the key </td></tr>
+    <tr><td class="paramname">value</td><td>the value </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>0 on success, non-zero value on failure </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="map_8h.html#ac04a08b604217070254d4c58f0e82498" title="Puts a key/value-pair into the map. ">ucx_map_put()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a48700ea86fadb9ea54d13010f9124df2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a48700ea86fadb9ea54d13010f9124df2">&#9670;&nbsp;</a></span>ucx_map_sstr_remove</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_map_sstr_remove</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">map, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">key&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="map_8h.html#a17248a4888eb8f9ae18be522d64632aa">ucx_map_remove</a>(map, <a class="el" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">ucx_key</a>(key.ptr, key.length))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shorthand for removing data from the map with a <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> key. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">map</td><td>the map </td></tr>
+    <tr><td class="paramname">key</td><td>the key </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the removed value </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="map_8h.html#a17248a4888eb8f9ae18be522d64632aa" title="Removes a key/value-pair from the map by using the key. ">ucx_map_remove()</a> </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="ad63828bb23123fc01a5315a2bac3b142"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad63828bb23123fc01a5315a2bac3b142">&#9670;&nbsp;</a></span>UcxKey</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structUcxKey.html">UcxKey</a> <a class="el" href="structUcxKey.html">UcxKey</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Type for a key of a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>. </p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="structUcxKey.html" title="Structure to publicly denote a key of a UcxMap. ">UcxKey</a> </dd></dl>
+
+</div>
+</div>
+<a id="a18e21948725b2da68c35da587a722033"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a18e21948725b2da68c35da587a722033">&#9670;&nbsp;</a></span>UcxMap</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structUcxMap.html">UcxMap</a> <a class="el" href="structUcxMap.html">UcxMap</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Type for the UCX map. </p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a> </dd></dl>
+
+</div>
+</div>
+<a id="ad7d7a910a32113eb93eae11c3dc97b4b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad7d7a910a32113eb93eae11c3dc97b4b">&#9670;&nbsp;</a></span>UcxMapElement</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structUcxMapElement.html">UcxMapElement</a> <a class="el" href="structUcxMapElement.html">UcxMapElement</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Type for an element of a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>. </p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="structUcxMapElement.html" title="Structure for an element of a UcxMap. ">UcxMapElement</a> </dd></dl>
+
+</div>
+</div>
+<a id="ae36aff5f645948c54f51578b11fd87fb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae36aff5f645948c54f51578b11fd87fb">&#9670;&nbsp;</a></span>UcxMapIterator</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structUcxMapIterator.html">UcxMapIterator</a> <a class="el" href="structUcxMapIterator.html">UcxMapIterator</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Type for an iterator over a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>. </p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="structUcxMapIterator.html" title="Structure for an iterator over a UcxMap. ">UcxMapIterator</a> </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="aea3be97254c05595d986ef6a9faae87b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aea3be97254c05595d986ef6a9faae87b">&#9670;&nbsp;</a></span>ucx_hash()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_hash </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>data</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Computes a murmur hash-2. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">data</td><td>the data to hash </td></tr>
+    <tr><td class="paramname">len</td><td>the length of the data </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the murmur hash-2 of the data </dd></dl>
+
+</div>
+</div>
+<a id="a3e540bb46b8ee19789aed63fd8919200"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3e540bb46b8ee19789aed63fd8919200">&#9670;&nbsp;</a></span>ucx_key()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxKey.html">UcxKey</a> ucx_key </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>data</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Creates a <a class="el" href="structUcxKey.html" title="Structure to publicly denote a key of a UcxMap. ">UcxKey</a> based on the given data. </p>
+<p>This function implicitly computes the hash.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">data</td><td>the data for the key </td></tr>
+    <tr><td class="paramname">len</td><td>the length of the data </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a <a class="el" href="structUcxKey.html" title="Structure to publicly denote a key of a UcxMap. ">UcxKey</a> with implicitly computed hash </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="map_8h.html#aea3be97254c05595d986ef6a9faae87b" title="Computes a murmur hash-2. ">ucx_hash()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a285e90e40681c6d9631c935dda0967f2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a285e90e40681c6d9631c935dda0967f2">&#9670;&nbsp;</a></span>ucx_map_clear()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_map_clear </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
+          <td class="paramname"><em>map</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Clears a hash map. </p>
+<p><b>Note:</b> the contents are <b>not</b> freed, use <a class="el" href="map_8h.html#a750f3d9d83e2f3788a14c17a9d160618" title="Frees the contents of a hash map. ">ucx_map_free_content()</a> before calling this function to achieve that.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">map</td><td>the map to be cleared </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="map_8h.html#a750f3d9d83e2f3788a14c17a9d160618" title="Frees the contents of a hash map. ">ucx_map_free_content()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a62c6c30cbb0d824ba710f5030ff9a4e4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a62c6c30cbb0d824ba710f5030ff9a4e4">&#9670;&nbsp;</a></span>ucx_map_clone()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a>* ucx_map_clone </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> const *&#160;</td>
+          <td class="paramname"><em>map</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
+          <td class="paramname"><em>fnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Clones the map and rehashes if necessary. </p>
+<p><b>Note:</b> In contrast to <a class="el" href="map_8h.html#a174bce9fad554dd92b8da354e0d32512" title="Increases size of the hash map, if necessary. ">ucx_map_rehash()</a> the load factor is irrelevant. This function <em>always</em> ensures a new <a class="el" href="structUcxMap.html#afe120846b26d99580a7ff1276464e838" title="The size of the map is the length of the element list array. ">UcxMap.size</a> of at least 2.5*UcxMap.count.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">map</td><td>the map to clone </td></tr>
+    <tr><td class="paramname">fnc</td><td>the copy function to use or <code>NULL</code> if the new and the old map shall share the data pointers </td></tr>
+    <tr><td class="paramname">data</td><td>additional data for the copy function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the cloned map </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="map_8h.html#adfeb2d61003fd2896bcfdc9a57f36425" title="Copies contents from a map to another map using a copy function. ">ucx_map_copy()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a9aea9103703d5c168420bb6bf85549ea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9aea9103703d5c168420bb6bf85549ea">&#9670;&nbsp;</a></span>ucx_map_clone_a()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a>* ucx_map_clone_a </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> const *&#160;</td>
+          <td class="paramname"><em>map</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
+          <td class="paramname"><em>fnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Clones the map and rehashes if necessary. </p>
+<p><b>Note:</b> In contrast to <a class="el" href="map_8h.html#a174bce9fad554dd92b8da354e0d32512" title="Increases size of the hash map, if necessary. ">ucx_map_rehash()</a> the load factor is irrelevant. This function <em>always</em> ensures a new <a class="el" href="structUcxMap.html#afe120846b26d99580a7ff1276464e838" title="The size of the map is the length of the element list array. ">UcxMap.size</a> of at least 2.5*UcxMap.count.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>the allocator to use for the cloned map </td></tr>
+    <tr><td class="paramname">map</td><td>the map to clone </td></tr>
+    <tr><td class="paramname">fnc</td><td>the copy function to use or <code>NULL</code> if the new and the old map shall share the data pointers </td></tr>
+    <tr><td class="paramname">data</td><td>additional data for the copy function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the cloned map </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="map_8h.html#adfeb2d61003fd2896bcfdc9a57f36425" title="Copies contents from a map to another map using a copy function. ">ucx_map_copy()</a> </dd></dl>
+
+</div>
+</div>
+<a id="adfeb2d61003fd2896bcfdc9a57f36425"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adfeb2d61003fd2896bcfdc9a57f36425">&#9670;&nbsp;</a></span>ucx_map_copy()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_map_copy </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> const *&#160;</td>
+          <td class="paramname"><em>from</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
+          <td class="paramname"><em>to</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
+          <td class="paramname"><em>fnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Copies contents from a map to another map using a copy function. </p>
+<p><b>Note:</b> The destination map does not need to be empty. However, if it contains data with keys that are also present in the source map, the contents are overwritten.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">from</td><td>the source map </td></tr>
+    <tr><td class="paramname">to</td><td>the destination map </td></tr>
+    <tr><td class="paramname">fnc</td><td>the copy function or <code>NULL</code> if the pointer address shall be copied </td></tr>
+    <tr><td class="paramname">data</td><td>additional data for the copy function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>0 on success or a non-zero value on memory allocation errors </dd></dl>
+
+</div>
+</div>
+<a id="a774fcff87d1e58b6c5af77dd19a8c3dc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a774fcff87d1e58b6c5af77dd19a8c3dc">&#9670;&nbsp;</a></span>ucx_map_difference()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a>* ucx_map_difference </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
+          <td class="paramname"><em>first</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
+          <td class="paramname"><em>second</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
+          <td class="paramname"><em>cpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>cpdata</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns the difference of two maps. </p>
+<p>The difference contains a copy of all elements of the first map for which the corresponding keys cannot be found in the second map.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">first</td><td>the first source map </td></tr>
+    <tr><td class="paramname">second</td><td>the second source map </td></tr>
+    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
+    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new list containing the difference </dd></dl>
+
+</div>
+</div>
+<a id="ad0ba103494247d798ac3037c50fc8831"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad0ba103494247d798ac3037c50fc8831">&#9670;&nbsp;</a></span>ucx_map_difference_a()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a>* ucx_map_difference_a </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
+          <td class="paramname"><em>first</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
+          <td class="paramname"><em>second</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
+          <td class="paramname"><em>cpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>cpdata</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns the difference of two maps. </p>
+<p>The difference contains a copy of all elements of the first map for which the corresponding keys cannot be found in the second map.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>the allocator that shall be used by the new map </td></tr>
+    <tr><td class="paramname">first</td><td>the first source map </td></tr>
+    <tr><td class="paramname">second</td><td>the second source map </td></tr>
+    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
+    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new list containing the difference </dd></dl>
+
+</div>
+</div>
+<a id="abe3d9688e4224bf7bb962abf25ff8c2e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abe3d9688e4224bf7bb962abf25ff8c2e">&#9670;&nbsp;</a></span>ucx_map_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_map_free </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
+          <td class="paramname"><em>map</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Frees a hash map. </p>
+<p><b>Note:</b> the contents are <b>not</b> freed, use <a class="el" href="map_8h.html#a750f3d9d83e2f3788a14c17a9d160618" title="Frees the contents of a hash map. ">ucx_map_free_content()</a> before calling this function to achieve that.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">map</td><td>the map to be freed </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="map_8h.html#a750f3d9d83e2f3788a14c17a9d160618" title="Frees the contents of a hash map. ">ucx_map_free_content()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a750f3d9d83e2f3788a14c17a9d160618"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a750f3d9d83e2f3788a14c17a9d160618">&#9670;&nbsp;</a></span>ucx_map_free_content()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_map_free_content </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
+          <td class="paramname"><em>map</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a>&#160;</td>
+          <td class="paramname"><em>destr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Frees the contents of a hash map. </p>
+<p>This is a convenience function that iterates over the map and passes all values to the specified destructor function.</p>
+<p>If no destructor is specified (<code>NULL</code>), the free() function of the map's own allocator is used.</p>
+<p>You must ensure, that it is valid to pass each value in the map to the same destructor function.</p>
+<p>You should free or clear the map afterwards, as the contents will be invalid.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">map</td><td>for which the contents shall be freed </td></tr>
+    <tr><td class="paramname">destr</td><td>optional pointer to a destructor function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="map_8h.html#abe3d9688e4224bf7bb962abf25ff8c2e" title="Frees a hash map. ">ucx_map_free()</a> </dd>
+<dd>
+<a class="el" href="map_8h.html#a285e90e40681c6d9631c935dda0967f2" title="Clears a hash map. ">ucx_map_clear()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ab61192c5af2e06ecb9ad73880d1c95a6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab61192c5af2e06ecb9ad73880d1c95a6">&#9670;&nbsp;</a></span>ucx_map_get()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* ucx_map_get </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> const *&#160;</td>
+          <td class="paramname"><em>map</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structUcxKey.html">UcxKey</a>&#160;</td>
+          <td class="paramname"><em>key</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Retrieves a value by using a key. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">map</td><td>the map </td></tr>
+    <tr><td class="paramname">key</td><td>the key </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the value </dd></dl>
+
+</div>
+</div>
+<a id="aa594d7a5afebc3bed6bb265348cf6b0d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa594d7a5afebc3bed6bb265348cf6b0d">&#9670;&nbsp;</a></span>ucx_map_intersection()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a>* ucx_map_intersection </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
+          <td class="paramname"><em>first</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
+          <td class="paramname"><em>second</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
+          <td class="paramname"><em>cpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>cpdata</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns the intersection of two maps. </p>
+<p>The intersection is defined as a copy of the first map with every element removed that has no valid key in the second map.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">first</td><td>the first source map </td></tr>
+    <tr><td class="paramname">second</td><td>the second source map </td></tr>
+    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
+    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new map containing the intersection </dd></dl>
+
+</div>
+</div>
+<a id="a169e0470a20484dd76425fdf77e3651e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a169e0470a20484dd76425fdf77e3651e">&#9670;&nbsp;</a></span>ucx_map_intersection_a()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a>* ucx_map_intersection_a </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
+          <td class="paramname"><em>first</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
+          <td class="paramname"><em>second</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
+          <td class="paramname"><em>cpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>cpdata</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns the intersection of two maps. </p>
+<p>The intersection is defined as a copy of the first map with every element removed that has no valid key in the second map.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>the allocator that shall be used by the new map </td></tr>
+    <tr><td class="paramname">first</td><td>the first source map </td></tr>
+    <tr><td class="paramname">second</td><td>the second source map </td></tr>
+    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
+    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new map containing the intersection </dd></dl>
+
+</div>
+</div>
+<a id="aceb8675abf44860b4bbc301bbada5b91"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aceb8675abf44860b4bbc301bbada5b91">&#9670;&nbsp;</a></span>ucx_map_iter_next()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_map_iter_next </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxMapIterator.html">UcxMapIterator</a> *&#160;</td>
+          <td class="paramname"><em>iterator</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structUcxKey.html">UcxKey</a> *&#160;</td>
+          <td class="paramname"><em>key</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void **&#160;</td>
+          <td class="paramname"><em>value</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Proceeds to the next element of the map (if any). </p>
+<p>Subsequent calls on the same iterator proceed to the next element and store the key/value-pair into the memory specified as arguments of this function.</p>
+<p>If no further elements are found, this function returns zero and leaves the last found key/value-pair in memory.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">iterator</td><td>the iterator to use </td></tr>
+    <tr><td class="paramname">key</td><td>a pointer to the memory where to store the key </td></tr>
+    <tr><td class="paramname">value</td><td>a pointer to the memory where to store the value </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1, if another element was found, 0 if all elements has been processed </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="map_8h.html#a9150e9c64fdf4dfcc2cad106b91aa110" title="Creates an iterator for a map. ">ucx_map_iterator()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a9150e9c64fdf4dfcc2cad106b91aa110"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9150e9c64fdf4dfcc2cad106b91aa110">&#9670;&nbsp;</a></span>ucx_map_iterator()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxMapIterator.html">UcxMapIterator</a> ucx_map_iterator </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> const *&#160;</td>
+          <td class="paramname"><em>map</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Creates an iterator for a map. </p>
+<p><b>Note:</b> A <a class="el" href="structUcxMapIterator.html" title="Structure for an iterator over a UcxMap. ">UcxMapIterator</a> iterates over all elements in all element lists successively. Therefore the order highly depends on the key hashes and may vary under different map sizes. So generally you may <b>NOT</b> rely on the iteration order.</p>
+<p><b>Note:</b> The iterator is <b>NOT</b> initialized. You need to call <a class="el" href="map_8h.html#aceb8675abf44860b4bbc301bbada5b91" title="Proceeds to the next element of the map (if any). ">ucx_map_iter_next()</a> at least once before accessing any information. However, it is not recommended to access the fields of a <a class="el" href="structUcxMapIterator.html" title="Structure for an iterator over a UcxMap. ">UcxMapIterator</a> directly.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">map</td><td>the map to create the iterator for </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>an iterator initialized on the first element of the first element list </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="map_8h.html#aceb8675abf44860b4bbc301bbada5b91" title="Proceeds to the next element of the map (if any). ">ucx_map_iter_next()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a79f31de8b93814493759dbc8b940cf0c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a79f31de8b93814493759dbc8b940cf0c">&#9670;&nbsp;</a></span>ucx_map_new()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a>* ucx_map_new </td>
+          <td>(</td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>size</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Creates a new hash map with the specified size. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">size</td><td>the size of the hash map </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the new hash map </dd></dl>
+
+</div>
+</div>
+<a id="aed508a94c66cc15372503c64b70eb03e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aed508a94c66cc15372503c64b70eb03e">&#9670;&nbsp;</a></span>ucx_map_new_a()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a>* ucx_map_new_a </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>size</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Creates a new hash map with the specified size using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>the allocator to use </td></tr>
+    <tr><td class="paramname">size</td><td>the size of the hash map </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the new hash map </dd></dl>
+
+</div>
+</div>
+<a id="ac04a08b604217070254d4c58f0e82498"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac04a08b604217070254d4c58f0e82498">&#9670;&nbsp;</a></span>ucx_map_put()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_map_put </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
+          <td class="paramname"><em>map</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structUcxKey.html">UcxKey</a>&#160;</td>
+          <td class="paramname"><em>key</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>value</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Puts a key/value-pair into the map. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">map</td><td>the map </td></tr>
+    <tr><td class="paramname">key</td><td>the key </td></tr>
+    <tr><td class="paramname">value</td><td>the value </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>0 on success, non-zero value on failure </dd></dl>
+
+</div>
+</div>
+<a id="a174bce9fad554dd92b8da354e0d32512"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a174bce9fad554dd92b8da354e0d32512">&#9670;&nbsp;</a></span>ucx_map_rehash()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_map_rehash </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
+          <td class="paramname"><em>map</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Increases size of the hash map, if necessary. </p>
+<p>The load value is 0.75*UcxMap.size. If the element count exceeds the load value, the map needs to be rehashed. Otherwise no action is performed and this function simply returns 0.</p>
+<p>The rehashing process ensures, that the <a class="el" href="structUcxMap.html#afe120846b26d99580a7ff1276464e838" title="The size of the map is the length of the element list array. ">UcxMap.size</a> is at least 2.5*UcxMap.count. So there is enough room for additional elements without the need of another soon rehashing.</p>
+<p>You can use this function to dramatically increase access performance.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">map</td><td>the map to rehash </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1, if a memory allocation error occurred, 0 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a17248a4888eb8f9ae18be522d64632aa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a17248a4888eb8f9ae18be522d64632aa">&#9670;&nbsp;</a></span>ucx_map_remove()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* ucx_map_remove </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
+          <td class="paramname"><em>map</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structUcxKey.html">UcxKey</a>&#160;</td>
+          <td class="paramname"><em>key</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Removes a key/value-pair from the map by using the key. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">map</td><td>the map </td></tr>
+    <tr><td class="paramname">key</td><td>the key </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the removed value </dd></dl>
+
+</div>
+</div>
+<a id="a3f65978c481af7f637cad021d93522d5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3f65978c481af7f637cad021d93522d5">&#9670;&nbsp;</a></span>ucx_map_union()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a>* ucx_map_union </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
+          <td class="paramname"><em>first</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
+          <td class="paramname"><em>second</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
+          <td class="paramname"><em>cpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>cpdata</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns the union of two maps. </p>
+<p>The union is a fresh map which is filled by two successive calls of <a class="el" href="map_8h.html#adfeb2d61003fd2896bcfdc9a57f36425" title="Copies contents from a map to another map using a copy function. ">ucx_map_copy()</a> on the two input maps.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">first</td><td>the first source map </td></tr>
+    <tr><td class="paramname">second</td><td>the second source map </td></tr>
+    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
+    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new map containing the union </dd></dl>
+
+</div>
+</div>
+<a id="ab6370c3fa8113fdad593ce4b0460c9c6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab6370c3fa8113fdad593ce4b0460c9c6">&#9670;&nbsp;</a></span>ucx_map_union_a()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a>* ucx_map_union_a </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
+          <td class="paramname"><em>first</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
+          <td class="paramname"><em>second</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>&#160;</td>
+          <td class="paramname"><em>cpfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>cpdata</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns the union of two maps. </p>
+<p>The union is a fresh map which is filled by two successive calls of <a class="el" href="map_8h.html#adfeb2d61003fd2896bcfdc9a57f36425" title="Copies contents from a map to another map using a copy function. ">ucx_map_copy()</a> on the two input maps.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>the allocator that shall be used by the new map </td></tr>
+    <tr><td class="paramname">first</td><td>the first source map </td></tr>
+    <tr><td class="paramname">second</td><td>the second source map </td></tr>
+    <tr><td class="paramname">cpfnc</td><td>a function to copy the elements </td></tr>
+    <tr><td class="paramname">cpdata</td><td>additional data for the copy function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new map containing the union </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/map_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,127 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/map.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">map.h</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a href="map_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment"> * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"> * Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment"> * modification, are permitted provided that the following conditions are met:</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> *   1. Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> *   2. Redistributions in binary form must reproduce the above copyright</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer in the</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment"> *      documentation and/or other materials provided with the distribution.</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment"> * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment"> * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment"> * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"> * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment"> * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment"> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment"> * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE</span></div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> * POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;</div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;<span class="preprocessor">#ifndef UCX_MAP_H</span></div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;<span class="preprocessor">#define UCX_MAP_H</span></div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;</div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ucx_8h.html">ucx.h</a>&quot;</span></div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="string_8h.html">string.h</a>&quot;</span></div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="allocator_8h.html">allocator.h</a>&quot;</span></div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;<span class="preprocessor">#include &lt;stdio.h&gt;</span></div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;</div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;</div><div class="line"><a name="l00065"></a><span class="lineno"><a class="line" href="map_8h.html#a940896c4aa1b13e54c55c04c3efc186b">   65</a></span>&#160;<span class="preprocessor">#define UCX_MAP_FOREACH(key,value,iter) \</span></div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;<span class="preprocessor">        for(UcxKey key;ucx_map_iter_next(&amp;iter,&amp;key, (void**)&amp;value);)</span></div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;</div><div class="line"><a name="l00069"></a><span class="lineno"><a class="line" href="map_8h.html#a18e21948725b2da68c35da587a722033">   69</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structUcxMap.html">UcxMap</a>          <a class="code" href="structUcxMap.html">UcxMap</a>;</div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;</div><div class="line"><a name="l00072"></a><span class="lineno"><a class="line" href="map_8h.html#ad63828bb23123fc01a5315a2bac3b142">   72</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structUcxKey.html">UcxKey</a>          <a class="code" href="structUcxKey.html">UcxKey</a>;</div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;</div><div class="line"><a name="l00075"></a><span class="lineno"><a class="line" href="map_8h.html#ad7d7a910a32113eb93eae11c3dc97b4b">   75</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structUcxMapElement.html">UcxMapElement</a>   <a class="code" href="structUcxMapElement.html">UcxMapElement</a>;</div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;</div><div class="line"><a name="l00078"></a><span class="lineno"><a class="line" href="map_8h.html#ae36aff5f645948c54f51578b11fd87fb">   78</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structUcxMapIterator.html">UcxMapIterator</a>  <a class="code" href="structUcxMapIterator.html">UcxMapIterator</a>;</div><div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;</div><div class="line"><a name="l00081"></a><span class="lineno"><a class="line" href="structUcxMap.html">   81</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structUcxMap.html">UcxMap</a> {</div><div class="line"><a name="l00083"></a><span class="lineno"><a class="line" href="structUcxMap.html#a531f3e481c1c331cf037b916192e974d">   83</a></span>&#160;    <a class="code" href="structUcxAllocator.html">UcxAllocator</a>  *<a class="code" href="structUcxMap.html#a531f3e481c1c331cf037b916192e974d">allocator</a>;</div><div class="line"><a name="l00085"></a><span class="lineno"><a class="line" href="structUcxMap.html#a5792b5037c4f77ea3cb144b66c9b8790">   85</a></span>&#160;    <a class="code" href="structUcxMapElement.html">UcxMapElement</a> **<a class="code" href="structUcxMap.html#a5792b5037c4f77ea3cb144b66c9b8790">map</a>;</div><div class="line"><a name="l00087"></a><span class="lineno"><a class="line" href="structUcxMap.html#afe120846b26d99580a7ff1276464e838">   87</a></span>&#160;    <span class="keywordtype">size_t</span>        <a class="code" href="structUcxMap.html#afe120846b26d99580a7ff1276464e838">size</a>;</div><div class="line"><a name="l00089"></a><span class="lineno"><a class="line" href="structUcxMap.html#a14e9163f71f6c014dfa2103de70ae9cd">   89</a></span>&#160;    <span class="keywordtype">size_t</span>        <a class="code" href="structUcxMap.html#a14e9163f71f6c014dfa2103de70ae9cd">count</a>;</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;};</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;</div><div class="line"><a name="l00093"></a><span class="lineno"><a class="line" href="structUcxKey.html">   93</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structUcxKey.html">UcxKey</a> {</div><div class="line"><a name="l00095"></a><span class="lineno"><a class="line" href="structUcxKey.html#a6176109f25b34f3fa92bcfbc8ae7a88c">   95</a></span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span> *<a class="code" href="structUcxKey.html#a6176109f25b34f3fa92bcfbc8ae7a88c">data</a>;</div><div class="line"><a name="l00097"></a><span class="lineno"><a class="line" href="structUcxKey.html#abef01de37f355688f2ac797d2c280683">   97</a></span>&#160;    <span class="keywordtype">size_t</span>     <a class="code" href="structUcxKey.html#abef01de37f355688f2ac797d2c280683">len</a>;</div><div class="line"><a name="l00099"></a><span class="lineno"><a class="line" href="structUcxKey.html#aac9d372ac34a4cbd8459e2b04e505752">   99</a></span>&#160;    <span class="keywordtype">int</span>        <a class="code" href="structUcxKey.html#aac9d372ac34a4cbd8459e2b04e505752">hash</a>;</div><div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;};</div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;</div><div class="line"><a name="l00103"></a><span class="lineno"><a class="line" href="structUcxMapKey.html">  103</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structUcxMapKey.html">UcxMapKey</a> {</div><div class="line"><a name="l00105"></a><span class="lineno"><a class="line" href="structUcxMapKey.html#ab71d1841e4f538628c00f782267fb6d5">  105</a></span>&#160;    <span class="keywordtype">void</span>    *<a class="code" href="structUcxMapKey.html#ab71d1841e4f538628c00f782267fb6d5">data</a>;</div><div class="line"><a name="l00107"></a><span class="lineno"><a class="line" href="structUcxMapKey.html#a504d46caa45c79cd87ff8cd835654270">  107</a></span>&#160;    <span class="keywordtype">size_t</span>  <a class="code" href="structUcxMapKey.html#a504d46caa45c79cd87ff8cd835654270">len</a>;</div><div class="line"><a name="l00109"></a><span class="lineno"><a class="line" href="structUcxMapKey.html#a34c1f8fec98174583944fffd30e7c913">  109</a></span>&#160;    <span class="keywordtype">int</span>     <a class="code" href="structUcxMapKey.html#a34c1f8fec98174583944fffd30e7c913">hash</a>;</div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;};</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;</div><div class="line"><a name="l00113"></a><span class="lineno"><a class="line" href="structUcxMapElement.html">  113</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structUcxMapElement.html">UcxMapElement</a> {</div><div class="line"><a name="l00115"></a><span class="lineno"><a class="line" href="structUcxMapElement.html#abbd7f3bf5beef370f702d2d5bb07733c">  115</a></span>&#160;    <span class="keywordtype">void</span>              *<a class="code" href="structUcxMapElement.html#abbd7f3bf5beef370f702d2d5bb07733c">data</a>;</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;    </div><div class="line"><a name="l00118"></a><span class="lineno"><a class="line" href="structUcxMapElement.html#a99fe8188b0889201d70ff5f922deef51">  118</a></span>&#160;    <a class="code" href="structUcxMapElement.html">UcxMapElement</a>     *<a class="code" href="structUcxMapElement.html#a99fe8188b0889201d70ff5f922deef51">next</a>;</div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;    </div><div class="line"><a name="l00121"></a><span class="lineno"><a class="line" href="structUcxMapElement.html#aa446141b708e106e2c8de1303318187c">  121</a></span>&#160;    <span class="keyword">struct </span><a class="code" href="structUcxMapKey.html">UcxMapKey</a>  key;</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;};</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;</div><div class="line"><a name="l00125"></a><span class="lineno"><a class="line" href="structUcxMapIterator.html">  125</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structUcxMapIterator.html">UcxMapIterator</a> {</div><div class="line"><a name="l00127"></a><span class="lineno"><a class="line" href="structUcxMapIterator.html#af88d6e22547d09fe1d665dd650dcdb95">  127</a></span>&#160;    <a class="code" href="structUcxMap.html">UcxMap</a> <span class="keyword">const</span>  *<a class="code" href="structUcxMapIterator.html#af88d6e22547d09fe1d665dd650dcdb95">map</a>;</div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;    </div><div class="line"><a name="l00130"></a><span class="lineno"><a class="line" href="structUcxMapIterator.html#af1fc40f899f37280adb5b85acf6e742f">  130</a></span>&#160;    <a class="code" href="structUcxMapElement.html">UcxMapElement</a> *<a class="code" href="structUcxMapIterator.html#af1fc40f899f37280adb5b85acf6e742f">cur</a>;</div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;    </div><div class="line"><a name="l00138"></a><span class="lineno"><a class="line" href="structUcxMapIterator.html#ac2376545c8816dd6895de4995e558c65">  138</a></span>&#160;    <span class="keywordtype">size_t</span>        <a class="code" href="structUcxMapIterator.html#ac2376545c8816dd6895de4995e558c65">index</a>;</div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;};</div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;</div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;<a class="code" href="structUcxMap.html">UcxMap</a> *<a class="code" href="map_8h.html#a79f31de8b93814493759dbc8b940cf0c">ucx_map_new</a>(<span class="keywordtype">size_t</span> <a class="code" href="structUcxMap.html#afe120846b26d99580a7ff1276464e838">size</a>);</div><div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;</div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;<a class="code" href="structUcxMap.html">UcxMap</a> *<a class="code" href="map_8h.html#aed508a94c66cc15372503c64b70eb03e">ucx_map_new_a</a>(<a class="code" href="structUcxAllocator.html">UcxAllocator</a> *<a class="code" href="structUcxMap.html#a531f3e481c1c331cf037b916192e974d">allocator</a>, <span class="keywordtype">size_t</span> <a class="code" href="structUcxMap.html#afe120846b26d99580a7ff1276464e838">size</a>);</div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;</div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;<span class="keywordtype">void</span> <a class="code" href="map_8h.html#abe3d9688e4224bf7bb962abf25ff8c2e">ucx_map_free</a>(<a class="code" href="structUcxMap.html">UcxMap</a> *<a class="code" href="structUcxMap.html#a5792b5037c4f77ea3cb144b66c9b8790">map</a>);</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;</div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;<span class="keywordtype">void</span> <a class="code" href="map_8h.html#a750f3d9d83e2f3788a14c17a9d160618">ucx_map_free_content</a>(<a class="code" href="structUcxMap.html">UcxMap</a> *<a class="code" href="structUcxMap.html#a5792b5037c4f77ea3cb144b66c9b8790">map</a>, <a class="code" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a> destr);</div><div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;</div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;<span class="keywordtype">void</span> <a class="code" href="map_8h.html#a285e90e40681c6d9631c935dda0967f2">ucx_map_clear</a>(<a class="code" href="structUcxMap.html">UcxMap</a> *<a class="code" href="structUcxMap.html#a5792b5037c4f77ea3cb144b66c9b8790">map</a>);</div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;</div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;</div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;<span class="keywordtype">int</span> <a class="code" href="map_8h.html#adfeb2d61003fd2896bcfdc9a57f36425">ucx_map_copy</a>(<a class="code" href="structUcxMap.html">UcxMap</a> <span class="keyword">const</span> *from, <a class="code" href="structUcxMap.html">UcxMap</a> *to, <a class="code" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> fnc, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;</div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;<a class="code" href="structUcxMap.html">UcxMap</a> *<a class="code" href="map_8h.html#a62c6c30cbb0d824ba710f5030ff9a4e4">ucx_map_clone</a>(<a class="code" href="structUcxMap.html">UcxMap</a> <span class="keyword">const</span> *<a class="code" href="structUcxMap.html#a5792b5037c4f77ea3cb144b66c9b8790">map</a>, <a class="code" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> fnc, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;</div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;<a class="code" href="structUcxMap.html">UcxMap</a> *<a class="code" href="map_8h.html#a9aea9103703d5c168420bb6bf85549ea">ucx_map_clone_a</a>(<a class="code" href="structUcxAllocator.html">UcxAllocator</a> *<a class="code" href="structUcxMap.html#a531f3e481c1c331cf037b916192e974d">allocator</a>,</div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;                        <a class="code" href="structUcxMap.html">UcxMap</a> <span class="keyword">const</span> *<a class="code" href="structUcxMap.html#a5792b5037c4f77ea3cb144b66c9b8790">map</a>, <a class="code" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> fnc, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;</div><div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;<span class="keywordtype">int</span> <a class="code" href="map_8h.html#a174bce9fad554dd92b8da354e0d32512">ucx_map_rehash</a>(<a class="code" href="structUcxMap.html">UcxMap</a> *<a class="code" href="structUcxMap.html#a5792b5037c4f77ea3cb144b66c9b8790">map</a>);</div><div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;</div><div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;<span class="keywordtype">int</span> <a class="code" href="map_8h.html#ac04a08b604217070254d4c58f0e82498">ucx_map_put</a>(<a class="code" href="structUcxMap.html">UcxMap</a> *<a class="code" href="structUcxMap.html#a5792b5037c4f77ea3cb144b66c9b8790">map</a>, <a class="code" href="structUcxKey.html">UcxKey</a> key, <span class="keywordtype">void</span> *value);</div><div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;</div><div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;<span class="keywordtype">void</span>* <a class="code" href="map_8h.html#ab61192c5af2e06ecb9ad73880d1c95a6">ucx_map_get</a>(<a class="code" href="structUcxMap.html">UcxMap</a> <span class="keyword">const</span> *<a class="code" href="structUcxMap.html#a5792b5037c4f77ea3cb144b66c9b8790">map</a>, <a class="code" href="structUcxKey.html">UcxKey</a> key);</div><div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;</div><div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;<span class="keywordtype">void</span>* <a class="code" href="map_8h.html#a17248a4888eb8f9ae18be522d64632aa">ucx_map_remove</a>(<a class="code" href="structUcxMap.html">UcxMap</a> *<a class="code" href="structUcxMap.html#a5792b5037c4f77ea3cb144b66c9b8790">map</a>, <a class="code" href="structUcxKey.html">UcxKey</a> key);</div><div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;</div><div class="line"><a name="l00304"></a><span class="lineno"><a class="line" href="map_8h.html#ac26a8615bfc8f47ee9eaceb47645f98e">  304</a></span>&#160;<span class="preprocessor">#define ucx_map_sstr_put(map, key, value) \</span></div><div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;<span class="preprocessor">    ucx_map_put(map, ucx_key(key.ptr, key.length), (void*)value)</span></div><div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;</div><div class="line"><a name="l00315"></a><span class="lineno"><a class="line" href="map_8h.html#ad9356b01425b934ab237b52339ac0cc3">  315</a></span>&#160;<span class="preprocessor">#define ucx_map_cstr_put(map, key, value) \</span></div><div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;<span class="preprocessor">    ucx_map_put(map, ucx_key(key, strlen(key)), (void*)value)</span></div><div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;</div><div class="line"><a name="l00326"></a><span class="lineno"><a class="line" href="map_8h.html#aaa30af79b4068c923895619e83f44367">  326</a></span>&#160;<span class="preprocessor">#define ucx_map_int_put(map, key, value) \</span></div><div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;<span class="preprocessor">    ucx_map_put(map, ucx_key(&amp;key, sizeof(key)), (void*)value)</span></div><div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;</div><div class="line"><a name="l00336"></a><span class="lineno"><a class="line" href="map_8h.html#a14d385f6b7f371f0507861cabd2eab4e">  336</a></span>&#160;<span class="preprocessor">#define ucx_map_sstr_get(map, key) \</span></div><div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;<span class="preprocessor">    ucx_map_get(map, ucx_key(key.ptr, key.length))</span></div><div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;</div><div class="line"><a name="l00346"></a><span class="lineno"><a class="line" href="map_8h.html#a64e1fb55498fa502dd2ed8ed69062cdd">  346</a></span>&#160;<span class="preprocessor">#define ucx_map_cstr_get(map, key) \</span></div><div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;<span class="preprocessor">    ucx_map_get(map, ucx_key(key, strlen(key)))</span></div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;</div><div class="line"><a name="l00356"></a><span class="lineno"><a class="line" href="map_8h.html#aa1681bd2178553cd092fd24c4d681d3c">  356</a></span>&#160;<span class="preprocessor">#define ucx_map_int_get(map, key) \</span></div><div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;<span class="preprocessor">    ucx_map_get(map, ucx_key(&amp;key, sizeof(int)))</span></div><div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;</div><div class="line"><a name="l00366"></a><span class="lineno"><a class="line" href="map_8h.html#a48700ea86fadb9ea54d13010f9124df2">  366</a></span>&#160;<span class="preprocessor">#define ucx_map_sstr_remove(map, key) \</span></div><div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;<span class="preprocessor">    ucx_map_remove(map, ucx_key(key.ptr, key.length))</span></div><div class="line"><a name="l00368"></a><span class="lineno">  368</span>&#160;</div><div class="line"><a name="l00376"></a><span class="lineno"><a class="line" href="map_8h.html#a9c4405a5a75ecf64e2ef3d0c6501a9fe">  376</a></span>&#160;<span class="preprocessor">#define ucx_map_cstr_remove(map, key) \</span></div><div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;<span class="preprocessor">    ucx_map_remove(map, ucx_key(key, strlen(key)))</span></div><div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;</div><div class="line"><a name="l00386"></a><span class="lineno"><a class="line" href="map_8h.html#aa767958b5468737755c09f7185b1770c">  386</a></span>&#160;<span class="preprocessor">#define ucx_map_int_remove(map, key) \</span></div><div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;<span class="preprocessor">    ucx_map_remove(map, ucx_key(&amp;key, sizeof(key)))</span></div><div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;</div><div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;<a class="code" href="structUcxKey.html">UcxKey</a> <a class="code" href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">ucx_key</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *data, <span class="keywordtype">size_t</span> len);</div><div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;</div><div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;<span class="keywordtype">int</span> <a class="code" href="map_8h.html#aea3be97254c05595d986ef6a9faae87b">ucx_hash</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *data, <span class="keywordtype">size_t</span> len);</div><div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;</div><div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;<a class="code" href="structUcxMapIterator.html">UcxMapIterator</a> <a class="code" href="map_8h.html#a9150e9c64fdf4dfcc2cad106b91aa110">ucx_map_iterator</a>(<a class="code" href="structUcxMap.html">UcxMap</a> <span class="keyword">const</span> *<a class="code" href="structUcxMap.html#a5792b5037c4f77ea3cb144b66c9b8790">map</a>);</div><div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;</div><div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;<span class="keywordtype">int</span> <a class="code" href="map_8h.html#aceb8675abf44860b4bbc301bbada5b91">ucx_map_iter_next</a>(<a class="code" href="structUcxMapIterator.html">UcxMapIterator</a> *iterator, <a class="code" href="structUcxKey.html">UcxKey</a> *key, <span class="keywordtype">void</span> **value);</div><div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;</div><div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;<a class="code" href="structUcxMap.html">UcxMap</a>* <a class="code" href="map_8h.html#a3f65978c481af7f637cad021d93522d5">ucx_map_union</a>(<span class="keyword">const</span> <a class="code" href="structUcxMap.html">UcxMap</a> *first, <span class="keyword">const</span> <a class="code" href="structUcxMap.html">UcxMap</a> *second,</div><div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;                      <a class="code" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, <span class="keywordtype">void</span>* cpdata);</div><div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;</div><div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;<a class="code" href="structUcxMap.html">UcxMap</a>* <a class="code" href="map_8h.html#ab6370c3fa8113fdad593ce4b0460c9c6">ucx_map_union_a</a>(<a class="code" href="structUcxAllocator.html">UcxAllocator</a> *<a class="code" href="structUcxMap.html#a531f3e481c1c331cf037b916192e974d">allocator</a>,</div><div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;                        <span class="keyword">const</span> <a class="code" href="structUcxMap.html">UcxMap</a> *first, <span class="keyword">const</span> <a class="code" href="structUcxMap.html">UcxMap</a> *second,</div><div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;                        <a class="code" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, <span class="keywordtype">void</span>* cpdata);</div><div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;</div><div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;<a class="code" href="structUcxMap.html">UcxMap</a>* <a class="code" href="map_8h.html#aa594d7a5afebc3bed6bb265348cf6b0d">ucx_map_intersection</a>(<span class="keyword">const</span> <a class="code" href="structUcxMap.html">UcxMap</a> *first, <span class="keyword">const</span> <a class="code" href="structUcxMap.html">UcxMap</a> *second,</div><div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;                             <a class="code" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, <span class="keywordtype">void</span>* cpdata);</div><div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;</div><div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;<a class="code" href="structUcxMap.html">UcxMap</a>* <a class="code" href="map_8h.html#a169e0470a20484dd76425fdf77e3651e">ucx_map_intersection_a</a>(<a class="code" href="structUcxAllocator.html">UcxAllocator</a> *<a class="code" href="structUcxMap.html#a531f3e481c1c331cf037b916192e974d">allocator</a>,</div><div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;                               <span class="keyword">const</span> <a class="code" href="structUcxMap.html">UcxMap</a> *first, <span class="keyword">const</span> <a class="code" href="structUcxMap.html">UcxMap</a> *second,</div><div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;                               <a class="code" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, <span class="keywordtype">void</span>* cpdata);</div><div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;</div><div class="line"><a name="l00523"></a><span class="lineno">  523</span>&#160;<a class="code" href="structUcxMap.html">UcxMap</a>* <a class="code" href="map_8h.html#a774fcff87d1e58b6c5af77dd19a8c3dc">ucx_map_difference</a>(<span class="keyword">const</span> <a class="code" href="structUcxMap.html">UcxMap</a> *first, <span class="keyword">const</span> <a class="code" href="structUcxMap.html">UcxMap</a> *second,</div><div class="line"><a name="l00524"></a><span class="lineno">  524</span>&#160;                           <a class="code" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, <span class="keywordtype">void</span>* cpdata);</div><div class="line"><a name="l00525"></a><span class="lineno">  525</span>&#160;</div><div class="line"><a name="l00539"></a><span class="lineno">  539</span>&#160;<a class="code" href="structUcxMap.html">UcxMap</a>* <a class="code" href="map_8h.html#ad0ba103494247d798ac3037c50fc8831">ucx_map_difference_a</a>(<a class="code" href="structUcxAllocator.html">UcxAllocator</a> *<a class="code" href="structUcxMap.html#a531f3e481c1c331cf037b916192e974d">allocator</a>,</div><div class="line"><a name="l00540"></a><span class="lineno">  540</span>&#160;                             <span class="keyword">const</span> <a class="code" href="structUcxMap.html">UcxMap</a> *first, <span class="keyword">const</span> <a class="code" href="structUcxMap.html">UcxMap</a> *second,</div><div class="line"><a name="l00541"></a><span class="lineno">  541</span>&#160;                             <a class="code" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a> cpfnc, <span class="keywordtype">void</span>* cpdata);</div><div class="line"><a name="l00542"></a><span class="lineno">  542</span>&#160;</div><div class="line"><a name="l00543"></a><span class="lineno">  543</span>&#160;</div><div class="line"><a name="l00544"></a><span class="lineno">  544</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00545"></a><span class="lineno">  545</span>&#160;}</div><div class="line"><a name="l00546"></a><span class="lineno">  546</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00547"></a><span class="lineno">  547</span>&#160;</div><div class="line"><a name="l00548"></a><span class="lineno">  548</span>&#160;<span class="preprocessor">#endif  </span><span class="comment">/* UCX_MAP_H */</span><span class="preprocessor"></span></div><div class="line"><a name="l00549"></a><span class="lineno">  549</span>&#160;</div><div class="ttc" id="ucx_8h_html_aab917a5fe0965673c73e8ebd0a1fc967"><div class="ttname"><a href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a></div><div class="ttdeci">void *(* copy_func)(const void *, void *)</div><div class="ttdoc">Function pointer to a copy function. </div><div class="ttdef"><b>Definition:</b> ucx.h:106</div></div>
+<div class="ttc" id="structUcxMapIterator_html_ac2376545c8816dd6895de4995e558c65"><div class="ttname"><a href="structUcxMapIterator.html#ac2376545c8816dd6895de4995e558c65">UcxMapIterator::index</a></div><div class="ttdeci">size_t index</div><div class="ttdoc">The current index of the element list array. </div><div class="ttdef"><b>Definition:</b> map.h:138</div></div>
+<div class="ttc" id="structUcxMapKey_html_a504d46caa45c79cd87ff8cd835654270"><div class="ttname"><a href="structUcxMapKey.html#a504d46caa45c79cd87ff8cd835654270">UcxMapKey::len</a></div><div class="ttdeci">size_t len</div><div class="ttdoc">The length of the key data. </div><div class="ttdef"><b>Definition:</b> map.h:107</div></div>
+<div class="ttc" id="map_8h_html_ad0ba103494247d798ac3037c50fc8831"><div class="ttname"><a href="map_8h.html#ad0ba103494247d798ac3037c50fc8831">ucx_map_difference_a</a></div><div class="ttdeci">UcxMap * ucx_map_difference_a(UcxAllocator *allocator, const UcxMap *first, const UcxMap *second, copy_func cpfnc, void *cpdata)</div><div class="ttdoc">Returns the difference of two maps. </div><div class="ttdef"><b>Definition:</b> map.c:386</div></div>
+<div class="ttc" id="string_8h_html"><div class="ttname"><a href="string_8h.html">string.h</a></div><div class="ttdoc">Bounded string implementation. </div></div>
+<div class="ttc" id="ucx_8h_html"><div class="ttname"><a href="ucx_8h.html">ucx.h</a></div><div class="ttdoc">Main UCX Header providing most common definitions. </div></div>
+<div class="ttc" id="map_8h_html_aea3be97254c05595d986ef6a9faae87b"><div class="ttname"><a href="map_8h.html#aea3be97254c05595d986ef6a9faae87b">ucx_hash</a></div><div class="ttdeci">int ucx_hash(const char *data, size_t len)</div><div class="ttdoc">Computes a murmur hash-2. </div><div class="ttdef"><b>Definition:</b> map.c:260</div></div>
+<div class="ttc" id="structUcxMapKey_html_a34c1f8fec98174583944fffd30e7c913"><div class="ttname"><a href="structUcxMapKey.html#a34c1f8fec98174583944fffd30e7c913">UcxMapKey::hash</a></div><div class="ttdeci">int hash</div><div class="ttdoc">The hash value of the key data. </div><div class="ttdef"><b>Definition:</b> map.h:109</div></div>
+<div class="ttc" id="map_8h_html_a750f3d9d83e2f3788a14c17a9d160618"><div class="ttname"><a href="map_8h.html#a750f3d9d83e2f3788a14c17a9d160618">ucx_map_free_content</a></div><div class="ttdeci">void ucx_map_free_content(UcxMap *map, ucx_destructor destr)</div><div class="ttdoc">Frees the contents of a hash map. </div><div class="ttdef"><b>Definition:</b> map.c:85</div></div>
+<div class="ttc" id="map_8h_html_ab61192c5af2e06ecb9ad73880d1c95a6"><div class="ttname"><a href="map_8h.html#ab61192c5af2e06ecb9ad73880d1c95a6">ucx_map_get</a></div><div class="ttdeci">void * ucx_map_get(UcxMap const *map, UcxKey key)</div><div class="ttdoc">Retrieves a value by using a key. </div><div class="ttdef"><b>Definition:</b> map.c:243</div></div>
+<div class="ttc" id="map_8h_html_a9150e9c64fdf4dfcc2cad106b91aa110"><div class="ttname"><a href="map_8h.html#a9150e9c64fdf4dfcc2cad106b91aa110">ucx_map_iterator</a></div><div class="ttdeci">UcxMapIterator ucx_map_iterator(UcxMap const *map)</div><div class="ttdoc">Creates an iterator for a map. </div><div class="ttdef"><b>Definition:</b> map.c:302</div></div>
+<div class="ttc" id="map_8h_html_a3f65978c481af7f637cad021d93522d5"><div class="ttname"><a href="map_8h.html#a3f65978c481af7f637cad021d93522d5">ucx_map_union</a></div><div class="ttdeci">UcxMap * ucx_map_union(const UcxMap *first, const UcxMap *second, copy_func cpfnc, void *cpdata)</div><div class="ttdoc">Returns the union of two maps. </div><div class="ttdef"><b>Definition:</b> map.c:343</div></div>
+<div class="ttc" id="structUcxKey_html_aac9d372ac34a4cbd8459e2b04e505752"><div class="ttname"><a href="structUcxKey.html#aac9d372ac34a4cbd8459e2b04e505752">UcxKey::hash</a></div><div class="ttdeci">int hash</div><div class="ttdoc">A cache for the hash value of the key data. </div><div class="ttdef"><b>Definition:</b> map.h:99</div></div>
+<div class="ttc" id="map_8h_html_a285e90e40681c6d9631c935dda0967f2"><div class="ttname"><a href="map_8h.html#a285e90e40681c6d9631c935dda0967f2">ucx_map_clear</a></div><div class="ttdeci">void ucx_map_clear(UcxMap *map)</div><div class="ttdoc">Clears a hash map. </div><div class="ttdef"><b>Definition:</b> map.c:97</div></div>
+<div class="ttc" id="map_8h_html_a774fcff87d1e58b6c5af77dd19a8c3dc"><div class="ttname"><a href="map_8h.html#a774fcff87d1e58b6c5af77dd19a8c3dc">ucx_map_difference</a></div><div class="ttdeci">UcxMap * ucx_map_difference(const UcxMap *first, const UcxMap *second, copy_func cpfnc, void *cpdata)</div><div class="ttdoc">Returns the difference of two maps. </div><div class="ttdef"><b>Definition:</b> map.c:380</div></div>
+<div class="ttc" id="structUcxMapElement_html"><div class="ttname"><a href="structUcxMapElement.html">UcxMapElement</a></div><div class="ttdoc">Structure for an element of a UcxMap. </div><div class="ttdef"><b>Definition:</b> map.h:113</div></div>
+<div class="ttc" id="structUcxKey_html"><div class="ttname"><a href="structUcxKey.html">UcxKey</a></div><div class="ttdoc">Structure to publicly denote a key of a UcxMap. </div><div class="ttdef"><b>Definition:</b> map.h:93</div></div>
+<div class="ttc" id="structUcxMap_html_a14e9163f71f6c014dfa2103de70ae9cd"><div class="ttname"><a href="structUcxMap.html#a14e9163f71f6c014dfa2103de70ae9cd">UcxMap::count</a></div><div class="ttdeci">size_t count</div><div class="ttdoc">The count of elements currently stored in this map. </div><div class="ttdef"><b>Definition:</b> map.h:89</div></div>
+<div class="ttc" id="structUcxMapElement_html_a99fe8188b0889201d70ff5f922deef51"><div class="ttname"><a href="structUcxMapElement.html#a99fe8188b0889201d70ff5f922deef51">UcxMapElement::next</a></div><div class="ttdeci">UcxMapElement * next</div><div class="ttdoc">A pointer to the next element in the current list. </div><div class="ttdef"><b>Definition:</b> map.h:118</div></div>
+<div class="ttc" id="map_8h_html_ab6370c3fa8113fdad593ce4b0460c9c6"><div class="ttname"><a href="map_8h.html#ab6370c3fa8113fdad593ce4b0460c9c6">ucx_map_union_a</a></div><div class="ttdeci">UcxMap * ucx_map_union_a(UcxAllocator *allocator, const UcxMap *first, const UcxMap *second, copy_func cpfnc, void *cpdata)</div><div class="ttdoc">Returns the union of two maps. </div><div class="ttdef"><b>Definition:</b> map.c:349</div></div>
+<div class="ttc" id="structUcxMapIterator_html_af88d6e22547d09fe1d665dd650dcdb95"><div class="ttname"><a href="structUcxMapIterator.html#af88d6e22547d09fe1d665dd650dcdb95">UcxMapIterator::map</a></div><div class="ttdeci">UcxMap const  * map</div><div class="ttdoc">The map to iterate over. </div><div class="ttdef"><b>Definition:</b> map.h:127</div></div>
+<div class="ttc" id="structUcxMapIterator_html"><div class="ttname"><a href="structUcxMapIterator.html">UcxMapIterator</a></div><div class="ttdoc">Structure for an iterator over a UcxMap. </div><div class="ttdef"><b>Definition:</b> map.h:125</div></div>
+<div class="ttc" id="structUcxMapElement_html_abbd7f3bf5beef370f702d2d5bb07733c"><div class="ttname"><a href="structUcxMapElement.html#abbd7f3bf5beef370f702d2d5bb07733c">UcxMapElement::data</a></div><div class="ttdeci">void * data</div><div class="ttdoc">The value data. </div><div class="ttdef"><b>Definition:</b> map.h:115</div></div>
+<div class="ttc" id="map_8h_html_adfeb2d61003fd2896bcfdc9a57f36425"><div class="ttname"><a href="map_8h.html#adfeb2d61003fd2896bcfdc9a57f36425">ucx_map_copy</a></div><div class="ttdeci">int ucx_map_copy(UcxMap const *from, UcxMap *to, copy_func fnc, void *data)</div><div class="ttdoc">Copies contents from a map to another map using a copy function. </div><div class="ttdef"><b>Definition:</b> map.c:106</div></div>
+<div class="ttc" id="structUcxAllocator_html"><div class="ttname"><a href="structUcxAllocator.html">UcxAllocator</a></div><div class="ttdoc">UCX allocator data structure containing memory management functions. </div><div class="ttdef"><b>Definition:</b> allocator.h:88</div></div>
+<div class="ttc" id="map_8h_html_a3e540bb46b8ee19789aed63fd8919200"><div class="ttname"><a href="map_8h.html#a3e540bb46b8ee19789aed63fd8919200">ucx_key</a></div><div class="ttdeci">UcxKey ucx_key(const void *data, size_t len)</div><div class="ttdoc">Creates a UcxKey based on the given data. </div><div class="ttdef"><b>Definition:</b> map.c:251</div></div>
+<div class="ttc" id="map_8h_html_a79f31de8b93814493759dbc8b940cf0c"><div class="ttname"><a href="map_8h.html#a79f31de8b93814493759dbc8b940cf0c">ucx_map_new</a></div><div class="ttdeci">UcxMap * ucx_map_new(size_t size)</div><div class="ttdoc">Creates a new hash map with the specified size. </div><div class="ttdef"><b>Definition:</b> map.c:34</div></div>
+<div class="ttc" id="structUcxMapIterator_html_af1fc40f899f37280adb5b85acf6e742f"><div class="ttname"><a href="structUcxMapIterator.html#af1fc40f899f37280adb5b85acf6e742f">UcxMapIterator::cur</a></div><div class="ttdeci">UcxMapElement * cur</div><div class="ttdoc">The current map element. </div><div class="ttdef"><b>Definition:</b> map.h:130</div></div>
+<div class="ttc" id="map_8h_html_aed508a94c66cc15372503c64b70eb03e"><div class="ttname"><a href="map_8h.html#aed508a94c66cc15372503c64b70eb03e">ucx_map_new_a</a></div><div class="ttdeci">UcxMap * ucx_map_new_a(UcxAllocator *allocator, size_t size)</div><div class="ttdoc">Creates a new hash map with the specified size using a UcxAllocator. </div><div class="ttdef"><b>Definition:</b> map.c:38</div></div>
+<div class="ttc" id="structUcxMap_html_a531f3e481c1c331cf037b916192e974d"><div class="ttname"><a href="structUcxMap.html#a531f3e481c1c331cf037b916192e974d">UcxMap::allocator</a></div><div class="ttdeci">UcxAllocator * allocator</div><div class="ttdoc">An allocator that is used for the map elements. </div><div class="ttdef"><b>Definition:</b> map.h:83</div></div>
+<div class="ttc" id="structUcxMapKey_html"><div class="ttname"><a href="structUcxMapKey.html">UcxMapKey</a></div><div class="ttdoc">Internal structure for a key of a UcxMap. </div><div class="ttdef"><b>Definition:</b> map.h:103</div></div>
+<div class="ttc" id="map_8h_html_ac04a08b604217070254d4c58f0e82498"><div class="ttname"><a href="map_8h.html#ac04a08b604217070254d4c58f0e82498">ucx_map_put</a></div><div class="ttdeci">int ucx_map_put(UcxMap *map, UcxKey key, void *value)</div><div class="ttdoc">Puts a key/value-pair into the map. </div><div class="ttdef"><b>Definition:</b> map.c:158</div></div>
+<div class="ttc" id="map_8h_html_a9aea9103703d5c168420bb6bf85549ea"><div class="ttname"><a href="map_8h.html#a9aea9103703d5c168420bb6bf85549ea">ucx_map_clone_a</a></div><div class="ttdeci">UcxMap * ucx_map_clone_a(UcxAllocator *allocator, UcxMap const *map, copy_func fnc, void *data)</div><div class="ttdoc">Clones the map and rehashes if necessary. </div><div class="ttdef"><b>Definition:</b> map.c:121</div></div>
+<div class="ttc" id="structUcxMap_html_afe120846b26d99580a7ff1276464e838"><div class="ttname"><a href="structUcxMap.html#afe120846b26d99580a7ff1276464e838">UcxMap::size</a></div><div class="ttdeci">size_t size</div><div class="ttdoc">The size of the map is the length of the element list array. </div><div class="ttdef"><b>Definition:</b> map.h:87</div></div>
+<div class="ttc" id="map_8h_html_aceb8675abf44860b4bbc301bbada5b91"><div class="ttname"><a href="map_8h.html#aceb8675abf44860b4bbc301bbada5b91">ucx_map_iter_next</a></div><div class="ttdeci">int ucx_map_iter_next(UcxMapIterator *iterator, UcxKey *key, void **value)</div><div class="ttdoc">Proceeds to the next element of the map (if any). </div><div class="ttdef"><b>Definition:</b> map.c:310</div></div>
+<div class="ttc" id="structUcxKey_html_a6176109f25b34f3fa92bcfbc8ae7a88c"><div class="ttname"><a href="structUcxKey.html#a6176109f25b34f3fa92bcfbc8ae7a88c">UcxKey::data</a></div><div class="ttdeci">const void * data</div><div class="ttdoc">The key data. </div><div class="ttdef"><b>Definition:</b> map.h:95</div></div>
+<div class="ttc" id="allocator_8h_html"><div class="ttname"><a href="allocator_8h.html">allocator.h</a></div><div class="ttdoc">Allocator for custom memory management. </div></div>
+<div class="ttc" id="structUcxMap_html"><div class="ttname"><a href="structUcxMap.html">UcxMap</a></div><div class="ttdoc">Structure for the UCX map. </div><div class="ttdef"><b>Definition:</b> map.h:81</div></div>
+<div class="ttc" id="map_8h_html_a17248a4888eb8f9ae18be522d64632aa"><div class="ttname"><a href="map_8h.html#a17248a4888eb8f9ae18be522d64632aa">ucx_map_remove</a></div><div class="ttdeci">void * ucx_map_remove(UcxMap *map, UcxKey key)</div><div class="ttdoc">Removes a key/value-pair from the map by using the key. </div><div class="ttdef"><b>Definition:</b> map.c:247</div></div>
+<div class="ttc" id="structUcxKey_html_abef01de37f355688f2ac797d2c280683"><div class="ttname"><a href="structUcxKey.html#abef01de37f355688f2ac797d2c280683">UcxKey::len</a></div><div class="ttdeci">size_t len</div><div class="ttdoc">The length of the key data. </div><div class="ttdef"><b>Definition:</b> map.h:97</div></div>
+<div class="ttc" id="map_8h_html_aa594d7a5afebc3bed6bb265348cf6b0d"><div class="ttname"><a href="map_8h.html#aa594d7a5afebc3bed6bb265348cf6b0d">ucx_map_intersection</a></div><div class="ttdeci">UcxMap * ucx_map_intersection(const UcxMap *first, const UcxMap *second, copy_func cpfnc, void *cpdata)</div><div class="ttdoc">Returns the intersection of two maps. </div><div class="ttdef"><b>Definition:</b> map.c:357</div></div>
+<div class="ttc" id="map_8h_html_a174bce9fad554dd92b8da354e0d32512"><div class="ttname"><a href="map_8h.html#a174bce9fad554dd92b8da354e0d32512">ucx_map_rehash</a></div><div class="ttdeci">int ucx_map_rehash(UcxMap *map)</div><div class="ttdoc">Increases size of the hash map, if necessary. </div><div class="ttdef"><b>Definition:</b> map.c:132</div></div>
+<div class="ttc" id="map_8h_html_abe3d9688e4224bf7bb962abf25ff8c2e"><div class="ttname"><a href="map_8h.html#abe3d9688e4224bf7bb962abf25ff8c2e">ucx_map_free</a></div><div class="ttdeci">void ucx_map_free(UcxMap *map)</div><div class="ttdoc">Frees a hash map. </div><div class="ttdef"><b>Definition:</b> map.c:79</div></div>
+<div class="ttc" id="map_8h_html_a62c6c30cbb0d824ba710f5030ff9a4e4"><div class="ttname"><a href="map_8h.html#a62c6c30cbb0d824ba710f5030ff9a4e4">ucx_map_clone</a></div><div class="ttdeci">UcxMap * ucx_map_clone(UcxMap const *map, copy_func fnc, void *data)</div><div class="ttdoc">Clones the map and rehashes if necessary. </div><div class="ttdef"><b>Definition:</b> map.c:117</div></div>
+<div class="ttc" id="structUcxMap_html_a5792b5037c4f77ea3cb144b66c9b8790"><div class="ttname"><a href="structUcxMap.html#a5792b5037c4f77ea3cb144b66c9b8790">UcxMap::map</a></div><div class="ttdeci">UcxMapElement ** map</div><div class="ttdoc">The array of map element lists. </div><div class="ttdef"><b>Definition:</b> map.h:85</div></div>
+<div class="ttc" id="map_8h_html_a169e0470a20484dd76425fdf77e3651e"><div class="ttname"><a href="map_8h.html#a169e0470a20484dd76425fdf77e3651e">ucx_map_intersection_a</a></div><div class="ttdeci">UcxMap * ucx_map_intersection_a(UcxAllocator *allocator, const UcxMap *first, const UcxMap *second, copy_func cpfnc, void *cpdata)</div><div class="ttdoc">Returns the intersection of two maps. </div><div class="ttdef"><b>Definition:</b> map.c:363</div></div>
+<div class="ttc" id="structUcxMapKey_html_ab71d1841e4f538628c00f782267fb6d5"><div class="ttname"><a href="structUcxMapKey.html#ab71d1841e4f538628c00f782267fb6d5">UcxMapKey::data</a></div><div class="ttdeci">void * data</div><div class="ttdoc">The key data. </div><div class="ttdef"><b>Definition:</b> map.h:105</div></div>
+<div class="ttc" id="ucx_8h_html_ad2b370c2809914c8b7fedab163c266b3"><div class="ttname"><a href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a></div><div class="ttdeci">void(* ucx_destructor)(void *)</div><div class="ttdoc">A function pointer to a destructor function. </div><div class="ttdef"><b>Definition:</b> ucx.h:72</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/mempool_8h.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,517 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/mempool.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">mempool.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Memory pool implementation.  
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="allocator_8h_source.html">allocator.h</a>&quot;</code><br />
+<code>#include &lt;stddef.h&gt;</code><br />
+</div>
+<p><a href="mempool_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxMempool.html">UcxMempool</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">UCX mempool structure.  <a href="structUcxMempool.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a49f7bd1da5ac201d0cf54dc0f0d82dd2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mempool_8h.html#a49f7bd1da5ac201d0cf54dc0f0d82dd2">ucx_mempool_new_default</a>()&#160;&#160;&#160;<a class="el" href="mempool_8h.html#ad71cb8c3b6fdb30360376a8b372ef22a">ucx_mempool_new</a>(16)</td></tr>
+<tr class="memdesc:a49f7bd1da5ac201d0cf54dc0f0d82dd2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shorthand for a new default memory pool with a capacity of 16 elements.  <a href="#a49f7bd1da5ac201d0cf54dc0f0d82dd2">More...</a><br /></td></tr>
+<tr class="separator:a49f7bd1da5ac201d0cf54dc0f0d82dd2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ad71cb8c3b6fdb30360376a8b372ef22a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxMempool.html">UcxMempool</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mempool_8h.html#ad71cb8c3b6fdb30360376a8b372ef22a">ucx_mempool_new</a> (size_t n)</td></tr>
+<tr class="memdesc:ad71cb8c3b6fdb30360376a8b372ef22a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a memory pool with the specified initial size.  <a href="#ad71cb8c3b6fdb30360376a8b372ef22a">More...</a><br /></td></tr>
+<tr class="separator:ad71cb8c3b6fdb30360376a8b372ef22a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaf75b5016098723a9280531ccc3a6d77"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mempool_8h.html#aaf75b5016098723a9280531ccc3a6d77">ucx_mempool_chcap</a> (<a class="el" href="structUcxMempool.html">UcxMempool</a> *pool, size_t newcap)</td></tr>
+<tr class="memdesc:aaf75b5016098723a9280531ccc3a6d77"><td class="mdescLeft">&#160;</td><td class="mdescRight">Resizes a memory pool.  <a href="#aaf75b5016098723a9280531ccc3a6d77">More...</a><br /></td></tr>
+<tr class="separator:aaf75b5016098723a9280531ccc3a6d77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2ae492b8f2878ccc9837ac213dced11e"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mempool_8h.html#a2ae492b8f2878ccc9837ac213dced11e">ucx_mempool_malloc</a> (<a class="el" href="structUcxMempool.html">UcxMempool</a> *pool, size_t n)</td></tr>
+<tr class="memdesc:a2ae492b8f2878ccc9837ac213dced11e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Allocates pooled memory.  <a href="#a2ae492b8f2878ccc9837ac213dced11e">More...</a><br /></td></tr>
+<tr class="separator:a2ae492b8f2878ccc9837ac213dced11e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4b9142011824ae24f00fabe128417d69"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mempool_8h.html#a4b9142011824ae24f00fabe128417d69">ucx_mempool_calloc</a> (<a class="el" href="structUcxMempool.html">UcxMempool</a> *pool, size_t nelem, size_t elsize)</td></tr>
+<tr class="memdesc:a4b9142011824ae24f00fabe128417d69"><td class="mdescLeft">&#160;</td><td class="mdescRight">Allocates a pooled memory array.  <a href="#a4b9142011824ae24f00fabe128417d69">More...</a><br /></td></tr>
+<tr class="separator:a4b9142011824ae24f00fabe128417d69"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a660ef42520ed6737c2e77aae18e3a7a4"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mempool_8h.html#a660ef42520ed6737c2e77aae18e3a7a4">ucx_mempool_realloc</a> (<a class="el" href="structUcxMempool.html">UcxMempool</a> *pool, void *ptr, size_t n)</td></tr>
+<tr class="memdesc:a660ef42520ed6737c2e77aae18e3a7a4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Reallocates pooled memory.  <a href="#a660ef42520ed6737c2e77aae18e3a7a4">More...</a><br /></td></tr>
+<tr class="separator:a660ef42520ed6737c2e77aae18e3a7a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aefa26e3015f5aefadbfc74221bd246ac"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mempool_8h.html#aefa26e3015f5aefadbfc74221bd246ac">ucx_mempool_free</a> (<a class="el" href="structUcxMempool.html">UcxMempool</a> *pool, void *ptr)</td></tr>
+<tr class="memdesc:aefa26e3015f5aefadbfc74221bd246ac"><td class="mdescLeft">&#160;</td><td class="mdescRight">Frees pooled memory.  <a href="#aefa26e3015f5aefadbfc74221bd246ac">More...</a><br /></td></tr>
+<tr class="separator:aefa26e3015f5aefadbfc74221bd246ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af096378da7e9bfbed3088497cf4c15bf"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mempool_8h.html#af096378da7e9bfbed3088497cf4c15bf">ucx_mempool_destroy</a> (<a class="el" href="structUcxMempool.html">UcxMempool</a> *pool)</td></tr>
+<tr class="memdesc:af096378da7e9bfbed3088497cf4c15bf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys a memory pool.  <a href="#af096378da7e9bfbed3088497cf4c15bf">More...</a><br /></td></tr>
+<tr class="separator:af096378da7e9bfbed3088497cf4c15bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adb788e7ec24cd7dbdea6381539c549f2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mempool_8h.html#adb788e7ec24cd7dbdea6381539c549f2">ucx_mempool_set_destr</a> (void *ptr, <a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a> func)</td></tr>
+<tr class="memdesc:adb788e7ec24cd7dbdea6381539c549f2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets a destructor function for the specified memory.  <a href="#adb788e7ec24cd7dbdea6381539c549f2">More...</a><br /></td></tr>
+<tr class="separator:adb788e7ec24cd7dbdea6381539c549f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af47b6b7c40f8f263dc28cc9a4e77b27c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mempool_8h.html#af47b6b7c40f8f263dc28cc9a4e77b27c">ucx_mempool_reg_destr</a> (<a class="el" href="structUcxMempool.html">UcxMempool</a> *pool, void *ptr, <a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a> destr)</td></tr>
+<tr class="memdesc:af47b6b7c40f8f263dc28cc9a4e77b27c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Registers a destructor function for the specified (non-pooled) memory.  <a href="#af47b6b7c40f8f263dc28cc9a4e77b27c">More...</a><br /></td></tr>
+<tr class="separator:af47b6b7c40f8f263dc28cc9a4e77b27c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Memory pool implementation. </p>
+<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
+<dd>
+Olaf Wintermann </dd></dl>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a49f7bd1da5ac201d0cf54dc0f0d82dd2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a49f7bd1da5ac201d0cf54dc0f0d82dd2">&#9670;&nbsp;</a></span>ucx_mempool_new_default</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_mempool_new_default</td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="mempool_8h.html#ad71cb8c3b6fdb30360376a8b372ef22a">ucx_mempool_new</a>(16)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shorthand for a new default memory pool with a capacity of 16 elements. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a4b9142011824ae24f00fabe128417d69"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4b9142011824ae24f00fabe128417d69">&#9670;&nbsp;</a></span>ucx_mempool_calloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* ucx_mempool_calloc </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxMempool.html">UcxMempool</a> *&#160;</td>
+          <td class="paramname"><em>pool</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>nelem</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>elsize</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Allocates a pooled memory array. </p>
+<p>The content of the allocated memory is set to zero.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pool</td><td>the memory pool </td></tr>
+    <tr><td class="paramname">nelem</td><td>amount of elements to allocate </td></tr>
+    <tr><td class="paramname">elsize</td><td>amount of memory per element </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the allocated memory </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="allocator_8h.html#a2c0aba4221c1ac6801f03ed799f15b12" title="A function pointer to the allocators calloc() function. ">ucx_allocator_calloc()</a> </dd></dl>
+
+</div>
+</div>
+<a id="aaf75b5016098723a9280531ccc3a6d77"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaf75b5016098723a9280531ccc3a6d77">&#9670;&nbsp;</a></span>ucx_mempool_chcap()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_mempool_chcap </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxMempool.html">UcxMempool</a> *&#160;</td>
+          <td class="paramname"><em>pool</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>newcap</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Resizes a memory pool. </p>
+<p>This function will fail if the new capacity is not sufficient for the present data.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pool</td><td>the pool to resize </td></tr>
+    <tr><td class="paramname">newcap</td><td>the new capacity </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>zero on success or non-zero on failure </dd></dl>
+
+</div>
+</div>
+<a id="af096378da7e9bfbed3088497cf4c15bf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af096378da7e9bfbed3088497cf4c15bf">&#9670;&nbsp;</a></span>ucx_mempool_destroy()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_mempool_destroy </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxMempool.html">UcxMempool</a> *&#160;</td>
+          <td class="paramname"><em>pool</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Destroys a memory pool. </p>
+<p>For each element the destructor function (if any) is called and the element is freed.</p>
+<p>Each of the registered destructor function that has no corresponding element within the pool (namely those registered by ucx_mempool_reg_destr) is called interleaving with the element destruction, but with guarantee to the order in which they were registered (FIFO order).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pool</td><td>the mempool to destroy </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="aefa26e3015f5aefadbfc74221bd246ac"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aefa26e3015f5aefadbfc74221bd246ac">&#9670;&nbsp;</a></span>ucx_mempool_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_mempool_free </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxMempool.html">UcxMempool</a> *&#160;</td>
+          <td class="paramname"><em>pool</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>ptr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Frees pooled memory. </p>
+<p>Before freeing the memory, the specified destructor function (if any) is called.</p>
+<p>If you specify memory, that is not pooled by the specified memory pool, the program will terminate with a call to <code>abort()</code>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pool</td><td>the memory pool </td></tr>
+    <tr><td class="paramname">ptr</td><td>a pointer to the memory that shall be freed </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="mempool_8h.html#adb788e7ec24cd7dbdea6381539c549f2" title="Sets a destructor function for the specified memory. ">ucx_mempool_set_destr()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a2ae492b8f2878ccc9837ac213dced11e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2ae492b8f2878ccc9837ac213dced11e">&#9670;&nbsp;</a></span>ucx_mempool_malloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* ucx_mempool_malloc </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxMempool.html">UcxMempool</a> *&#160;</td>
+          <td class="paramname"><em>pool</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>n</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Allocates pooled memory. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pool</td><td>the memory pool </td></tr>
+    <tr><td class="paramname">n</td><td>amount of memory to allocate </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the allocated memory </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="allocator_8h.html#a29f0f6a23a70db3b60635cd6dc384473" title="A function pointer to the allocators malloc() function. ">ucx_allocator_malloc()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ad71cb8c3b6fdb30360376a8b372ef22a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad71cb8c3b6fdb30360376a8b372ef22a">&#9670;&nbsp;</a></span>ucx_mempool_new()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxMempool.html">UcxMempool</a>* ucx_mempool_new </td>
+          <td>(</td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>n</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Creates a memory pool with the specified initial size. </p>
+<p>As the created memory pool automatically grows in size by factor two when trying to allocate memory on a full pool, it is recommended that you use a power of two for the initial size.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">n</td><td>initial pool size (should be a power of two, e.g. 16) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the new memory pool </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="mempool_8h.html#a49f7bd1da5ac201d0cf54dc0f0d82dd2" title="Shorthand for a new default memory pool with a capacity of 16 elements. ">ucx_mempool_new_default()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a660ef42520ed6737c2e77aae18e3a7a4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a660ef42520ed6737c2e77aae18e3a7a4">&#9670;&nbsp;</a></span>ucx_mempool_realloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* ucx_mempool_realloc </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxMempool.html">UcxMempool</a> *&#160;</td>
+          <td class="paramname"><em>pool</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>ptr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>n</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Reallocates pooled memory. </p>
+<p>If the memory to be reallocated is not contained by the specified pool, the behavior is undefined.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pool</td><td>the memory pool </td></tr>
+    <tr><td class="paramname">ptr</td><td>a pointer to the memory that shall be reallocated </td></tr>
+    <tr><td class="paramname">n</td><td>the new size of the memory </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the new location of the memory </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="allocator_8h.html#a6d7cf038a806e327c5da37321d04e426" title="A function pointer to the allocators realloc() function. ">ucx_allocator_realloc()</a> </dd></dl>
+
+</div>
+</div>
+<a id="af47b6b7c40f8f263dc28cc9a4e77b27c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af47b6b7c40f8f263dc28cc9a4e77b27c">&#9670;&nbsp;</a></span>ucx_mempool_reg_destr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_mempool_reg_destr </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxMempool.html">UcxMempool</a> *&#160;</td>
+          <td class="paramname"><em>pool</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>ptr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a>&#160;</td>
+          <td class="paramname"><em>destr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Registers a destructor function for the specified (non-pooled) memory. </p>
+<p>This is useful, if you have memory that has not been allocated by a mempool, but shall be managed by a mempool.</p>
+<p>This function creates an entry in the specified mempool and the memory will therefore (logically) convert to pooled memory. <b>However, this does not cause the memory to be freed automatically!</b>. If you want to use this function, make the memory pool free non-pooled memory, the specified destructor function must call <code>free()</code> by itself. But keep in mind, that you then MUST NOT use this destructor function with pooled memory (e.g. in <a class="el" href="mempool_8h.html#adb788e7ec24cd7dbdea6381539c549f2" title="Sets a destructor function for the specified memory. ">ucx_mempool_set_destr()</a>), as it would cause a double-free.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">pool</td><td>the memory pool </td></tr>
+    <tr><td class="paramname">ptr</td><td>data the destructor is registered for </td></tr>
+    <tr><td class="paramname">destr</td><td>a pointer to the destructor function </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="adb788e7ec24cd7dbdea6381539c549f2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adb788e7ec24cd7dbdea6381539c549f2">&#9670;&nbsp;</a></span>ucx_mempool_set_destr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_mempool_set_destr </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>ptr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a>&#160;</td>
+          <td class="paramname"><em>func</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Sets a destructor function for the specified memory. </p>
+<p>The destructor is automatically called when the memory is freed or the pool is destroyed. A destructor for pooled memory <b>MUST NOT</b> free the memory itself, as this is done by the pool. Use a destructor to free any resources managed by the pooled object.</p>
+<p>The only requirement for the specified memory is, that it <b>MUST</b> be pooled memory by a <a class="el" href="structUcxMempool.html" title="UCX mempool structure. ">UcxMempool</a> or an element-compatible mempool. The pointer to the destructor function is saved in a reserved area before the actual memory.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ptr</td><td>pooled memory </td></tr>
+    <tr><td class="paramname">func</td><td>a pointer to the destructor function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="mempool_8h.html#aefa26e3015f5aefadbfc74221bd246ac" title="Frees pooled memory. ">ucx_mempool_free()</a> </dd>
+<dd>
+<a class="el" href="mempool_8h.html#af096378da7e9bfbed3088497cf4c15bf" title="Destroys a memory pool. ">ucx_mempool_destroy()</a> </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/mempool_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,97 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/mempool.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">mempool.h</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a href="mempool_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment"> * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"> * Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment"> * modification, are permitted provided that the following conditions are met:</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> *   1. Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> *   2. Redistributions in binary form must reproduce the above copyright</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer in the</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment"> *      documentation and/or other materials provided with the distribution.</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment"> * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment"> * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment"> * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"> * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment"> * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment"> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment"> * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE</span></div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> * POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;</div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;<span class="preprocessor">#ifndef UCX_MEMPOOL_H</span></div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;<span class="preprocessor">#define UCX_MEMPOOL_H</span></div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;</div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ucx_8h.html">ucx.h</a>&quot;</span></div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="allocator_8h.html">allocator.h</a>&quot;</span></div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;<span class="preprocessor">#include &lt;stddef.h&gt;</span></div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;</div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;</div><div class="line"><a name="l00052"></a><span class="lineno"><a class="line" href="structUcxMempool.html">   52</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span>{</div><div class="line"><a name="l00054"></a><span class="lineno"><a class="line" href="structUcxMempool.html#ac45fd1e9269399e4c434d6bdaa770d92">   54</a></span>&#160;    <a class="code" href="structUcxAllocator.html">UcxAllocator</a> *<a class="code" href="structUcxMempool.html#ac45fd1e9269399e4c434d6bdaa770d92">allocator</a>;</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;    </div><div class="line"><a name="l00057"></a><span class="lineno"><a class="line" href="structUcxMempool.html#ae98c1b0150bb119ee0a8506a6f310d6e">   57</a></span>&#160;    <span class="keywordtype">void</span>         **<a class="code" href="structUcxMempool.html#ae98c1b0150bb119ee0a8506a6f310d6e">data</a>;</div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;    </div><div class="line"><a name="l00060"></a><span class="lineno"><a class="line" href="structUcxMempool.html#aa3a73ab231e1bc207d526f46f1c1e23a">   60</a></span>&#160;    <span class="keywordtype">size_t</span>       <a class="code" href="structUcxMempool.html#aa3a73ab231e1bc207d526f46f1c1e23a">ndata</a>;</div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;    </div><div class="line"><a name="l00063"></a><span class="lineno"><a class="line" href="structUcxMempool.html#a304729986f2894971d0469e71e196bf0">   63</a></span>&#160;    <span class="keywordtype">size_t</span>       <a class="code" href="structUcxMempool.html#a304729986f2894971d0469e71e196bf0">size</a>;</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;} <a class="code" href="structUcxMempool.html">UcxMempool</a>;</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;</div><div class="line"><a name="l00067"></a><span class="lineno"><a class="line" href="mempool_8h.html#a49f7bd1da5ac201d0cf54dc0f0d82dd2">   67</a></span>&#160;<span class="preprocessor">#define ucx_mempool_new_default() ucx_mempool_new(16)</span></div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;</div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;</div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;<a class="code" href="structUcxMempool.html">UcxMempool</a> *<a class="code" href="mempool_8h.html#ad71cb8c3b6fdb30360376a8b372ef22a">ucx_mempool_new</a>(<span class="keywordtype">size_t</span> n);</div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;<span class="keywordtype">int</span> <a class="code" href="mempool_8h.html#aaf75b5016098723a9280531ccc3a6d77">ucx_mempool_chcap</a>(<a class="code" href="structUcxMempool.html">UcxMempool</a> *pool, <span class="keywordtype">size_t</span> newcap);</div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;<span class="keywordtype">void</span> *<a class="code" href="mempool_8h.html#a2ae492b8f2878ccc9837ac213dced11e">ucx_mempool_malloc</a>(<a class="code" href="structUcxMempool.html">UcxMempool</a> *pool, <span class="keywordtype">size_t</span> n);</div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;<span class="keywordtype">void</span> *<a class="code" href="mempool_8h.html#a4b9142011824ae24f00fabe128417d69">ucx_mempool_calloc</a>(<a class="code" href="structUcxMempool.html">UcxMempool</a> *pool, <span class="keywordtype">size_t</span> nelem, <span class="keywordtype">size_t</span> elsize);</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;</div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;<span class="keywordtype">void</span> *<a class="code" href="mempool_8h.html#a660ef42520ed6737c2e77aae18e3a7a4">ucx_mempool_realloc</a>(<a class="code" href="structUcxMempool.html">UcxMempool</a> *pool, <span class="keywordtype">void</span> *ptr, <span class="keywordtype">size_t</span> n);</div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;</div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;<span class="keywordtype">void</span> <a class="code" href="mempool_8h.html#aefa26e3015f5aefadbfc74221bd246ac">ucx_mempool_free</a>(<a class="code" href="structUcxMempool.html">UcxMempool</a> *pool, <span class="keywordtype">void</span> *ptr);</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;</div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;<span class="keywordtype">void</span> <a class="code" href="mempool_8h.html#af096378da7e9bfbed3088497cf4c15bf">ucx_mempool_destroy</a>(<a class="code" href="structUcxMempool.html">UcxMempool</a> *pool);</div><div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;</div><div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;<span class="keywordtype">void</span> <a class="code" href="mempool_8h.html#adb788e7ec24cd7dbdea6381539c549f2">ucx_mempool_set_destr</a>(<span class="keywordtype">void</span> *ptr, <a class="code" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a> func);</div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;</div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;<span class="keywordtype">void</span> <a class="code" href="mempool_8h.html#af47b6b7c40f8f263dc28cc9a4e77b27c">ucx_mempool_reg_destr</a>(<a class="code" href="structUcxMempool.html">UcxMempool</a> *pool, <span class="keywordtype">void</span> *ptr, <a class="code" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a> destr);</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;</div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;}</div><div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;</div><div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;<span class="preprocessor">#endif  </span><span class="comment">/* UCX_MEMPOOL_H */</span><span class="preprocessor"></span></div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;</div><div class="ttc" id="mempool_8h_html_aefa26e3015f5aefadbfc74221bd246ac"><div class="ttname"><a href="mempool_8h.html#aefa26e3015f5aefadbfc74221bd246ac">ucx_mempool_free</a></div><div class="ttdeci">void ucx_mempool_free(UcxMempool *pool, void *ptr)</div><div class="ttdoc">Frees pooled memory. </div><div class="ttdef"><b>Definition:</b> mempool.c:187</div></div>
+<div class="ttc" id="structUcxMempool_html"><div class="ttname"><a href="structUcxMempool.html">UcxMempool</a></div><div class="ttdoc">UCX mempool structure. </div><div class="ttdef"><b>Definition:</b> mempool.h:52</div></div>
+<div class="ttc" id="mempool_8h_html_af096378da7e9bfbed3088497cf4c15bf"><div class="ttname"><a href="mempool_8h.html#af096378da7e9bfbed3088497cf4c15bf">ucx_mempool_destroy</a></div><div class="ttdeci">void ucx_mempool_destroy(UcxMempool *pool)</div><div class="ttdoc">Destroys a memory pool. </div><div class="ttdef"><b>Definition:</b> mempool.c:209</div></div>
+<div class="ttc" id="ucx_8h_html"><div class="ttname"><a href="ucx_8h.html">ucx.h</a></div><div class="ttdoc">Main UCX Header providing most common definitions. </div></div>
+<div class="ttc" id="mempool_8h_html_aaf75b5016098723a9280531ccc3a6d77"><div class="ttname"><a href="mempool_8h.html#aaf75b5016098723a9280531ccc3a6d77">ucx_mempool_chcap</a></div><div class="ttdeci">int ucx_mempool_chcap(UcxMempool *pool, size_t newcap)</div><div class="ttdoc">Resizes a memory pool. </div><div class="ttdef"><b>Definition:</b> mempool.c:103</div></div>
+<div class="ttc" id="mempool_8h_html_af47b6b7c40f8f263dc28cc9a4e77b27c"><div class="ttname"><a href="mempool_8h.html#af47b6b7c40f8f263dc28cc9a4e77b27c">ucx_mempool_reg_destr</a></div><div class="ttdeci">void ucx_mempool_reg_destr(UcxMempool *pool, void *ptr, ucx_destructor destr)</div><div class="ttdoc">Registers a destructor function for the specified (non-pooled) memory. </div><div class="ttdef"><b>Definition:</b> mempool.c:229</div></div>
+<div class="ttc" id="mempool_8h_html_a2ae492b8f2878ccc9837ac213dced11e"><div class="ttname"><a href="mempool_8h.html#a2ae492b8f2878ccc9837ac213dced11e">ucx_mempool_malloc</a></div><div class="ttdeci">void * ucx_mempool_malloc(UcxMempool *pool, size_t n)</div><div class="ttdoc">Allocates pooled memory. </div><div class="ttdef"><b>Definition:</b> mempool.c:123</div></div>
+<div class="ttc" id="structUcxMempool_html_a304729986f2894971d0469e71e196bf0"><div class="ttname"><a href="structUcxMempool.html#a304729986f2894971d0469e71e196bf0">UcxMempool::size</a></div><div class="ttdeci">size_t size</div><div class="ttdoc">Memory pool size. </div><div class="ttdef"><b>Definition:</b> mempool.h:63</div></div>
+<div class="ttc" id="structUcxMempool_html_aa3a73ab231e1bc207d526f46f1c1e23a"><div class="ttname"><a href="structUcxMempool.html#aa3a73ab231e1bc207d526f46f1c1e23a">UcxMempool::ndata</a></div><div class="ttdeci">size_t ndata</div><div class="ttdoc">Count of pooled memory items. </div><div class="ttdef"><b>Definition:</b> mempool.h:60</div></div>
+<div class="ttc" id="structUcxAllocator_html"><div class="ttname"><a href="structUcxAllocator.html">UcxAllocator</a></div><div class="ttdoc">UCX allocator data structure containing memory management functions. </div><div class="ttdef"><b>Definition:</b> allocator.h:88</div></div>
+<div class="ttc" id="mempool_8h_html_a4b9142011824ae24f00fabe128417d69"><div class="ttname"><a href="mempool_8h.html#a4b9142011824ae24f00fabe128417d69">ucx_mempool_calloc</a></div><div class="ttdeci">void * ucx_mempool_calloc(UcxMempool *pool, size_t nelem, size_t elsize)</div><div class="ttdoc">Allocates a pooled memory array. </div><div class="ttdef"><b>Definition:</b> mempool.c:148</div></div>
+<div class="ttc" id="structUcxMempool_html_ae98c1b0150bb119ee0a8506a6f310d6e"><div class="ttname"><a href="structUcxMempool.html#ae98c1b0150bb119ee0a8506a6f310d6e">UcxMempool::data</a></div><div class="ttdeci">void ** data</div><div class="ttdoc">List of pointers to pooled memory. </div><div class="ttdef"><b>Definition:</b> mempool.h:57</div></div>
+<div class="ttc" id="mempool_8h_html_ad71cb8c3b6fdb30360376a8b372ef22a"><div class="ttname"><a href="mempool_8h.html#ad71cb8c3b6fdb30360376a8b372ef22a">ucx_mempool_new</a></div><div class="ttdeci">UcxMempool * ucx_mempool_new(size_t n)</div><div class="ttdoc">Creates a memory pool with the specified initial size. </div><div class="ttdef"><b>Definition:</b> mempool.c:67</div></div>
+<div class="ttc" id="mempool_8h_html_a660ef42520ed6737c2e77aae18e3a7a4"><div class="ttname"><a href="mempool_8h.html#a660ef42520ed6737c2e77aae18e3a7a4">ucx_mempool_realloc</a></div><div class="ttdeci">void * ucx_mempool_realloc(UcxMempool *pool, void *ptr, size_t n)</div><div class="ttdoc">Reallocates pooled memory. </div><div class="ttdef"><b>Definition:</b> mempool.c:162</div></div>
+<div class="ttc" id="allocator_8h_html"><div class="ttname"><a href="allocator_8h.html">allocator.h</a></div><div class="ttdoc">Allocator for custom memory management. </div></div>
+<div class="ttc" id="structUcxMempool_html_ac45fd1e9269399e4c434d6bdaa770d92"><div class="ttname"><a href="structUcxMempool.html#ac45fd1e9269399e4c434d6bdaa770d92">UcxMempool::allocator</a></div><div class="ttdeci">UcxAllocator * allocator</div><div class="ttdoc">UcxAllocator based on this pool. </div><div class="ttdef"><b>Definition:</b> mempool.h:54</div></div>
+<div class="ttc" id="mempool_8h_html_adb788e7ec24cd7dbdea6381539c549f2"><div class="ttname"><a href="mempool_8h.html#adb788e7ec24cd7dbdea6381539c549f2">ucx_mempool_set_destr</a></div><div class="ttdeci">void ucx_mempool_set_destr(void *ptr, ucx_destructor func)</div><div class="ttdoc">Sets a destructor function for the specified memory. </div><div class="ttdef"><b>Definition:</b> mempool.c:225</div></div>
+<div class="ttc" id="ucx_8h_html_ad2b370c2809914c8b7fedab163c266b3"><div class="ttname"><a href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a></div><div class="ttdeci">void(* ucx_destructor)(void *)</div><div class="ttdoc">A function pointer to a destructor function. </div><div class="ttdef"><b>Definition:</b> ucx.h:72</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/menu.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
+  function makeTree(data,relPath) {
+    var result='';
+    if ('children' in data) {
+      result+='<ul>';
+      for (var i in data.children) {
+        result+='<li><a href="'+relPath+data.children[i].url+'">'+
+                                data.children[i].text+'</a>'+
+                                makeTree(data.children[i],relPath)+'</li>';
+      }
+      result+='</ul>';
+    }
+    return result;
+  }
+
+  $('#main-nav').append(makeTree(menudata,relPath));
+  $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu');
+  if (searchEnabled) {
+    if (serverSide) {
+      $('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><div class="left"><form id="FSearchBox" action="'+searchPage+'" method="get"><img id="MSearchSelect" src="'+relPath+'search/mag.png" alt=""/><input type="text" id="MSearchField" name="query" value="'+search+'" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)"></form></div><div class="right"></div></div></li>');
+    } else {
+      $('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><span class="left"><img id="MSearchSelect" src="'+relPath+'search/mag_sel.png" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" alt=""/><input type="text" id="MSearchField" value="'+search+'" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)" onkeyup="searchBox.OnSearchFieldChange(event)"/></span><span class="right"><a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="'+relPath+'search/close.png" alt=""/></a></span></div></li>');
+    }
+  }
+  $('#main-menu').smartmenus();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/menudata.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,69 @@
+var menudata={children:[
+{text:"Main Page",url:"index.html"},
+{text:"Data Structures",url:"annotated.html",children:[
+{text:"Data Structures",url:"annotated.html"},
+{text:"Data Structure Index",url:"classes.html"},
+{text:"Data Fields",url:"functions.html",children:[
+{text:"All",url:"functions.html",children:[
+{text:"a",url:"functions.html#index_a"},
+{text:"b",url:"functions.html#index_b"},
+{text:"c",url:"functions.html#index_c"},
+{text:"d",url:"functions.html#index_d"},
+{text:"e",url:"functions.html#index_e"},
+{text:"f",url:"functions.html#index_f"},
+{text:"h",url:"functions.html#index_h"},
+{text:"i",url:"functions.html#index_i"},
+{text:"k",url:"functions.html#index_k"},
+{text:"l",url:"functions.html#index_l"},
+{text:"m",url:"functions.html#index_m"},
+{text:"n",url:"functions.html#index_n"},
+{text:"p",url:"functions.html#index_p"},
+{text:"r",url:"functions.html#index_r"},
+{text:"s",url:"functions.html#index_s"},
+{text:"t",url:"functions.html#index_t"},
+{text:"u",url:"functions.html#index_u"},
+{text:"v",url:"functions.html#index_v"},
+{text:"w",url:"functions.html#index_w"}]},
+{text:"Variables",url:"functions_vars.html",children:[
+{text:"a",url:"functions_vars.html#index_a"},
+{text:"b",url:"functions_vars.html#index_b"},
+{text:"c",url:"functions_vars.html#index_c"},
+{text:"d",url:"functions_vars.html#index_d"},
+{text:"e",url:"functions_vars.html#index_e"},
+{text:"f",url:"functions_vars.html#index_f"},
+{text:"h",url:"functions_vars.html#index_h"},
+{text:"i",url:"functions_vars.html#index_i"},
+{text:"k",url:"functions_vars.html#index_k"},
+{text:"l",url:"functions_vars.html#index_l"},
+{text:"m",url:"functions_vars.html#index_m"},
+{text:"n",url:"functions_vars.html#index_n"},
+{text:"p",url:"functions_vars.html#index_p"},
+{text:"r",url:"functions_vars.html#index_r"},
+{text:"s",url:"functions_vars.html#index_s"},
+{text:"t",url:"functions_vars.html#index_t"},
+{text:"u",url:"functions_vars.html#index_u"},
+{text:"v",url:"functions_vars.html#index_v"},
+{text:"w",url:"functions_vars.html#index_w"}]}]}]},
+{text:"Files",url:"files.html",children:[
+{text:"File List",url:"files.html"},
+{text:"Globals",url:"globals.html",children:[
+{text:"All",url:"globals.html",children:[
+{text:"_",url:"globals.html#index__"},
+{text:"a",url:"globals_a.html#index_a"},
+{text:"c",url:"globals_c.html#index_c"},
+{text:"d",url:"globals_d.html#index_d"},
+{text:"p",url:"globals_p.html#index_p"},
+{text:"r",url:"globals_r.html#index_r"},
+{text:"s",url:"globals_s.html#index_s"},
+{text:"u",url:"globals_u.html#index_u"},
+{text:"w",url:"globals_w.html#index_w"}]},
+{text:"Functions",url:"globals_func.html",children:[
+{text:"s",url:"globals_func.html#index_s"},
+{text:"u",url:"globals_func_u.html#index_u"}]},
+{text:"Typedefs",url:"globals_type.html"},
+{text:"Macros",url:"globals_defs.html",children:[
+{text:"_",url:"globals_defs.html#index__"},
+{text:"a",url:"globals_defs.html#index_a"},
+{text:"p",url:"globals_defs.html#index_p"},
+{text:"s",url:"globals_defs.html#index_s"},
+{text:"u",url:"globals_defs.html#index_u"}]}]}]}]}
Binary file docs/api-2.1/nav_f.png has changed
Binary file docs/api-2.1/nav_g.png has changed
Binary file docs/api-2.1/nav_h.png has changed
Binary file docs/api-2.1/open.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/properties_8h.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,393 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/properties.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">properties.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Load / store utilities for properties files.  
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="map_8h_source.html">map.h</a>&quot;</code><br />
+</div>
+<p><a href="properties_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxProperties.html">UcxProperties</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight"><a class="el" href="structUcxProperties.html" title="UcxProperties object for parsing properties data. ">UcxProperties</a> object for parsing properties data.  <a href="structUcxProperties.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a44d9dd12cab3aaa0084f1c8b89405796"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxProperties.html">UcxProperties</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="properties_8h.html#a44d9dd12cab3aaa0084f1c8b89405796">ucx_properties_new</a> ()</td></tr>
+<tr class="memdesc:a44d9dd12cab3aaa0084f1c8b89405796"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a new <a class="el" href="structUcxProperties.html" title="UcxProperties object for parsing properties data. ">UcxProperties</a> object.  <a href="#a44d9dd12cab3aaa0084f1c8b89405796">More...</a><br /></td></tr>
+<tr class="separator:a44d9dd12cab3aaa0084f1c8b89405796"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a38a2fe7bb2986bd87c7e69356ab05c05"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="properties_8h.html#a38a2fe7bb2986bd87c7e69356ab05c05">ucx_properties_free</a> (<a class="el" href="structUcxProperties.html">UcxProperties</a> *prop)</td></tr>
+<tr class="memdesc:a38a2fe7bb2986bd87c7e69356ab05c05"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys a <a class="el" href="structUcxProperties.html" title="UcxProperties object for parsing properties data. ">UcxProperties</a> object.  <a href="#a38a2fe7bb2986bd87c7e69356ab05c05">More...</a><br /></td></tr>
+<tr class="separator:a38a2fe7bb2986bd87c7e69356ab05c05"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaf8de121764a4d22c763ff2ab41f3a4d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="properties_8h.html#aaf8de121764a4d22c763ff2ab41f3a4d">ucx_properties_fill</a> (<a class="el" href="structUcxProperties.html">UcxProperties</a> *prop, char *buf, size_t len)</td></tr>
+<tr class="memdesc:aaf8de121764a4d22c763ff2ab41f3a4d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets the input buffer for the properties parser.  <a href="#aaf8de121764a4d22c763ff2ab41f3a4d">More...</a><br /></td></tr>
+<tr class="separator:aaf8de121764a4d22c763ff2ab41f3a4d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7e03bc573d45d48c538cd721e810d33c"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="properties_8h.html#a7e03bc573d45d48c538cd721e810d33c">ucx_properties_next</a> (<a class="el" href="structUcxProperties.html">UcxProperties</a> *prop, <a class="el" href="structsstr__t.html">sstr_t</a> *name, <a class="el" href="structsstr__t.html">sstr_t</a> *value)</td></tr>
+<tr class="memdesc:a7e03bc573d45d48c538cd721e810d33c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves the next key/value-pair.  <a href="#a7e03bc573d45d48c538cd721e810d33c">More...</a><br /></td></tr>
+<tr class="separator:a7e03bc573d45d48c538cd721e810d33c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5c7ff8bc3139960a3f3dc92072b742f3"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="properties_8h.html#a5c7ff8bc3139960a3f3dc92072b742f3">ucx_properties2map</a> (<a class="el" href="structUcxProperties.html">UcxProperties</a> *prop, <a class="el" href="structUcxMap.html">UcxMap</a> *map)</td></tr>
+<tr class="memdesc:a5c7ff8bc3139960a3f3dc92072b742f3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves all available key/value-pairs and puts them into a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>.  <a href="#a5c7ff8bc3139960a3f3dc92072b742f3">More...</a><br /></td></tr>
+<tr class="separator:a5c7ff8bc3139960a3f3dc92072b742f3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae1b600f839a6b2278b68fc314981a8a3"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="properties_8h.html#ae1b600f839a6b2278b68fc314981a8a3">ucx_properties_load</a> (<a class="el" href="structUcxMap.html">UcxMap</a> *map, FILE *file)</td></tr>
+<tr class="memdesc:ae1b600f839a6b2278b68fc314981a8a3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Loads a properties file to a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>.  <a href="#ae1b600f839a6b2278b68fc314981a8a3">More...</a><br /></td></tr>
+<tr class="separator:ae1b600f839a6b2278b68fc314981a8a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a63c0c1b7648e675b21a1788917ff36fb"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="properties_8h.html#a63c0c1b7648e675b21a1788917ff36fb">ucx_properties_store</a> (<a class="el" href="structUcxMap.html">UcxMap</a> *map, FILE *file)</td></tr>
+<tr class="memdesc:a63c0c1b7648e675b21a1788917ff36fb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Stores a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a> to a file.  <a href="#a63c0c1b7648e675b21a1788917ff36fb">More...</a><br /></td></tr>
+<tr class="separator:a63c0c1b7648e675b21a1788917ff36fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Load / store utilities for properties files. </p>
+<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
+<dd>
+Olaf Wintermann </dd></dl>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a id="a5c7ff8bc3139960a3f3dc92072b742f3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5c7ff8bc3139960a3f3dc92072b742f3">&#9670;&nbsp;</a></span>ucx_properties2map()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_properties2map </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxProperties.html">UcxProperties</a> *&#160;</td>
+          <td class="paramname"><em>prop</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
+          <td class="paramname"><em>map</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Retrieves all available key/value-pairs and puts them into a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>. </p>
+<p>This is done by successive calls to <a class="el" href="properties_8h.html#a7e03bc573d45d48c538cd721e810d33c" title="Retrieves the next key/value-pair. ">ucx_properties_next()</a> until no more key/value-pairs can be retrieved.</p>
+<p>The memory for the map values is allocated by the map's own allocator.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">prop</td><td>the <a class="el" href="structUcxProperties.html" title="UcxProperties object for parsing properties data. ">UcxProperties</a> object </td></tr>
+    <tr><td class="paramname">map</td><td>the target map </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The <a class="el" href="structUcxProperties.html#a34f71a6ab6dcb6892e3b4eb802e75bff" title="Parser error code. ">UcxProperties.error</a> code (i.e. 0 on success). </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="properties_8h.html#aaf8de121764a4d22c763ff2ab41f3a4d" title="Sets the input buffer for the properties parser. ">ucx_properties_fill()</a> </dd>
+<dd>
+<a class="el" href="structUcxMap.html#a531f3e481c1c331cf037b916192e974d" title="An allocator that is used for the map elements. ">UcxMap.allocator</a> </dd></dl>
+
+</div>
+</div>
+<a id="aaf8de121764a4d22c763ff2ab41f3a4d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaf8de121764a4d22c763ff2ab41f3a4d">&#9670;&nbsp;</a></span>ucx_properties_fill()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_properties_fill </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxProperties.html">UcxProperties</a> *&#160;</td>
+          <td class="paramname"><em>prop</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">char *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>len</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Sets the input buffer for the properties parser. </p>
+<p>After calling this function, you may parse the data by calling <a class="el" href="properties_8h.html#a7e03bc573d45d48c538cd721e810d33c" title="Retrieves the next key/value-pair. ">ucx_properties_next()</a> until it returns 0. The function <a class="el" href="properties_8h.html#a5c7ff8bc3139960a3f3dc92072b742f3" title="Retrieves all available key/value-pairs and puts them into a UcxMap. ">ucx_properties2map()</a> is a convenience function that reads as much data as possible by using this function.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">prop</td><td>the <a class="el" href="structUcxProperties.html" title="UcxProperties object for parsing properties data. ">UcxProperties</a> object </td></tr>
+    <tr><td class="paramname">buf</td><td>a pointer to the new buffer </td></tr>
+    <tr><td class="paramname">len</td><td>the payload length of the buffer </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="properties_8h.html#a7e03bc573d45d48c538cd721e810d33c" title="Retrieves the next key/value-pair. ">ucx_properties_next()</a> </dd>
+<dd>
+<a class="el" href="properties_8h.html#a5c7ff8bc3139960a3f3dc92072b742f3" title="Retrieves all available key/value-pairs and puts them into a UcxMap. ">ucx_properties2map()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a38a2fe7bb2986bd87c7e69356ab05c05"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a38a2fe7bb2986bd87c7e69356ab05c05">&#9670;&nbsp;</a></span>ucx_properties_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_properties_free </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxProperties.html">UcxProperties</a> *&#160;</td>
+          <td class="paramname"><em>prop</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Destroys a <a class="el" href="structUcxProperties.html" title="UcxProperties object for parsing properties data. ">UcxProperties</a> object. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">prop</td><td>the <a class="el" href="structUcxProperties.html" title="UcxProperties object for parsing properties data. ">UcxProperties</a> object to destroy </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="ae1b600f839a6b2278b68fc314981a8a3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae1b600f839a6b2278b68fc314981a8a3">&#9670;&nbsp;</a></span>ucx_properties_load()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_properties_load </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
+          <td class="paramname"><em>map</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">FILE *&#160;</td>
+          <td class="paramname"><em>file</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Loads a properties file to a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>. </p>
+<p>This is a convenience function that reads data from an input stream until the end of the stream is reached.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">map</td><td>the map object to write the key/value-pairs to </td></tr>
+    <tr><td class="paramname">file</td><td>the <code>FILE*</code> stream to read from </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>0 on success, or a non-zero value on error</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="properties_8h.html#aaf8de121764a4d22c763ff2ab41f3a4d" title="Sets the input buffer for the properties parser. ">ucx_properties_fill()</a> </dd>
+<dd>
+<a class="el" href="properties_8h.html#a5c7ff8bc3139960a3f3dc92072b742f3" title="Retrieves all available key/value-pairs and puts them into a UcxMap. ">ucx_properties2map()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a44d9dd12cab3aaa0084f1c8b89405796"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a44d9dd12cab3aaa0084f1c8b89405796">&#9670;&nbsp;</a></span>ucx_properties_new()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxProperties.html">UcxProperties</a>* ucx_properties_new </td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Constructs a new <a class="el" href="structUcxProperties.html" title="UcxProperties object for parsing properties data. ">UcxProperties</a> object. </p>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the new <a class="el" href="structUcxProperties.html" title="UcxProperties object for parsing properties data. ">UcxProperties</a> object </dd></dl>
+
+</div>
+</div>
+<a id="a7e03bc573d45d48c538cd721e810d33c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7e03bc573d45d48c538cd721e810d33c">&#9670;&nbsp;</a></span>ucx_properties_next()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_properties_next </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxProperties.html">UcxProperties</a> *&#160;</td>
+          <td class="paramname"><em>prop</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structsstr__t.html">sstr_t</a> *&#160;</td>
+          <td class="paramname"><em>name</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structsstr__t.html">sstr_t</a> *&#160;</td>
+          <td class="paramname"><em>value</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Retrieves the next key/value-pair. </p>
+<p>This function returns a nonzero value as long as there are key/value-pairs found. If no more key/value-pairs are found, you may refill the input buffer with <a class="el" href="properties_8h.html#aaf8de121764a4d22c763ff2ab41f3a4d" title="Sets the input buffer for the properties parser. ">ucx_properties_fill()</a>.</p>
+<p><b>Attention:</b> the <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0" title="A pointer to the string (not necessarily NULL-terminated) ">sstr_t.ptr</a> pointers of the output parameters point to memory within the input buffer of the parser and will get invalid some time. If you want long term copies of the key/value-pairs, use <a class="el" href="string_8h.html#accbfd2b459a028d7af9fb7df6f977d80" title="Creates a duplicate of the specified string. ">sstrdup()</a> after calling this function.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">prop</td><td>the <a class="el" href="structUcxProperties.html" title="UcxProperties object for parsing properties data. ">UcxProperties</a> object </td></tr>
+    <tr><td class="paramname">name</td><td>a pointer to the <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> that shall contain the property name </td></tr>
+    <tr><td class="paramname">value</td><td>a pointer to the <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> that shall contain the property value </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Nonzero, if a key/value-pair was successfully retrieved </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="properties_8h.html#aaf8de121764a4d22c763ff2ab41f3a4d" title="Sets the input buffer for the properties parser. ">ucx_properties_fill()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a63c0c1b7648e675b21a1788917ff36fb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a63c0c1b7648e675b21a1788917ff36fb">&#9670;&nbsp;</a></span>ucx_properties_store()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_properties_store </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td>
+          <td class="paramname"><em>map</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">FILE *&#160;</td>
+          <td class="paramname"><em>file</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Stores a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a> to a file. </p>
+<p>The key/value-pairs are written by using the following format:</p>
+<p><code>[key] = [value]\n</code></p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">map</td><td>the map to store </td></tr>
+    <tr><td class="paramname">file</td><td>the <code>FILE*</code> stream to write to </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>0 on success, or a non-zero value on error </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/properties_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,102 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/properties.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">properties.h</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a href="properties_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment"> * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"> * Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment"> * modification, are permitted provided that the following conditions are met:</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> *   1. Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> *   2. Redistributions in binary form must reproduce the above copyright</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer in the</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment"> *      documentation and/or other materials provided with the distribution.</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment"> * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment"> * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment"> * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"> * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment"> * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment"> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment"> * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE</span></div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> * POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;<span class="preprocessor">#ifndef UCX_PROPERTIES_H</span></div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;<span class="preprocessor">#define UCX_PROPERTIES_H</span></div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;</div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ucx_8h.html">ucx.h</a>&quot;</span></div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="map_8h.html">map.h</a>&quot;</span></div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;</div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;</div><div class="line"><a name="l00053"></a><span class="lineno"><a class="line" href="structUcxProperties.html">   53</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span>{</div><div class="line"><a name="l00058"></a><span class="lineno"><a class="line" href="structUcxProperties.html#a6bb4d29686df41a0f42641ee15232bfd">   58</a></span>&#160;    <span class="keywordtype">char</span>   *<a class="code" href="structUcxProperties.html#a6bb4d29686df41a0f42641ee15232bfd">buffer</a>;</div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;    </div><div class="line"><a name="l00064"></a><span class="lineno"><a class="line" href="structUcxProperties.html#a4e7524434525267e29f493a25dcca6b5">   64</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="structUcxProperties.html#a4e7524434525267e29f493a25dcca6b5">buflen</a>;</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;    </div><div class="line"><a name="l00070"></a><span class="lineno"><a class="line" href="structUcxProperties.html#addd36ac8e5e42241c0a57453633970db">   70</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="structUcxProperties.html#addd36ac8e5e42241c0a57453633970db">pos</a>;</div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;    </div><div class="line"><a name="l00076"></a><span class="lineno"><a class="line" href="structUcxProperties.html#a68556d4260153f58dde44e4c365edce6">   76</a></span>&#160;    <span class="keywordtype">char</span>   *<a class="code" href="structUcxProperties.html#a68556d4260153f58dde44e4c365edce6">tmp</a>;</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;    </div><div class="line"><a name="l00082"></a><span class="lineno"><a class="line" href="structUcxProperties.html#a8a81853d5903bee2f4e1fa53fdffae6e">   82</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="structUcxProperties.html#a8a81853d5903bee2f4e1fa53fdffae6e">tmplen</a>;</div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;    </div><div class="line"><a name="l00088"></a><span class="lineno"><a class="line" href="structUcxProperties.html#a5af10131ea9f679b4ee174499f92e210">   88</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="structUcxProperties.html#a5af10131ea9f679b4ee174499f92e210">tmpcap</a>;</div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;    </div><div class="line"><a name="l00095"></a><span class="lineno"><a class="line" href="structUcxProperties.html#a34f71a6ab6dcb6892e3b4eb802e75bff">   95</a></span>&#160;    <span class="keywordtype">int</span>    <a class="code" href="structUcxProperties.html#a34f71a6ab6dcb6892e3b4eb802e75bff">error</a>;</div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;    </div><div class="line"><a name="l00101"></a><span class="lineno"><a class="line" href="structUcxProperties.html#af6adb3f69616cf9d2bb5ea7b4d837ca5">  101</a></span>&#160;    <span class="keywordtype">char</span>   <a class="code" href="structUcxProperties.html#af6adb3f69616cf9d2bb5ea7b4d837ca5">delimiter</a>;</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;    </div><div class="line"><a name="l00107"></a><span class="lineno"><a class="line" href="structUcxProperties.html#afaa2e6a289fa6949b7b01df35fa5def8">  107</a></span>&#160;    <span class="keywordtype">char</span>   <a class="code" href="structUcxProperties.html#afaa2e6a289fa6949b7b01df35fa5def8">comment1</a>;</div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;    </div><div class="line"><a name="l00113"></a><span class="lineno"><a class="line" href="structUcxProperties.html#a9ea7ecb414ca8bc7bef62cdd19cc6363">  113</a></span>&#160;    <span class="keywordtype">char</span>   <a class="code" href="structUcxProperties.html#a9ea7ecb414ca8bc7bef62cdd19cc6363">comment2</a>;</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;    </div><div class="line"><a name="l00119"></a><span class="lineno"><a class="line" href="structUcxProperties.html#a5f3e561e32bac03e36a191a6940cca92">  119</a></span>&#160;    <span class="keywordtype">char</span>   <a class="code" href="structUcxProperties.html#a5f3e561e32bac03e36a191a6940cca92">comment3</a>;</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;} <a class="code" href="structUcxProperties.html">UcxProperties</a>;</div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;<a class="code" href="structUcxProperties.html">UcxProperties</a> *<a class="code" href="properties_8h.html#a44d9dd12cab3aaa0084f1c8b89405796">ucx_properties_new</a>();</div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;</div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;<span class="keywordtype">void</span> <a class="code" href="properties_8h.html#a38a2fe7bb2986bd87c7e69356ab05c05">ucx_properties_free</a>(<a class="code" href="structUcxProperties.html">UcxProperties</a> *prop);</div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;</div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;<span class="keywordtype">void</span> <a class="code" href="properties_8h.html#aaf8de121764a4d22c763ff2ab41f3a4d">ucx_properties_fill</a>(<a class="code" href="structUcxProperties.html">UcxProperties</a> *prop, <span class="keywordtype">char</span> *buf, <span class="keywordtype">size_t</span> len);</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;</div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;<span class="keywordtype">int</span> <a class="code" href="properties_8h.html#a7e03bc573d45d48c538cd721e810d33c">ucx_properties_next</a>(<a class="code" href="structUcxProperties.html">UcxProperties</a> *prop, <a class="code" href="structsstr__t.html">sstr_t</a> *name, <a class="code" href="structsstr__t.html">sstr_t</a> *value);</div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;</div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;<span class="keywordtype">int</span> <a class="code" href="properties_8h.html#a5c7ff8bc3139960a3f3dc92072b742f3">ucx_properties2map</a>(<a class="code" href="structUcxProperties.html">UcxProperties</a> *prop, <a class="code" href="structUcxMap.html">UcxMap</a> *map);</div><div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;<span class="keywordtype">int</span> <a class="code" href="properties_8h.html#ae1b600f839a6b2278b68fc314981a8a3">ucx_properties_load</a>(<a class="code" href="structUcxMap.html">UcxMap</a> *map, FILE *file);</div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;</div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;<span class="keywordtype">int</span> <a class="code" href="properties_8h.html#a63c0c1b7648e675b21a1788917ff36fb">ucx_properties_store</a>(<a class="code" href="structUcxMap.html">UcxMap</a> *map, FILE *file);</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;</div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;}</div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;</div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;<span class="preprocessor">#endif  </span><span class="comment">/* UCX_PROPERTIES_H */</span><span class="preprocessor"></span></div><div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;</div><div class="ttc" id="structsstr__t_html"><div class="ttname"><a href="structsstr__t.html">sstr_t</a></div><div class="ttdoc">The UCX string structure. </div><div class="ttdef"><b>Definition:</b> string.h:90</div></div>
+<div class="ttc" id="properties_8h_html_a44d9dd12cab3aaa0084f1c8b89405796"><div class="ttname"><a href="properties_8h.html#a44d9dd12cab3aaa0084f1c8b89405796">ucx_properties_new</a></div><div class="ttdeci">UcxProperties * ucx_properties_new()</div><div class="ttdoc">Constructs a new UcxProperties object. </div><div class="ttdef"><b>Definition:</b> properties.c:35</div></div>
+<div class="ttc" id="structUcxProperties_html_a5f3e561e32bac03e36a191a6940cca92"><div class="ttname"><a href="structUcxProperties.html#a5f3e561e32bac03e36a191a6940cca92">UcxProperties::comment3</a></div><div class="ttdeci">char comment3</div><div class="ttdoc">The third comment character. </div><div class="ttdef"><b>Definition:</b> properties.h:119</div></div>
+<div class="ttc" id="ucx_8h_html"><div class="ttname"><a href="ucx_8h.html">ucx.h</a></div><div class="ttdoc">Main UCX Header providing most common definitions. </div></div>
+<div class="ttc" id="structUcxProperties_html_addd36ac8e5e42241c0a57453633970db"><div class="ttname"><a href="structUcxProperties.html#addd36ac8e5e42241c0a57453633970db">UcxProperties::pos</a></div><div class="ttdeci">size_t pos</div><div class="ttdoc">Current buffer position (don&amp;#39;t set manually). </div><div class="ttdef"><b>Definition:</b> properties.h:70</div></div>
+<div class="ttc" id="structUcxProperties_html_a9ea7ecb414ca8bc7bef62cdd19cc6363"><div class="ttname"><a href="structUcxProperties.html#a9ea7ecb414ca8bc7bef62cdd19cc6363">UcxProperties::comment2</a></div><div class="ttdeci">char comment2</div><div class="ttdoc">The second comment character. </div><div class="ttdef"><b>Definition:</b> properties.h:113</div></div>
+<div class="ttc" id="properties_8h_html_ae1b600f839a6b2278b68fc314981a8a3"><div class="ttname"><a href="properties_8h.html#ae1b600f839a6b2278b68fc314981a8a3">ucx_properties_load</a></div><div class="ttdeci">int ucx_properties_load(UcxMap *map, FILE *file)</div><div class="ttdoc">Loads a properties file to a UcxMap. </div><div class="ttdef"><b>Definition:</b> properties.c:222</div></div>
+<div class="ttc" id="structUcxProperties_html"><div class="ttname"><a href="structUcxProperties.html">UcxProperties</a></div><div class="ttdoc">UcxProperties object for parsing properties data. </div><div class="ttdef"><b>Definition:</b> properties.h:53</div></div>
+<div class="ttc" id="structUcxProperties_html_a4e7524434525267e29f493a25dcca6b5"><div class="ttname"><a href="structUcxProperties.html#a4e7524434525267e29f493a25dcca6b5">UcxProperties::buflen</a></div><div class="ttdeci">size_t buflen</div><div class="ttdoc">Length of the input buffer (don&amp;#39;t set manually). </div><div class="ttdef"><b>Definition:</b> properties.h:64</div></div>
+<div class="ttc" id="structUcxProperties_html_a6bb4d29686df41a0f42641ee15232bfd"><div class="ttname"><a href="structUcxProperties.html#a6bb4d29686df41a0f42641ee15232bfd">UcxProperties::buffer</a></div><div class="ttdeci">char * buffer</div><div class="ttdoc">Input buffer (don&amp;#39;t set manually). </div><div class="ttdef"><b>Definition:</b> properties.h:58</div></div>
+<div class="ttc" id="structUcxProperties_html_a34f71a6ab6dcb6892e3b4eb802e75bff"><div class="ttname"><a href="structUcxProperties.html#a34f71a6ab6dcb6892e3b4eb802e75bff">UcxProperties::error</a></div><div class="ttdeci">int error</div><div class="ttdoc">Parser error code. </div><div class="ttdef"><b>Definition:</b> properties.h:95</div></div>
+<div class="ttc" id="structUcxProperties_html_a8a81853d5903bee2f4e1fa53fdffae6e"><div class="ttname"><a href="structUcxProperties.html#a8a81853d5903bee2f4e1fa53fdffae6e">UcxProperties::tmplen</a></div><div class="ttdeci">size_t tmplen</div><div class="ttdoc">Internal temporary buffer length (don&amp;#39;t set manually). </div><div class="ttdef"><b>Definition:</b> properties.h:82</div></div>
+<div class="ttc" id="structUcxProperties_html_afaa2e6a289fa6949b7b01df35fa5def8"><div class="ttname"><a href="structUcxProperties.html#afaa2e6a289fa6949b7b01df35fa5def8">UcxProperties::comment1</a></div><div class="ttdeci">char comment1</div><div class="ttdoc">The first comment character. </div><div class="ttdef"><b>Definition:</b> properties.h:107</div></div>
+<div class="ttc" id="properties_8h_html_a7e03bc573d45d48c538cd721e810d33c"><div class="ttname"><a href="properties_8h.html#a7e03bc573d45d48c538cd721e810d33c">ucx_properties_next</a></div><div class="ttdeci">int ucx_properties_next(UcxProperties *prop, sstr_t *name, sstr_t *value)</div><div class="ttdoc">Retrieves the next key/value-pair. </div><div class="ttdef"><b>Definition:</b> properties.c:80</div></div>
+<div class="ttc" id="properties_8h_html_a5c7ff8bc3139960a3f3dc92072b742f3"><div class="ttname"><a href="properties_8h.html#a5c7ff8bc3139960a3f3dc92072b742f3">ucx_properties2map</a></div><div class="ttdeci">int ucx_properties2map(UcxProperties *prop, UcxMap *map)</div><div class="ttdoc">Retrieves all available key/value-pairs and puts them into a UcxMap. </div><div class="ttdef"><b>Definition:</b> properties.c:200</div></div>
+<div class="ttc" id="structUcxProperties_html_af6adb3f69616cf9d2bb5ea7b4d837ca5"><div class="ttname"><a href="structUcxProperties.html#af6adb3f69616cf9d2bb5ea7b4d837ca5">UcxProperties::delimiter</a></div><div class="ttdeci">char delimiter</div><div class="ttdoc">The delimiter that shall be used. </div><div class="ttdef"><b>Definition:</b> properties.h:101</div></div>
+<div class="ttc" id="structUcxProperties_html_a68556d4260153f58dde44e4c365edce6"><div class="ttname"><a href="structUcxProperties.html#a68556d4260153f58dde44e4c365edce6">UcxProperties::tmp</a></div><div class="ttdeci">char * tmp</div><div class="ttdoc">Internal temporary buffer (don&amp;#39;t set manually). </div><div class="ttdef"><b>Definition:</b> properties.h:76</div></div>
+<div class="ttc" id="structUcxMap_html"><div class="ttname"><a href="structUcxMap.html">UcxMap</a></div><div class="ttdoc">Structure for the UCX map. </div><div class="ttdef"><b>Definition:</b> map.h:81</div></div>
+<div class="ttc" id="structUcxProperties_html_a5af10131ea9f679b4ee174499f92e210"><div class="ttname"><a href="structUcxProperties.html#a5af10131ea9f679b4ee174499f92e210">UcxProperties::tmpcap</a></div><div class="ttdeci">size_t tmpcap</div><div class="ttdoc">Internal temporary buffer capacity (don&amp;#39;t set manually). </div><div class="ttdef"><b>Definition:</b> properties.h:88</div></div>
+<div class="ttc" id="map_8h_html"><div class="ttname"><a href="map_8h.html">map.h</a></div><div class="ttdoc">Hash map implementation. </div></div>
+<div class="ttc" id="properties_8h_html_aaf8de121764a4d22c763ff2ab41f3a4d"><div class="ttname"><a href="properties_8h.html#aaf8de121764a4d22c763ff2ab41f3a4d">ucx_properties_fill</a></div><div class="ttdeci">void ucx_properties_fill(UcxProperties *prop, char *buf, size_t len)</div><div class="ttdoc">Sets the input buffer for the properties parser. </div><div class="ttdef"><b>Definition:</b> properties.c:64</div></div>
+<div class="ttc" id="properties_8h_html_a63c0c1b7648e675b21a1788917ff36fb"><div class="ttname"><a href="properties_8h.html#a63c0c1b7648e675b21a1788917ff36fb">ucx_properties_store</a></div><div class="ttdeci">int ucx_properties_store(UcxMap *map, FILE *file)</div><div class="ttdoc">Stores a UcxMap to a file. </div><div class="ttdef"><b>Definition:</b> properties.c:242</div></div>
+<div class="ttc" id="properties_8h_html_a38a2fe7bb2986bd87c7e69356ab05c05"><div class="ttname"><a href="properties_8h.html#a38a2fe7bb2986bd87c7e69356ab05c05">ucx_properties_free</a></div><div class="ttdeci">void ucx_properties_free(UcxProperties *prop)</div><div class="ttdoc">Destroys a UcxProperties object. </div><div class="ttdef"><b>Definition:</b> properties.c:57</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_0.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_0.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['_5f_5ffunction_5f_5f',['__FUNCTION__',['../test_8h.html#a828bb1dfda1afd67ca795075903d227d',1,'test.h']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_1.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_1.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,11 @@
+var searchData=
+[
+  ['alcalloc',['alcalloc',['../allocator_8h.html#a8d71470816f88f78cb9a9686c57e1b10',1,'allocator.h']]],
+  ['alfree',['alfree',['../allocator_8h.html#acd775785b54e97dc2b33a432c12c8fb2',1,'allocator.h']]],
+  ['allocator',['allocator',['../structUcxArray.html#a2ef31303b7548b9aa8e2b9187e295212',1,'UcxArray::allocator()'],['../structUcxAVLTree.html#a30652776b540156ad54c7d52833e4e28',1,'UcxAVLTree::allocator()'],['../structUcxMap.html#a531f3e481c1c331cf037b916192e974d',1,'UcxMap::allocator()'],['../structUcxMempool.html#ac45fd1e9269399e4c434d6bdaa770d92',1,'UcxMempool::allocator()'],['../structUcxStack.html#a33cda4f6890ac56ab31701598bc1ae10',1,'UcxStack::allocator()']]],
+  ['allocator_2eh',['allocator.h',['../allocator_8h.html',1,'']]],
+  ['almalloc',['almalloc',['../allocator_8h.html#ae1bc218fea8a35f4a3706f0beefcfb19',1,'allocator.h']]],
+  ['alrealloc',['alrealloc',['../allocator_8h.html#a029ee5c9bcbb3f873571553f788c5820',1,'allocator.h']]],
+  ['array_2eh',['array.h',['../array_8h.html',1,'']]],
+  ['avl_2eh',['avl.h',['../avl_8h.html',1,'']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_10.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_10.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_10.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,10 @@
+var searchData=
+[
+  ['test',['test',['../structUcxTestList.html#a6022faa52e772b073141ca0a2f5a56c9',1,'UcxTestList']]],
+  ['test_2eh',['test.h',['../test_8h.html',1,'']]],
+  ['tests',['tests',['../structUcxTestSuite.html#a630677a70ebc2c3296704cda3196492b',1,'UcxTestSuite']]],
+  ['tmp',['tmp',['../structUcxProperties.html#a68556d4260153f58dde44e4c365edce6',1,'UcxProperties']]],
+  ['tmpcap',['tmpcap',['../structUcxProperties.html#a5af10131ea9f679b4ee174499f92e210',1,'UcxProperties']]],
+  ['tmplen',['tmplen',['../structUcxProperties.html#a8a81853d5903bee2f4e1fa53fdffae6e',1,'UcxProperties']]],
+  ['top',['top',['../structUcxStack.html#af0ff6f58edce469f17683013b86ade27',1,'UcxStack']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_11.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_11.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_11.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,271 @@
+var searchData=
+[
+  ['uap_20common_20extensions',['UAP Common Extensions',['../index.html',1,'']]],
+  ['ucx_2eh',['ucx.h',['../ucx_8h.html',1,'']]],
+  ['ucx_5fallocator_5fcalloc',['ucx_allocator_calloc',['../allocator_8h.html#a2c0aba4221c1ac6801f03ed799f15b12',1,'allocator.h']]],
+  ['ucx_5fallocator_5fdefault',['UCX_ALLOCATOR_DEFAULT',['../allocator_8h.html#a1283a8f875f90a7af3aba5e031fc2e3f',1,'allocator.h']]],
+  ['ucx_5fallocator_5ffree',['ucx_allocator_free',['../allocator_8h.html#aaf2387ddaddd8ab4b267e6b00e5d6f7e',1,'allocator.h']]],
+  ['ucx_5fallocator_5fmalloc',['ucx_allocator_malloc',['../allocator_8h.html#a29f0f6a23a70db3b60635cd6dc384473',1,'allocator.h']]],
+  ['ucx_5fallocator_5frealloc',['ucx_allocator_realloc',['../allocator_8h.html#a6d7cf038a806e327c5da37321d04e426',1,'allocator.h']]],
+  ['ucx_5farray_5fappend_5ffrom',['ucx_array_append_from',['../array_8h.html#aea01731ad94ea73c0c8fb1d1b7a35fcf',1,'array.c']]],
+  ['ucx_5farray_5fat',['ucx_array_at',['../array_8h.html#aa698085fd1a8b70d6b709999c51b49e8',1,'array.c']]],
+  ['ucx_5farray_5fclone',['ucx_array_clone',['../array_8h.html#a4a8c273370e4a3a3e2624e364f5ab410',1,'array.c']]],
+  ['ucx_5farray_5fconcat',['ucx_array_concat',['../array_8h.html#aa5a0bf3d3f0df6406beb0e569021cc28',1,'array.c']]],
+  ['ucx_5farray_5fcontains',['ucx_array_contains',['../array_8h.html#a5241058cd2329147bc5b1593ae7e51dc',1,'array.c']]],
+  ['ucx_5farray_5fdestroy',['ucx_array_destroy',['../array_8h.html#a8e83681d8d5d8cddbf10f63ce5be4c10',1,'array.c']]],
+  ['ucx_5farray_5fequals',['ucx_array_equals',['../array_8h.html#a43292b448adb1741677aa8c578bcc201',1,'array.c']]],
+  ['ucx_5farray_5ffind',['ucx_array_find',['../array_8h.html#ae7bdbed94afee9b20b38b95e3ab470f0',1,'array.c']]],
+  ['ucx_5farray_5ffree',['ucx_array_free',['../array_8h.html#ac01ee914468a16f470bf3071fffbe438',1,'array.c']]],
+  ['ucx_5farray_5fgrow',['ucx_array_grow',['../array_8h.html#ab0cbf243824aaebee48277315e03afce',1,'array.c']]],
+  ['ucx_5farray_5finit',['ucx_array_init',['../array_8h.html#ad921e85c28ffae32230777a53c5037e5',1,'array.c']]],
+  ['ucx_5farray_5finit_5fa',['ucx_array_init_a',['../array_8h.html#a2451e61ebb15a7ba1c1319267ba75b8c',1,'array.c']]],
+  ['ucx_5farray_5fnew',['ucx_array_new',['../array_8h.html#a994a2fbf1c33a3833e2a70cd9a4352b7',1,'array.c']]],
+  ['ucx_5farray_5fnew_5fa',['ucx_array_new_a',['../array_8h.html#a177170258c215eb2e4f5a32e59f0cb1b',1,'array.c']]],
+  ['ucx_5farray_5fprepend_5ffrom',['ucx_array_prepend_from',['../array_8h.html#a95b52acc2193b5c33cf0eaa4f2082477',1,'array.c']]],
+  ['ucx_5farray_5fremove',['ucx_array_remove',['../array_8h.html#aa45eac6b697f83adac81c0860cf306b8',1,'array.c']]],
+  ['ucx_5farray_5fremove_5ffast',['ucx_array_remove_fast',['../array_8h.html#a548d81b07612bae3ba8c4c4b49104b8e',1,'array.c']]],
+  ['ucx_5farray_5freserve',['ucx_array_reserve',['../array_8h.html#a1c3bf8433c1de3c933f3854ab297fe1d',1,'array.c']]],
+  ['ucx_5farray_5fresize',['ucx_array_resize',['../array_8h.html#a27762e7c06a6c781015e3c8ceeee0ce3',1,'array.c']]],
+  ['ucx_5farray_5fset_5ffrom',['ucx_array_set_from',['../array_8h.html#a1bb545d065358d265d80d815ba382a28',1,'array.c']]],
+  ['ucx_5farray_5fshrink',['ucx_array_shrink',['../array_8h.html#a2daf50e80aee9bccebee876a7efd2dfc',1,'array.c']]],
+  ['ucx_5farray_5fsort',['ucx_array_sort',['../array_8h.html#add773514569b872a6624381b4b6af52c',1,'array.c']]],
+  ['ucx_5farray_5futil_5fset',['ucx_array_util_set',['../array_8h.html#a1d959c29af3125bdd37cde3a554e729c',1,'array.h']]],
+  ['ucx_5farray_5futil_5fset_5fa',['ucx_array_util_set_a',['../array_8h.html#ad0a8d76980cf1c1910e64a245803fb9a',1,'array.c']]],
+  ['ucx_5farray_5futil_5fsetptr',['ucx_array_util_setptr',['../array_8h.html#a59a5b342965e790945f9c7a3f86b99f9',1,'array.h']]],
+  ['ucx_5farray_5futil_5fsetptr_5fa',['ucx_array_util_setptr_a',['../array_8h.html#ad708b333c0c1b02c998309a58ea65e31',1,'array.c']]],
+  ['ucx_5fasprintf',['ucx_asprintf',['../utils_8h.html#a9f9cf0e89ffdc256ecb35429907f51f5',1,'utils.c']]],
+  ['ucx_5favl_5fcount',['ucx_avl_count',['../avl_8h.html#a92c1d41c2b22fe4a029a486ab2153e35',1,'avl.c']]],
+  ['ucx_5favl_5fdefault_5fnew',['ucx_avl_default_new',['../avl_8h.html#ac2886d4b79b48c9fabf6408873f84cd2',1,'avl.h']]],
+  ['ucx_5favl_5ffind',['ucx_avl_find',['../avl_8h.html#a51770e1614b28d7d22dea096c3704f83',1,'avl.c']]],
+  ['ucx_5favl_5ffind_5fclosest',['UCX_AVL_FIND_CLOSEST',['../avl_8h.html#af16f24d74fd6af0154de041566c6603b',1,'avl.h']]],
+  ['ucx_5favl_5ffind_5fexact',['UCX_AVL_FIND_EXACT',['../avl_8h.html#aaaf4a6f6f661cda7791db239212285d9',1,'avl.h']]],
+  ['ucx_5favl_5ffind_5flower_5fbounded',['UCX_AVL_FIND_LOWER_BOUNDED',['../avl_8h.html#abd2446d544d5412b6997ee8a17bd368c',1,'avl.h']]],
+  ['ucx_5favl_5ffind_5fnode',['ucx_avl_find_node',['../avl_8h.html#a664986f64d6865605199fbff06e19cd5',1,'avl.c']]],
+  ['ucx_5favl_5ffind_5fupper_5fbounded',['UCX_AVL_FIND_UPPER_BOUNDED',['../avl_8h.html#ac74ee7649c1e206b08b31f37dd68ca5e',1,'avl.h']]],
+  ['ucx_5favl_5ffree',['ucx_avl_free',['../avl_8h.html#a2f92db538f25fce908d2cb3e5590944c',1,'avl.c']]],
+  ['ucx_5favl_5ffree_5fcontent',['ucx_avl_free_content',['../avl_8h.html#a31ad7fb196ca211f1fc39f4e15f72279',1,'avl.c']]],
+  ['ucx_5favl_5fget',['ucx_avl_get',['../avl_8h.html#adbcf7ceb3f014a30c7214f7304519efe',1,'avl.c']]],
+  ['ucx_5favl_5fget_5fnode',['ucx_avl_get_node',['../avl_8h.html#acf42da9a4168e47dc10b4ba0d27ceb4e',1,'avl.c']]],
+  ['ucx_5favl_5fnew',['ucx_avl_new',['../avl_8h.html#a11b043d65a11b7092d5d98b298e5ede3',1,'avl.c']]],
+  ['ucx_5favl_5fnew_5fa',['ucx_avl_new_a',['../avl_8h.html#af0f868d67e9dc08b4867c02a06c23ee2',1,'avl.c']]],
+  ['ucx_5favl_5fpred',['ucx_avl_pred',['../avl_8h.html#a0e739aeb66dda6a6a3f6eb51b50cf346',1,'avl.c']]],
+  ['ucx_5favl_5fput',['ucx_avl_put',['../avl_8h.html#aec401fab4a24a7edffa734f9baf88577',1,'avl.c']]],
+  ['ucx_5favl_5fput_5fs',['ucx_avl_put_s',['../avl_8h.html#a32cf8955cc0226a82bacfc7b76d6474c',1,'avl.c']]],
+  ['ucx_5favl_5fremove',['ucx_avl_remove',['../avl_8h.html#a1d821119c805d7fbb7e424bc3effeba9',1,'avl.c']]],
+  ['ucx_5favl_5fremove_5fnode',['ucx_avl_remove_node',['../avl_8h.html#a9a792b7d9e58073deef74a341f8bc720',1,'avl.c']]],
+  ['ucx_5favl_5fremove_5fs',['ucx_avl_remove_s',['../avl_8h.html#a01aeeecd6415f0cc2b623486eb28f254',1,'avl.c']]],
+  ['ucx_5favl_5fsucc',['ucx_avl_succ',['../avl_8h.html#aab1ad9b027ff5e50671aa0ee84e2d541',1,'avl.c']]],
+  ['ucx_5fbprintf',['ucx_bprintf',['../utils_8h.html#a9d7d65a420f026fcb6982803d5120519',1,'utils.h']]],
+  ['ucx_5fbuffer_5fautoextend',['UCX_BUFFER_AUTOEXTEND',['../buffer_8h.html#a05f9565f2d04399168c3b1c152a632be',1,'buffer.h']]],
+  ['ucx_5fbuffer_5fautofree',['UCX_BUFFER_AUTOFREE',['../buffer_8h.html#a8bab11ad8a76719228b9ee91e2e45535',1,'buffer.h']]],
+  ['ucx_5fbuffer_5fclear',['ucx_buffer_clear',['../buffer_8h.html#a374abd5aabfcc3ee0777a79d5fe651ab',1,'buffer.h']]],
+  ['ucx_5fbuffer_5fclone',['ucx_buffer_clone',['../buffer_8h.html#a828353846428c2c2f695f9938f059e52',1,'buffer.h']]],
+  ['ucx_5fbuffer_5fdefault',['UCX_BUFFER_DEFAULT',['../buffer_8h.html#acc77c8ed7b26854f555d4a5d11e49ea2',1,'buffer.h']]],
+  ['ucx_5fbuffer_5feof',['ucx_buffer_eof',['../buffer_8h.html#abad7fd9ad5061224c780b8d1d4c55f09',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fextend',['ucx_buffer_extend',['../buffer_8h.html#afaf97d2cd7e9faad79a9d35fe33e30c6',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fextract',['ucx_buffer_extract',['../buffer_8h.html#a33fa7bb35fe08bbb3542f227514332ef',1,'buffer.c']]],
+  ['ucx_5fbuffer_5ffree',['ucx_buffer_free',['../buffer_8h.html#a2af8646d8905c22c7322e7540b0440af',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fgetc',['ucx_buffer_getc',['../buffer_8h.html#a396339022159ce4ca6d069de9f9209b0',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fnew',['ucx_buffer_new',['../buffer_8h.html#aacea876d692193ec6f859ce98da7351c',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fputc',['ucx_buffer_putc',['../buffer_8h.html#a7d6f01b9d631b0123475dfb98fb849ac',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fputs',['ucx_buffer_puts',['../buffer_8h.html#af1d4b478e04b3ae0bf30e7c2ea964ea2',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fread',['ucx_buffer_read',['../buffer_8h.html#ae5c3430759f0059547b35d5a254d4da5',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fseek',['ucx_buffer_seek',['../buffer_8h.html#a47d98482662073c74f35deb0957d15d1',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fshift',['ucx_buffer_shift',['../buffer_8h.html#a12a0c6a2379ef080043e6286bb8bad69',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fshift_5fleft',['ucx_buffer_shift_left',['../buffer_8h.html#a20431dd0ed6a6fe9f15333bd72afe4db',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fshift_5fright',['ucx_buffer_shift_right',['../buffer_8h.html#a4fa10b6471495547eb981248fd4f1bc2',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fto_5fsstr',['ucx_buffer_to_sstr',['../buffer_8h.html#a0f4b64f1b3a74c4f6c5d9409d6b6086a',1,'buffer.h']]],
+  ['ucx_5fbuffer_5fwrite',['ucx_buffer_write',['../buffer_8h.html#af8aacc7401814392b58c1b7b81bffc05',1,'buffer.c']]],
+  ['ucx_5fcmp_5fdouble',['ucx_cmp_double',['../utils_8h.html#ab804b7c27d0bfcd7bf3a3583140825b6',1,'utils.c']]],
+  ['ucx_5fcmp_5ffloat',['ucx_cmp_float',['../utils_8h.html#ad1196b561bcdad76c393885819769a97',1,'utils.c']]],
+  ['ucx_5fcmp_5fint',['ucx_cmp_int',['../utils_8h.html#a8ce7e11e6b3deafe89a32a091fde7f16',1,'utils.c']]],
+  ['ucx_5fcmp_5fint16',['ucx_cmp_int16',['../utils_8h.html#aa29e6e559946375e34113e34e0b0bd0d',1,'utils.c']]],
+  ['ucx_5fcmp_5fint32',['ucx_cmp_int32',['../utils_8h.html#a858b2ac443fb202643b71f6a7e9218dd',1,'utils.c']]],
+  ['ucx_5fcmp_5fint64',['ucx_cmp_int64',['../utils_8h.html#a54701aea6a89fed1402dfb0bf56bc7f6',1,'utils.c']]],
+  ['ucx_5fcmp_5flongint',['ucx_cmp_longint',['../utils_8h.html#aeb57a2b9a6aaa0460c7a6bec29accf2c',1,'utils.c']]],
+  ['ucx_5fcmp_5flonglong',['ucx_cmp_longlong',['../utils_8h.html#a366b57def20f86a41eaedf575eea5375',1,'utils.c']]],
+  ['ucx_5fcmp_5fmem',['ucx_cmp_mem',['../utils_8h.html#aff7d2bcded71196831a8c0664333f8e7',1,'utils.c']]],
+  ['ucx_5fcmp_5fptr',['ucx_cmp_ptr',['../utils_8h.html#aa174d539de3ea59be4f9640f17ce53d8',1,'utils.c']]],
+  ['ucx_5fcmp_5fsstr',['ucx_cmp_sstr',['../utils_8h.html#adee0739589166d272f8cb7c23aabf8ba',1,'utils.c']]],
+  ['ucx_5fcmp_5fstr',['ucx_cmp_str',['../utils_8h.html#aa6a37b9d172b6a5b2803d152f9e1b258',1,'utils.c']]],
+  ['ucx_5fcmp_5fstrn',['ucx_cmp_strn',['../utils_8h.html#ac6b354a878f551a3a5b20a167db3f308',1,'utils.c']]],
+  ['ucx_5fcmp_5fuint',['ucx_cmp_uint',['../utils_8h.html#abd83a5da91c3dd026a6931bd80c12f1e',1,'utils.c']]],
+  ['ucx_5fcmp_5fuint16',['ucx_cmp_uint16',['../utils_8h.html#acde5366437e886a459b7468f7a9e11f0',1,'utils.c']]],
+  ['ucx_5fcmp_5fuint32',['ucx_cmp_uint32',['../utils_8h.html#a5879d1722330355914d8c9146fa549d3',1,'utils.c']]],
+  ['ucx_5fcmp_5fuint64',['ucx_cmp_uint64',['../utils_8h.html#a1572a78b5b42f7151a5b2a5a7283d62d',1,'utils.c']]],
+  ['ucx_5fcmp_5fulongint',['ucx_cmp_ulongint',['../utils_8h.html#a3f3cbae2594d6f722bae29acb0408a24',1,'utils.c']]],
+  ['ucx_5fcmp_5fulonglong',['ucx_cmp_ulonglong',['../utils_8h.html#a6acfc359421f21f9a042a654ff7faac5',1,'utils.c']]],
+  ['ucx_5fdefault_5fallocator',['ucx_default_allocator',['../allocator_8h.html#a98d2f1b341118b7a0e341fda5d8b2ebf',1,'allocator.c']]],
+  ['ucx_5fdefault_5fcalloc',['ucx_default_calloc',['../allocator_8h.html#a3a0bfdd13d887012309c459b339f338f',1,'allocator.c']]],
+  ['ucx_5fdefault_5ffree',['ucx_default_free',['../allocator_8h.html#a646d83aaaadfe33ae414c0fad8bfc52a',1,'allocator.c']]],
+  ['ucx_5fdefault_5fmalloc',['ucx_default_malloc',['../allocator_8h.html#a96403ebf3d2312d95f2fe7627a1cdbc0',1,'allocator.c']]],
+  ['ucx_5fdefault_5frealloc',['ucx_default_realloc',['../allocator_8h.html#a47cfc8af626a86fcb93a2b14b90498ed',1,'allocator.c']]],
+  ['ucx_5fdestructor',['ucx_destructor',['../ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3',1,'ucx.h']]],
+  ['ucx_5fdist_5fint',['ucx_dist_int',['../utils_8h.html#a4ab6753739d56c09cdf6079fdcabf7c6',1,'utils.c']]],
+  ['ucx_5fdist_5fint16',['ucx_dist_int16',['../utils_8h.html#a81fb8434b70ca11bf2c14abfa21d16a9',1,'utils.c']]],
+  ['ucx_5fdist_5fint32',['ucx_dist_int32',['../utils_8h.html#ab4a659cc46096f0490c1dafa57726476',1,'utils.c']]],
+  ['ucx_5fdist_5fint64',['ucx_dist_int64',['../utils_8h.html#a54e7d06585bad3a899befc4e9c13853f',1,'utils.c']]],
+  ['ucx_5fdist_5flongint',['ucx_dist_longint',['../utils_8h.html#a43e73d288b1553a0078bf4c98dd341f5',1,'utils.c']]],
+  ['ucx_5fdist_5flonglong',['ucx_dist_longlong',['../utils_8h.html#a306778414a2427951ea263be92368627',1,'utils.c']]],
+  ['ucx_5fdist_5fuint',['ucx_dist_uint',['../utils_8h.html#a37b7d471ca1679992afc11a0deda45f4',1,'utils.c']]],
+  ['ucx_5fdist_5fuint16',['ucx_dist_uint16',['../utils_8h.html#a66e00a0703cbcde050ec922578e2f080',1,'utils.c']]],
+  ['ucx_5fdist_5fuint32',['ucx_dist_uint32',['../utils_8h.html#add2b5c5507caba59d894b84e056b079b',1,'utils.c']]],
+  ['ucx_5fdist_5fuint64',['ucx_dist_uint64',['../utils_8h.html#a3ba75e2e0b2479eef2b22fb219b42da7',1,'utils.c']]],
+  ['ucx_5fdist_5fulongint',['ucx_dist_ulongint',['../utils_8h.html#abb13476228d0c16bfaba08469adbae2d',1,'utils.c']]],
+  ['ucx_5fdist_5fulonglong',['ucx_dist_ulonglong',['../utils_8h.html#a59a5859272cb4b43cbdd58208c41e32b',1,'utils.c']]],
+  ['ucx_5fforeach',['UCX_FOREACH',['../list_8h.html#a4b143b6526a410aa4d22cb3bb9365d70',1,'list.h']]],
+  ['ucx_5ffprintf',['ucx_fprintf',['../utils_8h.html#aa0bec80e1c67f769ff5e112a7d4ce72a',1,'utils.c']]],
+  ['ucx_5fhash',['ucx_hash',['../map_8h.html#aea3be97254c05595d986ef6a9faae87b',1,'map.c']]],
+  ['ucx_5fkey',['ucx_key',['../map_8h.html#a3e540bb46b8ee19789aed63fd8919200',1,'map.c']]],
+  ['ucx_5flist_5fappend',['ucx_list_append',['../list_8h.html#a00c122c8a26d35b60676939df4161621',1,'list.c']]],
+  ['ucx_5flist_5fappend_5fa',['ucx_list_append_a',['../list_8h.html#adf3b3e2e0ff977d8928671d6bd82fc60',1,'list.c']]],
+  ['ucx_5flist_5fclone',['ucx_list_clone',['../list_8h.html#ae7054a41c289b24e6caf5cb07ac850ed',1,'list.c']]],
+  ['ucx_5flist_5fclone_5fa',['ucx_list_clone_a',['../list_8h.html#a08ca1ba0d2e82258b0408714c1f4c425',1,'list.c']]],
+  ['ucx_5flist_5fconcat',['ucx_list_concat',['../list_8h.html#a77163a0cc82fae52bec26c8c0c3674d9',1,'list.c']]],
+  ['ucx_5flist_5fcontains',['ucx_list_contains',['../list_8h.html#a8b0fa051fcfe12e1a82cca1087973852',1,'list.c']]],
+  ['ucx_5flist_5fdifference',['ucx_list_difference',['../list_8h.html#a6c5db5d1d11ad28b6fe1a80ee1c1e449',1,'list.c']]],
+  ['ucx_5flist_5fdifference_5fa',['ucx_list_difference_a',['../list_8h.html#a4a2a2fc5cc41073c516db6235bbc51d5',1,'list.c']]],
+  ['ucx_5flist_5fequals',['ucx_list_equals',['../list_8h.html#adc435447cecf885bc63d232191085bbe',1,'list.c']]],
+  ['ucx_5flist_5ffind',['ucx_list_find',['../list_8h.html#a9b3b6842d3be572e06a7f519e198cb83',1,'list.c']]],
+  ['ucx_5flist_5ffirst',['ucx_list_first',['../list_8h.html#a6aa0e34ebc5f0dca6f52d0f7626b4bd5',1,'list.c']]],
+  ['ucx_5flist_5ffree',['ucx_list_free',['../list_8h.html#a1a0fa2c5b1e478a96da19b0c3f013668',1,'list.c']]],
+  ['ucx_5flist_5ffree_5fa',['ucx_list_free_a',['../list_8h.html#a944e11f76c38767cd1100d72a4e3b25b',1,'list.c']]],
+  ['ucx_5flist_5ffree_5fcontent',['ucx_list_free_content',['../list_8h.html#a4ba6c96642f72ea046cc22627c72979c',1,'list.c']]],
+  ['ucx_5flist_5fget',['ucx_list_get',['../list_8h.html#a2509ffe19bce6a8708c77f89480c75fb',1,'list.c']]],
+  ['ucx_5flist_5findexof',['ucx_list_indexof',['../list_8h.html#ae2ff2974812ca185870f80bc4ed9337e',1,'list.c']]],
+  ['ucx_5flist_5fintersection',['ucx_list_intersection',['../list_8h.html#a259f9b754978aeca23dfabba16e20f39',1,'list.c']]],
+  ['ucx_5flist_5fintersection_5fa',['ucx_list_intersection_a',['../list_8h.html#a1d0b00514dbb81ba6270b58da0c5b9a8',1,'list.c']]],
+  ['ucx_5flist_5flast',['ucx_list_last',['../list_8h.html#add5ec40c5006e29c629d23c2eb5a6553',1,'list.c']]],
+  ['ucx_5flist_5fprepend',['ucx_list_prepend',['../list_8h.html#a8fcb68e4556395b15180eec2d0b77aa4',1,'list.c']]],
+  ['ucx_5flist_5fprepend_5fa',['ucx_list_prepend_a',['../list_8h.html#a54654e6dc60e1c3de9e886c150e404ec',1,'list.c']]],
+  ['ucx_5flist_5fremove',['ucx_list_remove',['../list_8h.html#a410cb3e8260037ba56c72d14b899b468',1,'list.c']]],
+  ['ucx_5flist_5fremove_5fa',['ucx_list_remove_a',['../list_8h.html#aca687b7c4e7170175f447e549125aa52',1,'list.c']]],
+  ['ucx_5flist_5fsize',['ucx_list_size',['../list_8h.html#ae88001cc8ae40b946560f31434abed8f',1,'list.c']]],
+  ['ucx_5flist_5fsort',['ucx_list_sort',['../list_8h.html#ac74962d9bd7cfc9d3e2e09651469377b',1,'list.c']]],
+  ['ucx_5flist_5funion',['ucx_list_union',['../list_8h.html#a94ecdb0cea1633ad7074f027fa8485fa',1,'list.c']]],
+  ['ucx_5flist_5funion_5fa',['ucx_list_union_a',['../list_8h.html#a65b4355536f4ebc4130211b46469f4c1',1,'list.c']]],
+  ['ucx_5flogger_5fdebug',['ucx_logger_debug',['../logging_8h.html#a2936402799892db5138e5f1f8c25db0c',1,'ucx_logger_debug():&#160;logging.h'],['../logging_8h.html#acff01d1ef919ea997cfce755fc1b83d8',1,'UCX_LOGGER_DEBUG():&#160;logging.h']]],
+  ['ucx_5flogger_5ferror',['ucx_logger_error',['../logging_8h.html#a6a9e472e14d6768e59d96d245e065397',1,'ucx_logger_error():&#160;logging.h'],['../logging_8h.html#aa254c07fe3a907613e2256a318d5c9a8',1,'UCX_LOGGER_ERROR():&#160;logging.h']]],
+  ['ucx_5flogger_5ffree',['ucx_logger_free',['../logging_8h.html#ac4697b784e01ec990d2acea192e21658',1,'logging.c']]],
+  ['ucx_5flogger_5finfo',['UCX_LOGGER_INFO',['../logging_8h.html#a4b0178bf60a6129373ffc59114ca4c9b',1,'UCX_LOGGER_INFO():&#160;logging.h'],['../logging_8h.html#a98464d8d51376ce2716dcc4eca00d5da',1,'ucx_logger_info():&#160;logging.h']]],
+  ['ucx_5flogger_5flevel',['UCX_LOGGER_LEVEL',['../logging_8h.html#aee18bc20e58ffb69910121512c350839',1,'logging.h']]],
+  ['ucx_5flogger_5flog',['ucx_logger_log',['../logging_8h.html#aa0245325031d95799b28def177fd14ec',1,'logging.h']]],
+  ['ucx_5flogger_5flogf',['ucx_logger_logf',['../logging_8h.html#ac337e5d02ebea565012d4c11bd643801',1,'logging.c']]],
+  ['ucx_5flogger_5fnew',['ucx_logger_new',['../logging_8h.html#ac560f8517d2172794c9d2691735ec48c',1,'logging.c']]],
+  ['ucx_5flogger_5fregister_5flevel',['ucx_logger_register_level',['../logging_8h.html#a5cffc19502c4c90bfb3bd3bbcd18170a',1,'logging.h']]],
+  ['ucx_5flogger_5fsource',['UCX_LOGGER_SOURCE',['../logging_8h.html#a0e0d72b12616c1e49ff8834eaf4cb8a2',1,'logging.h']]],
+  ['ucx_5flogger_5ftimestamp',['UCX_LOGGER_TIMESTAMP',['../logging_8h.html#a38607008268b4f776ee500fb95d2e823',1,'logging.h']]],
+  ['ucx_5flogger_5ftrace',['UCX_LOGGER_TRACE',['../logging_8h.html#a55b88d1fec7036d841b3ddd6195c5586',1,'UCX_LOGGER_TRACE():&#160;logging.h'],['../logging_8h.html#a3031b7ff13f4cfae9c2916543be2877c',1,'ucx_logger_trace():&#160;logging.h']]],
+  ['ucx_5flogger_5fwarn',['UCX_LOGGER_WARN',['../logging_8h.html#abd01ca11486226ba34e8f7028d9fffba',1,'UCX_LOGGER_WARN():&#160;logging.h'],['../logging_8h.html#aca7bd861b646892813fd7310c0aa69af',1,'ucx_logger_warn():&#160;logging.h']]],
+  ['ucx_5fmap_5fclear',['ucx_map_clear',['../map_8h.html#a285e90e40681c6d9631c935dda0967f2',1,'map.c']]],
+  ['ucx_5fmap_5fclone',['ucx_map_clone',['../map_8h.html#a62c6c30cbb0d824ba710f5030ff9a4e4',1,'map.c']]],
+  ['ucx_5fmap_5fclone_5fa',['ucx_map_clone_a',['../map_8h.html#a9aea9103703d5c168420bb6bf85549ea',1,'map.c']]],
+  ['ucx_5fmap_5fcopy',['ucx_map_copy',['../map_8h.html#adfeb2d61003fd2896bcfdc9a57f36425',1,'map.c']]],
+  ['ucx_5fmap_5fcstr_5fget',['ucx_map_cstr_get',['../map_8h.html#a64e1fb55498fa502dd2ed8ed69062cdd',1,'map.h']]],
+  ['ucx_5fmap_5fcstr_5fput',['ucx_map_cstr_put',['../map_8h.html#ad9356b01425b934ab237b52339ac0cc3',1,'map.h']]],
+  ['ucx_5fmap_5fcstr_5fremove',['ucx_map_cstr_remove',['../map_8h.html#a9c4405a5a75ecf64e2ef3d0c6501a9fe',1,'map.h']]],
+  ['ucx_5fmap_5fdifference',['ucx_map_difference',['../map_8h.html#a774fcff87d1e58b6c5af77dd19a8c3dc',1,'map.c']]],
+  ['ucx_5fmap_5fdifference_5fa',['ucx_map_difference_a',['../map_8h.html#ad0ba103494247d798ac3037c50fc8831',1,'map.c']]],
+  ['ucx_5fmap_5fforeach',['UCX_MAP_FOREACH',['../map_8h.html#a940896c4aa1b13e54c55c04c3efc186b',1,'map.h']]],
+  ['ucx_5fmap_5ffree',['ucx_map_free',['../map_8h.html#abe3d9688e4224bf7bb962abf25ff8c2e',1,'map.c']]],
+  ['ucx_5fmap_5ffree_5fcontent',['ucx_map_free_content',['../map_8h.html#a750f3d9d83e2f3788a14c17a9d160618',1,'map.c']]],
+  ['ucx_5fmap_5fget',['ucx_map_get',['../map_8h.html#ab61192c5af2e06ecb9ad73880d1c95a6',1,'map.c']]],
+  ['ucx_5fmap_5fint_5fget',['ucx_map_int_get',['../map_8h.html#aa1681bd2178553cd092fd24c4d681d3c',1,'map.h']]],
+  ['ucx_5fmap_5fint_5fput',['ucx_map_int_put',['../map_8h.html#aaa30af79b4068c923895619e83f44367',1,'map.h']]],
+  ['ucx_5fmap_5fint_5fremove',['ucx_map_int_remove',['../map_8h.html#aa767958b5468737755c09f7185b1770c',1,'map.h']]],
+  ['ucx_5fmap_5fintersection',['ucx_map_intersection',['../map_8h.html#aa594d7a5afebc3bed6bb265348cf6b0d',1,'map.c']]],
+  ['ucx_5fmap_5fintersection_5fa',['ucx_map_intersection_a',['../map_8h.html#a169e0470a20484dd76425fdf77e3651e',1,'map.c']]],
+  ['ucx_5fmap_5fiter_5fnext',['ucx_map_iter_next',['../map_8h.html#aceb8675abf44860b4bbc301bbada5b91',1,'map.c']]],
+  ['ucx_5fmap_5fiterator',['ucx_map_iterator',['../map_8h.html#a9150e9c64fdf4dfcc2cad106b91aa110',1,'map.c']]],
+  ['ucx_5fmap_5fnew',['ucx_map_new',['../map_8h.html#a79f31de8b93814493759dbc8b940cf0c',1,'map.c']]],
+  ['ucx_5fmap_5fnew_5fa',['ucx_map_new_a',['../map_8h.html#aed508a94c66cc15372503c64b70eb03e',1,'map.c']]],
+  ['ucx_5fmap_5fput',['ucx_map_put',['../map_8h.html#ac04a08b604217070254d4c58f0e82498',1,'map.c']]],
+  ['ucx_5fmap_5frehash',['ucx_map_rehash',['../map_8h.html#a174bce9fad554dd92b8da354e0d32512',1,'map.c']]],
+  ['ucx_5fmap_5fremove',['ucx_map_remove',['../map_8h.html#a17248a4888eb8f9ae18be522d64632aa',1,'map.c']]],
+  ['ucx_5fmap_5fsstr_5fget',['ucx_map_sstr_get',['../map_8h.html#a14d385f6b7f371f0507861cabd2eab4e',1,'map.h']]],
+  ['ucx_5fmap_5fsstr_5fput',['ucx_map_sstr_put',['../map_8h.html#ac26a8615bfc8f47ee9eaceb47645f98e',1,'map.h']]],
+  ['ucx_5fmap_5fsstr_5fremove',['ucx_map_sstr_remove',['../map_8h.html#a48700ea86fadb9ea54d13010f9124df2',1,'map.h']]],
+  ['ucx_5fmap_5funion',['ucx_map_union',['../map_8h.html#a3f65978c481af7f637cad021d93522d5',1,'map.c']]],
+  ['ucx_5fmap_5funion_5fa',['ucx_map_union_a',['../map_8h.html#ab6370c3fa8113fdad593ce4b0460c9c6',1,'map.c']]],
+  ['ucx_5fmemchunk',['ucx_memchunk',['../structucx__memchunk.html',1,'']]],
+  ['ucx_5fmemcpy',['ucx_memcpy',['../utils_8h.html#ab2e184e6a744941aab6b8058116baf30',1,'utils.c']]],
+  ['ucx_5fmempool_5fcalloc',['ucx_mempool_calloc',['../mempool_8h.html#a4b9142011824ae24f00fabe128417d69',1,'mempool.c']]],
+  ['ucx_5fmempool_5fchcap',['ucx_mempool_chcap',['../mempool_8h.html#aaf75b5016098723a9280531ccc3a6d77',1,'mempool.c']]],
+  ['ucx_5fmempool_5fdestroy',['ucx_mempool_destroy',['../mempool_8h.html#af096378da7e9bfbed3088497cf4c15bf',1,'mempool.c']]],
+  ['ucx_5fmempool_5ffree',['ucx_mempool_free',['../mempool_8h.html#aefa26e3015f5aefadbfc74221bd246ac',1,'mempool.c']]],
+  ['ucx_5fmempool_5fmalloc',['ucx_mempool_malloc',['../mempool_8h.html#a2ae492b8f2878ccc9837ac213dced11e',1,'mempool.c']]],
+  ['ucx_5fmempool_5fnew',['ucx_mempool_new',['../mempool_8h.html#ad71cb8c3b6fdb30360376a8b372ef22a',1,'mempool.c']]],
+  ['ucx_5fmempool_5fnew_5fdefault',['ucx_mempool_new_default',['../mempool_8h.html#a49f7bd1da5ac201d0cf54dc0f0d82dd2',1,'mempool.h']]],
+  ['ucx_5fmempool_5frealloc',['ucx_mempool_realloc',['../mempool_8h.html#a660ef42520ed6737c2e77aae18e3a7a4',1,'mempool.c']]],
+  ['ucx_5fmempool_5freg_5fdestr',['ucx_mempool_reg_destr',['../mempool_8h.html#af47b6b7c40f8f263dc28cc9a4e77b27c',1,'mempool.c']]],
+  ['ucx_5fmempool_5fset_5fdestr',['ucx_mempool_set_destr',['../mempool_8h.html#adb788e7ec24cd7dbdea6381539c549f2',1,'mempool.c']]],
+  ['ucx_5fproperties2map',['ucx_properties2map',['../properties_8h.html#a5c7ff8bc3139960a3f3dc92072b742f3',1,'properties.c']]],
+  ['ucx_5fproperties_5ffill',['ucx_properties_fill',['../properties_8h.html#aaf8de121764a4d22c763ff2ab41f3a4d',1,'properties.c']]],
+  ['ucx_5fproperties_5ffree',['ucx_properties_free',['../properties_8h.html#a38a2fe7bb2986bd87c7e69356ab05c05',1,'properties.c']]],
+  ['ucx_5fproperties_5fload',['ucx_properties_load',['../properties_8h.html#ae1b600f839a6b2278b68fc314981a8a3',1,'properties.c']]],
+  ['ucx_5fproperties_5fnew',['ucx_properties_new',['../properties_8h.html#a44d9dd12cab3aaa0084f1c8b89405796',1,'properties.c']]],
+  ['ucx_5fproperties_5fnext',['ucx_properties_next',['../properties_8h.html#a7e03bc573d45d48c538cd721e810d33c',1,'properties.c']]],
+  ['ucx_5fproperties_5fstore',['ucx_properties_store',['../properties_8h.html#a63c0c1b7648e675b21a1788917ff36fb',1,'properties.c']]],
+  ['ucx_5fregdestr',['ucx_regdestr',['../structucx__regdestr.html',1,'']]],
+  ['ucx_5fsc2sc',['ucx_sc2sc',['../string_8h.html#a69d5e3eeec783cc43314df71248768f5',1,'string.c']]],
+  ['ucx_5fsprintf',['ucx_sprintf',['../utils_8h.html#af9f333b66ecd639c347c7235f4992e2e',1,'utils.h']]],
+  ['ucx_5fss2c_5fs',['ucx_ss2c_s',['../string_8h.html#aedeb5d7bddda54116101a8d68af8c56d',1,'string.h']]],
+  ['ucx_5fss2sc',['ucx_ss2sc',['../string_8h.html#a9ce5ad1b2aa2dbeba204d452c2e64359',1,'string.c']]],
+  ['ucx_5fstack_5favail',['ucx_stack_avail',['../stack_8h.html#a53cd2c7743dc8ad9cbd35ade0b4873e7',1,'stack.c']]],
+  ['ucx_5fstack_5fcalloc',['ucx_stack_calloc',['../stack_8h.html#afdc467524b5e19a9a777c6bc03e17174',1,'stack.c']]],
+  ['ucx_5fstack_5fdim',['ucx_stack_dim',['../stack_8h.html#a3b761343c6491222604341ebfa443226',1,'stack.h']]],
+  ['ucx_5fstack_5fempty',['ucx_stack_empty',['../stack_8h.html#a4f7239dbd6c032c56812e370b71c1985',1,'stack.h']]],
+  ['ucx_5fstack_5ffree',['ucx_stack_free',['../stack_8h.html#aabd55c14a3866b3782ba324f4d8b4c41',1,'stack.c']]],
+  ['ucx_5fstack_5finit',['ucx_stack_init',['../stack_8h.html#abaef685df4e7ef95cd7218984a0618fe',1,'stack.c']]],
+  ['ucx_5fstack_5fmalloc',['ucx_stack_malloc',['../stack_8h.html#af865b416802140f6b6e8ab3626d7d1ac',1,'stack.c']]],
+  ['ucx_5fstack_5fmetadata',['ucx_stack_metadata',['../structucx__stack__metadata.html',1,'']]],
+  ['ucx_5fstack_5fpop',['ucx_stack_pop',['../stack_8h.html#a506b82374734ec476d086ddfb561174d',1,'stack.h']]],
+  ['ucx_5fstack_5fpopn',['ucx_stack_popn',['../stack_8h.html#a07ea48f28eab474dcfefbb86fa66ef81',1,'stack.c']]],
+  ['ucx_5fstack_5fpush',['ucx_stack_push',['../stack_8h.html#af85e6f77a8341beb6188f9ae1a8e9f92',1,'stack.c']]],
+  ['ucx_5fstack_5fpusharr',['ucx_stack_pusharr',['../stack_8h.html#a7bb138979191bba138e76ea37488fae2',1,'stack.c']]],
+  ['ucx_5fstack_5frealloc',['ucx_stack_realloc',['../stack_8h.html#a0c678f96f6fabab49b2b034a1fe91c3a',1,'stack.c']]],
+  ['ucx_5fstack_5ftopsize',['ucx_stack_topsize',['../stack_8h.html#a030197051a803e87d5eeac5adb80b15a',1,'stack.h']]],
+  ['ucx_5fstrcpy',['ucx_strcpy',['../utils_8h.html#adeb6e8d0a53a829207cfa0a979d01fff',1,'utils.c']]],
+  ['ucx_5fstream_5fbcopy',['ucx_stream_bcopy',['../utils_8h.html#a6003a1750a66234169bd1f8cc84b297b',1,'utils.h']]],
+  ['ucx_5fstream_5fbncopy',['ucx_stream_bncopy',['../utils_8h.html#a114ee7f7da62656ffd35e2dc23394201',1,'utils.c']]],
+  ['ucx_5fstream_5fcopy',['ucx_stream_copy',['../utils_8h.html#a41ca1344f781c0d3bf7a414a6e811392',1,'utils.h']]],
+  ['ucx_5fstream_5fcopy_5fbufsize',['UCX_STREAM_COPY_BUFSIZE',['../utils_8h.html#a23efd74fa5f701d4cf26ccbfd138a439',1,'utils.h']]],
+  ['ucx_5fstream_5fncopy',['ucx_stream_ncopy',['../utils_8h.html#add13f39a8af440b4f7e6f74339eaada2',1,'utils.h']]],
+  ['ucx_5fszmul',['ucx_szmul',['../ucx_8h.html#a0b5ed6c1a0b15356f4f948acfd32a4cc',1,'ucx.h']]],
+  ['ucx_5fszmul_5fimpl',['ucx_szmul_impl',['../ucx_8h.html#a6637171cc0ec097b297f731a3036dd3b',1,'ucx.c']]],
+  ['ucx_5ftest',['UCX_TEST',['../test_8h.html#a66cfb29c329fc9eaef071f2449836659',1,'test.h']]],
+  ['ucx_5ftest_5fassert',['UCX_TEST_ASSERT',['../test_8h.html#a08f477cd12fc3fe741a92493e5df58a9',1,'test.h']]],
+  ['ucx_5ftest_5fbegin',['UCX_TEST_BEGIN',['../test_8h.html#a0547b8d4f3bcdb0633fdd8925e8aa5d4',1,'test.h']]],
+  ['ucx_5ftest_5fcall_5fsubroutine',['UCX_TEST_CALL_SUBROUTINE',['../test_8h.html#a0efbab91c54f5237a2ab207f48cf0e51',1,'test.h']]],
+  ['ucx_5ftest_5fend',['UCX_TEST_END',['../test_8h.html#a86e64857c04f0447f8b16fb9c2b3b639',1,'test.h']]],
+  ['ucx_5ftest_5fregister',['ucx_test_register',['../test_8h.html#a8dfabc42f183d3a4d79379a5d17bf67d',1,'test.c']]],
+  ['ucx_5ftest_5frun',['ucx_test_run',['../test_8h.html#a3721458deeecb43aa322428f007714c3',1,'test.c']]],
+  ['ucx_5ftest_5fsubroutine',['UCX_TEST_SUBROUTINE',['../test_8h.html#ae073cf5ead22cb27d662da048e16f44a',1,'test.h']]],
+  ['ucx_5ftest_5fsuite_5ffree',['ucx_test_suite_free',['../test_8h.html#a4a6ac61a6f72722273f8eaa7a343edde',1,'test.c']]],
+  ['ucx_5ftest_5fsuite_5fnew',['ucx_test_suite_new',['../test_8h.html#a531f0df90363e0befbe900878f65f09e',1,'test.c']]],
+  ['ucx_5fvasprintf',['ucx_vasprintf',['../utils_8h.html#a3ea1dfb856c741f3e8ec6bfdc9ad427e',1,'utils.c']]],
+  ['ucx_5fversion',['UCX_VERSION',['../ucx_8h.html#af12001920ca2fc1405615684e4dea284',1,'ucx.h']]],
+  ['ucx_5fversion_5fmajor',['UCX_VERSION_MAJOR',['../ucx_8h.html#aa57e5dd22d42387d748cc16777df1383',1,'ucx.h']]],
+  ['ucx_5fversion_5fminor',['UCX_VERSION_MINOR',['../ucx_8h.html#a9ac10d6353e23d4615a87fc737c65eb0',1,'ucx.h']]],
+  ['ucx_5fvfprintf',['ucx_vfprintf',['../utils_8h.html#a4907967beb92c3ae351dd239abbb6927',1,'utils.c']]],
+  ['ucxallocator',['UcxAllocator',['../structUcxAllocator.html',1,'']]],
+  ['ucxarray',['UcxArray',['../structUcxArray.html',1,'']]],
+  ['ucxavlnode',['UcxAVLNode',['../structUcxAVLNode.html',1,'UcxAVLNode'],['../avl_8h.html#a08ba2496c2316df58548c3cc29712add',1,'UcxAVLNode():&#160;avl.h']]],
+  ['ucxavltree',['UcxAVLTree',['../structUcxAVLTree.html',1,'']]],
+  ['ucxbuffer',['UcxBuffer',['../structUcxBuffer.html',1,'']]],
+  ['ucxkey',['UcxKey',['../structUcxKey.html',1,'UcxKey'],['../map_8h.html#ad63828bb23123fc01a5315a2bac3b142',1,'UcxKey():&#160;map.h']]],
+  ['ucxlist',['UcxList',['../structUcxList.html',1,'UcxList'],['../list_8h.html#aa6f89f91c1081c9a7c6866c298f497a2',1,'UcxList():&#160;list.h']]],
+  ['ucxlogger',['UcxLogger',['../structUcxLogger.html',1,'']]],
+  ['ucxmap',['UcxMap',['../structUcxMap.html',1,'UcxMap'],['../map_8h.html#a18e21948725b2da68c35da587a722033',1,'UcxMap():&#160;map.h']]],
+  ['ucxmapelement',['UcxMapElement',['../structUcxMapElement.html',1,'UcxMapElement'],['../map_8h.html#ad7d7a910a32113eb93eae11c3dc97b4b',1,'UcxMapElement():&#160;map.h']]],
+  ['ucxmapiterator',['UcxMapIterator',['../structUcxMapIterator.html',1,'UcxMapIterator'],['../map_8h.html#ae36aff5f645948c54f51578b11fd87fb',1,'UcxMapIterator():&#160;map.h']]],
+  ['ucxmapkey',['UcxMapKey',['../structUcxMapKey.html',1,'']]],
+  ['ucxmempool',['UcxMempool',['../structUcxMempool.html',1,'']]],
+  ['ucxproperties',['UcxProperties',['../structUcxProperties.html',1,'']]],
+  ['ucxstack',['UcxStack',['../structUcxStack.html',1,'']]],
+  ['ucxtest',['UcxTest',['../test_8h.html#ae906817354c010b83c2784260cce7a1c',1,'test.h']]],
+  ['ucxtestlist',['UcxTestList',['../structUcxTestList.html',1,'UcxTestList'],['../test_8h.html#a8048c50ae73ea690b776edfd63bd6a5d',1,'UcxTestList():&#160;test.h']]],
+  ['ucxtestsuite',['UcxTestSuite',['../structUcxTestSuite.html',1,'UcxTestSuite'],['../test_8h.html#a52115d1d0f1c4a565ed6ef7c1bfd0363',1,'UcxTestSuite():&#160;test.h']]],
+  ['userdata',['userdata',['../structUcxAVLTree.html#ae92a3bfad3fe33c8dcbdad85112f83fd',1,'UcxAVLTree']]],
+  ['utils_2eh',['utils.h',['../utils_8h.html',1,'']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_12.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_12.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_12.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['value',['value',['../structUcxAVLNode.html#a302501b8c04c3fde668fe72249871258',1,'UcxAVLNode']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_13.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_13.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_13.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['write_5ffunc',['write_func',['../ucx_8h.html#a989b3f0fa4d307d278378fde435641ed',1,'ucx.h']]],
+  ['writer',['writer',['../structUcxLogger.html#ada13bba090a9dc4f8d6cd9be73c60930',1,'UcxLogger']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_2.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_2.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,6 @@
+var searchData=
+[
+  ['buffer',['buffer',['../structUcxProperties.html#a6bb4d29686df41a0f42641ee15232bfd',1,'UcxProperties']]],
+  ['buffer_2eh',['buffer.h',['../buffer_8h.html',1,'']]],
+  ['buflen',['buflen',['../structUcxProperties.html#a4e7524434525267e29f493a25dcca6b5',1,'UcxProperties']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_3.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_3.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,14 @@
+var searchData=
+[
+  ['c',['c',['../structucx__memchunk.html#ab86550503e5f019bfa61a1e91f1c40da',1,'ucx_memchunk']]],
+  ['calloc',['calloc',['../structUcxAllocator.html#ab94ec1cba45cc4e7d81e1588a11cbb62',1,'UcxAllocator']]],
+  ['capacity',['capacity',['../structUcxArray.html#a7ed074887908e45bde7e1fbc67b31c18',1,'UcxArray::capacity()'],['../structUcxBuffer.html#a385661894f3cee9c549bfe07a8b316bf',1,'UcxBuffer::capacity()']]],
+  ['cmp_5ffunc',['cmp_func',['../ucx_8h.html#afe5e2d5dbf34778e0e97852051570791',1,'ucx.h']]],
+  ['cmpfunc',['cmpfunc',['../structUcxAVLTree.html#a87aff25cb726cb9eb88eb815a10d1004',1,'UcxAVLTree']]],
+  ['comment1',['comment1',['../structUcxProperties.html#afaa2e6a289fa6949b7b01df35fa5def8',1,'UcxProperties']]],
+  ['comment2',['comment2',['../structUcxProperties.html#a9ea7ecb414ca8bc7bef62cdd19cc6363',1,'UcxProperties']]],
+  ['comment3',['comment3',['../structUcxProperties.html#a5f3e561e32bac03e36a191a6940cca92',1,'UcxProperties']]],
+  ['copy_5ffunc',['copy_func',['../ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967',1,'ucx.h']]],
+  ['count',['count',['../structUcxMap.html#a14e9163f71f6c014dfa2103de70ae9cd',1,'UcxMap']]],
+  ['cur',['cur',['../structUcxMapIterator.html#af1fc40f899f37280adb5b85acf6e742f',1,'UcxMapIterator']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_4.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_4.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,8 @@
+var searchData=
+[
+  ['data',['data',['../structUcxArray.html#a04d2b03d0a45af1fab19b4216602075a',1,'UcxArray::data()'],['../structUcxList.html#a4a44905121b6fc2a088084ce578a9ea2',1,'UcxList::data()'],['../structUcxKey.html#a6176109f25b34f3fa92bcfbc8ae7a88c',1,'UcxKey::data()'],['../structUcxMapKey.html#ab71d1841e4f538628c00f782267fb6d5',1,'UcxMapKey::data()'],['../structUcxMapElement.html#abbd7f3bf5beef370f702d2d5bb07733c',1,'UcxMapElement::data()'],['../structUcxMempool.html#ae98c1b0150bb119ee0a8506a6f310d6e',1,'UcxMempool::data()']]],
+  ['dateformat',['dateformat',['../structUcxLogger.html#a086f75df0f6c81ec491f25c0a4d9262b',1,'UcxLogger']]],
+  ['delimiter',['delimiter',['../structUcxProperties.html#af6adb3f69616cf9d2bb5ea7b4d837ca5',1,'UcxProperties']]],
+  ['destructor',['destructor',['../structucx__memchunk.html#ac7b5e3fda47b917d6fb2a1d7ea28447b',1,'ucx_memchunk::destructor()'],['../structucx__regdestr.html#acea2a3bb66909aa800a931ac8b0cce56',1,'ucx_regdestr::destructor()']]],
+  ['distance_5ffunc',['distance_func',['../ucx_8h.html#a0bc5bf89e556c1d45d10863d52728ac9',1,'ucx.h']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_5.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_5.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_5.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['elemsize',['elemsize',['../structUcxArray.html#ac4e9ecdf8a8d010644f6e44dfef8190f',1,'UcxArray']]],
+  ['error',['error',['../structUcxProperties.html#a34f71a6ab6dcb6892e3b4eb802e75bff',1,'UcxProperties']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_6.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_6.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_6.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,6 @@
+var searchData=
+[
+  ['failure',['failure',['../structUcxTestSuite.html#abfd240541d1e956e49cde0ac36286951',1,'UcxTestSuite']]],
+  ['flags',['flags',['../structUcxBuffer.html#ac642e07b0a03be5aac48eb4aa5bec2f7',1,'UcxBuffer']]],
+  ['free',['free',['../structUcxAllocator.html#aecce1840378ed53f1002190f4f87026f',1,'UcxAllocator']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_7.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_7.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_7.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['hash',['hash',['../structUcxKey.html#aac9d372ac34a4cbd8459e2b04e505752',1,'UcxKey::hash()'],['../structUcxMapKey.html#a34c1f8fec98174583944fffd30e7c913',1,'UcxMapKey::hash()']]],
+  ['height',['height',['../structUcxAVLNode.html#af129fd32863a7c35e82c5cd9d11dc95a',1,'UcxAVLNode']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_8.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_8.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_8.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['index',['index',['../structUcxMapIterator.html#ac2376545c8816dd6895de4995e558c65',1,'UcxMapIterator']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_9.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_9.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_9.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['key',['key',['../structUcxAVLNode.html#ab65a31010d26a3df898e6ba534702af6',1,'UcxAVLNode::key()'],['../structUcxMapElement.html#aa446141b708e106e2c8de1303318187c',1,'UcxMapElement::key()']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_a.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_a.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,10 @@
+var searchData=
+[
+  ['left',['left',['../structUcxAVLNode.html#ad3a1c733f2c1cc81ac527f846fc24b9c',1,'UcxAVLNode']]],
+  ['len',['len',['../structUcxKey.html#abef01de37f355688f2ac797d2c280683',1,'UcxKey::len()'],['../structUcxMapKey.html#a504d46caa45c79cd87ff8cd835654270',1,'UcxMapKey::len()']]],
+  ['length',['length',['../structsstr__t.html#a5cf571708cdff92e45f08458f2b98229',1,'sstr_t::length()'],['../structscstr__t.html#aaa0229f64f1057b6f65adededaa5a172',1,'scstr_t::length()']]],
+  ['level',['level',['../structUcxLogger.html#a2e0ee94c25b2307096c7970280d189cd',1,'UcxLogger']]],
+  ['levels',['levels',['../structUcxLogger.html#a187129f7bc6e5064b3d92a5f1217f396',1,'UcxLogger']]],
+  ['list_2eh',['list.h',['../list_8h.html',1,'']]],
+  ['logging_2eh',['logging.h',['../logging_8h.html',1,'']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_b.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_b.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_b.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,8 @@
+var searchData=
+[
+  ['malloc',['malloc',['../structUcxAllocator.html#a013376172be39ed54f77c4be6898845a',1,'UcxAllocator']]],
+  ['map',['map',['../structUcxMap.html#a5792b5037c4f77ea3cb144b66c9b8790',1,'UcxMap::map()'],['../structUcxMapIterator.html#af88d6e22547d09fe1d665dd650dcdb95',1,'UcxMapIterator::map()']]],
+  ['map_2eh',['map.h',['../map_8h.html',1,'']]],
+  ['mask',['mask',['../structUcxLogger.html#a1de0db2e02dcf03366268f6943f8b97c',1,'UcxLogger']]],
+  ['mempool_2eh',['mempool.h',['../mempool_8h.html',1,'']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_c.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_c.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['ndata',['ndata',['../structUcxMempool.html#aa3a73ab231e1bc207d526f46f1c1e23a',1,'UcxMempool']]],
+  ['next',['next',['../structUcxList.html#a82a1818f1abf765b026fa91478569a8f',1,'UcxList::next()'],['../structUcxMapElement.html#a99fe8188b0889201d70ff5f922deef51',1,'UcxMapElement::next()'],['../structUcxTestList.html#aeebb80ff75d9f6f82ab6dc2641a3c74e',1,'UcxTestList::next()']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_d.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_d.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,10 @@
+var searchData=
+[
+  ['parent',['parent',['../structUcxAVLNode.html#afc4e3b4f452aa2d91cabb2135b9d42f7',1,'UcxAVLNode']]],
+  ['pool',['pool',['../structUcxAllocator.html#a1b78012998d1c28be86dc595f8f0aac9',1,'UcxAllocator']]],
+  ['pos',['pos',['../structUcxBuffer.html#a7a64288f002cf62b492e2ea49c79615c',1,'UcxBuffer::pos()'],['../structUcxProperties.html#addd36ac8e5e42241c0a57453633970db',1,'UcxProperties::pos()']]],
+  ['prev',['prev',['../structUcxList.html#a0f1fddce9088b9c1414745d0b1b5c08b',1,'UcxList::prev()'],['../structucx__stack__metadata.html#ad46d2e8e5b0acf05f2def41d451c5579',1,'ucx_stack_metadata::prev()']]],
+  ['prisstr',['PRIsstr',['../string_8h.html#a7d5bc48708405a28b23667e32dfcecae',1,'string.h']]],
+  ['properties_2eh',['properties.h',['../properties_8h.html',1,'']]],
+  ['ptr',['ptr',['../structucx__regdestr.html#aac0e9ec8df4aab08728b4f8292b5f5e7',1,'ucx_regdestr::ptr()'],['../structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0',1,'sstr_t::ptr()'],['../structscstr__t.html#a305fd48934b474a9bf4a40869030e391',1,'scstr_t::ptr()']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_e.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_e.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,7 @@
+var searchData=
+[
+  ['read_5ffunc',['read_func',['../ucx_8h.html#a6a67e255e460acb58f802067b3ff5fd5',1,'ucx.h']]],
+  ['realloc',['realloc',['../structUcxAllocator.html#a3550e3847f31d9e9ce3ffcb0d3440c15',1,'UcxAllocator']]],
+  ['right',['right',['../structUcxAVLNode.html#a7cbaa31dba8c7a89f4f8f7905f6fd238',1,'UcxAVLNode']]],
+  ['root',['root',['../structUcxAVLTree.html#a393a8fc99eb2c290d3cb67170081d742',1,'UcxAVLTree']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_f.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/all_f.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,67 @@
+var searchData=
+[
+  ['s',['S',['../string_8h.html#a8fa17c8cf4c36df48f4108c36da8573e',1,'string.h']]],
+  ['sc',['SC',['../string_8h.html#a7d261dd0bc358c957a368bc058c1ce53',1,'string.h']]],
+  ['scstr',['SCSTR',['../string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed',1,'SCSTR():&#160;string.h'],['../string_8h.html#a2b1d6f1eca1c1549f37107b9c026c5a6',1,'scstr(const char *cstring):&#160;string.c']]],
+  ['scstr_5ft',['scstr_t',['../structscstr__t.html',1,'']]],
+  ['scstrcasecmp',['scstrcasecmp',['../string_8h.html#aca8142fb823d253054e17c17cfca05e0',1,'string.c']]],
+  ['scstrcaseprefix',['scstrcaseprefix',['../string_8h.html#a3718ef4aa1e86cdb26bda2f07fb585df',1,'string.c']]],
+  ['scstrcasesuffix',['scstrcasesuffix',['../string_8h.html#a6edb4b85f2b9efe79db7ffe6eccd7bc3',1,'string.c']]],
+  ['scstrcat',['scstrcat',['../string_8h.html#a7376842c19e954b49215da81ef76ac0c',1,'string.c']]],
+  ['scstrcat_5fa',['scstrcat_a',['../string_8h.html#abacce4cbd6f70fcb6453904ef08b02e9',1,'string.c']]],
+  ['scstrchr',['scstrchr',['../string_8h.html#a5836d6a7a744791c35e5c17bdc394a87',1,'string.c']]],
+  ['scstrcmp',['scstrcmp',['../string_8h.html#af35272a8e5408c88ed3e25a3a98f0a82',1,'string.c']]],
+  ['scstrdup',['scstrdup',['../string_8h.html#a97dccce03af419596dbdd592ca46a164',1,'string.c']]],
+  ['scstrdup_5fa',['scstrdup_a',['../string_8h.html#a8fe58921f51eb1fde038472377e63014',1,'string.c']]],
+  ['scstrlower',['scstrlower',['../string_8h.html#abccf198bea3186ff2abb080cc88dcae6',1,'string.c']]],
+  ['scstrlower_5fa',['scstrlower_a',['../string_8h.html#a3cf1e557df7ab58d03c78832c4060276',1,'string.c']]],
+  ['scstrn',['scstrn',['../string_8h.html#ae594f6e222ea394cef6a26c0dfad000d',1,'string.c']]],
+  ['scstrnlen',['scstrnlen',['../string_8h.html#ac1b000030d6d197eec48c15a182055d5',1,'string.c']]],
+  ['scstrprefix',['scstrprefix',['../string_8h.html#a599ddc2f88dd1df68b72eefd91347393',1,'string.c']]],
+  ['scstrrchr',['scstrrchr',['../string_8h.html#ae389835b97cd9382e7d6a6a075323376',1,'string.c']]],
+  ['scstrscstr',['scstrscstr',['../string_8h.html#a54f256c3abe811c52d58b4ff1b23f051',1,'string.c']]],
+  ['scstrsplit',['scstrsplit',['../string_8h.html#ae71cac352b00230848bde358f0fb05ea',1,'string.c']]],
+  ['scstrsplit_5fa',['scstrsplit_a',['../string_8h.html#a52906455ae530c9cdc6812c8e6d9bdef',1,'string.c']]],
+  ['scstrsstr',['scstrsstr',['../string_8h.html#aa4362cb36c6629f9d8484739fd827748',1,'string.c']]],
+  ['scstrsubs',['scstrsubs',['../string_8h.html#a9a6c8d8db0dda0037c3c852cce1a5060',1,'string.c']]],
+  ['scstrsubsl',['scstrsubsl',['../string_8h.html#ad50f0f67b906fad0744f46bcb51e144b',1,'string.c']]],
+  ['scstrsuffix',['scstrsuffix',['../string_8h.html#a1f0ae316a2afe85d5b4655e6ece6721a',1,'string.c']]],
+  ['scstrtrim',['scstrtrim',['../string_8h.html#ad374b16eb1be8b48019debad9b9f268c',1,'string.c']]],
+  ['scstrupper',['scstrupper',['../string_8h.html#af3dd09ec9d11162fe0075f4e60f41240',1,'string.c']]],
+  ['scstrupper_5fa',['scstrupper_a',['../string_8h.html#aea94613eb74668cc05d365803d32bfad',1,'string.c']]],
+  ['sfmt',['SFMT',['../string_8h.html#a23ed51e87385886bb65e8cd19c839362',1,'string.h']]],
+  ['size',['size',['../structUcxArray.html#a20c11f2c9048cda80062842b7c094e20',1,'UcxArray::size()'],['../structUcxBuffer.html#aec0aea8325394951d5ad4a9fbb8e1ac7',1,'UcxBuffer::size()'],['../structUcxMap.html#afe120846b26d99580a7ff1276464e838',1,'UcxMap::size()'],['../structUcxMempool.html#a304729986f2894971d0469e71e196bf0',1,'UcxMempool::size()'],['../structUcxStack.html#a4df86b1917bfc3bbf760220870638143',1,'UcxStack::size()'],['../structucx__stack__metadata.html#ae2a2848b721cfa44a7e963484c5e4b28',1,'ucx_stack_metadata::size()']]],
+  ['space',['space',['../structUcxBuffer.html#a1a5076e85acb84b715a53bc0f37fb721',1,'UcxBuffer::space()'],['../structUcxStack.html#af64d528744bf3a47fec87d2e45d2992f',1,'UcxStack::space()']]],
+  ['sstr',['sstr',['../string_8h.html#a539eb7059251a051ee5d179526a23e9a',1,'string.c']]],
+  ['sstr_5ft',['sstr_t',['../structsstr__t.html',1,'']]],
+  ['sstrcasecmp',['sstrcasecmp',['../string_8h.html#a81b0f6df794152c2038703d4e9d0ad59',1,'string.h']]],
+  ['sstrcaseprefix',['sstrcaseprefix',['../string_8h.html#acd3dc64e90db9b4046e14f115a815ff4',1,'string.h']]],
+  ['sstrcasesuffix',['sstrcasesuffix',['../string_8h.html#a57eabd4862d531dd685bbf2feb8468bf',1,'string.h']]],
+  ['sstrcat',['sstrcat',['../string_8h.html#a6af8a4c347c7fdb5980d4c4803be2759',1,'string.h']]],
+  ['sstrcat_5fa',['sstrcat_a',['../string_8h.html#a6068d460f9bc05962666a917d26568b3',1,'string.h']]],
+  ['sstrchr',['sstrchr',['../string_8h.html#af80898a0b75955eb2579298c3ae2c481',1,'string.c']]],
+  ['sstrcmp',['sstrcmp',['../string_8h.html#a7ae7156c8de57454ca38d306100b8160',1,'string.h']]],
+  ['sstrdup',['sstrdup',['../string_8h.html#accbfd2b459a028d7af9fb7df6f977d80',1,'string.h']]],
+  ['sstrdup_5fa',['sstrdup_a',['../string_8h.html#a8d098baada4ea9ad5d8b6343b5aec007',1,'string.h']]],
+  ['sstrlower',['sstrlower',['../string_8h.html#a89343ea3e719f00ee802b557db57b769',1,'string.h']]],
+  ['sstrlower_5fa',['sstrlower_a',['../string_8h.html#a4bb4742fe71115f493991d307cb22b23',1,'string.h']]],
+  ['sstrn',['sstrn',['../string_8h.html#a2744c38ac44abf3e01fa059056dcf36c',1,'string.c']]],
+  ['sstrnlen',['sstrnlen',['../string_8h.html#a33fa945acc5ac2ce962e5ef13cf1638c',1,'string.h']]],
+  ['sstrprefix',['sstrprefix',['../string_8h.html#a7d73b66256384b26927e787318fdefa2',1,'string.h']]],
+  ['sstrrchr',['sstrrchr',['../string_8h.html#adae3f59957ca328e1da5285cb8b02a72',1,'string.c']]],
+  ['sstrscstr',['sstrscstr',['../string_8h.html#aa696932213265e10f864678686f4ccde',1,'string.h']]],
+  ['sstrsplit',['sstrsplit',['../string_8h.html#aa929984004c3576bfafb95031aca8eb7',1,'string.h']]],
+  ['sstrsplit_5fa',['sstrsplit_a',['../string_8h.html#ac9f69fa3a17e26a3a5f9d985b5844601',1,'string.h']]],
+  ['sstrstr',['sstrstr',['../string_8h.html#a9d03be026afa9447c52bb34b9e3b895a',1,'string.h']]],
+  ['sstrsubs',['sstrsubs',['../string_8h.html#a5eb9e0e1f26cf7fbecc038cd90e8b258',1,'string.c']]],
+  ['sstrsubsl',['sstrsubsl',['../string_8h.html#a78925c91af54f23cebd20ff99ef4331a',1,'string.c']]],
+  ['sstrsuffix',['sstrsuffix',['../string_8h.html#ac6a5246f26be2e8a5f34d8995b7ec14e',1,'string.h']]],
+  ['sstrtrim',['sstrtrim',['../string_8h.html#ae2d6da564d3fce51f2e0cac580fdbc56',1,'string.c']]],
+  ['sstrupper',['sstrupper',['../string_8h.html#a084fe5a3a90d6fb6b15ecda03bb30824',1,'string.h']]],
+  ['sstrupper_5fa',['sstrupper_a',['../string_8h.html#a5f0dd83c0176b812fb428004b2877a34',1,'string.h']]],
+  ['st',['ST',['../string_8h.html#a9037956cca97a4e84b642f17f3d10378',1,'string.h']]],
+  ['stack_2eh',['stack.h',['../stack_8h.html',1,'']]],
+  ['stream',['stream',['../structUcxLogger.html#a33fddf4791e8d49e479ecc78bf5d1b9e',1,'UcxLogger']]],
+  ['string_2eh',['string.h',['../string_8h.html',1,'']]],
+  ['success',['success',['../structUcxTestSuite.html#a6cefa870a3c2e38d6ee682e38643dbbb',1,'UcxTestSuite']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/classes_0.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/classes_0.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['scstr_5ft',['scstr_t',['../structscstr__t.html',1,'']]],
+  ['sstr_5ft',['sstr_t',['../structsstr__t.html',1,'']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/classes_1.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/classes_1.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,23 @@
+var searchData=
+[
+  ['ucx_5fmemchunk',['ucx_memchunk',['../structucx__memchunk.html',1,'']]],
+  ['ucx_5fregdestr',['ucx_regdestr',['../structucx__regdestr.html',1,'']]],
+  ['ucx_5fstack_5fmetadata',['ucx_stack_metadata',['../structucx__stack__metadata.html',1,'']]],
+  ['ucxallocator',['UcxAllocator',['../structUcxAllocator.html',1,'']]],
+  ['ucxarray',['UcxArray',['../structUcxArray.html',1,'']]],
+  ['ucxavlnode',['UcxAVLNode',['../structUcxAVLNode.html',1,'']]],
+  ['ucxavltree',['UcxAVLTree',['../structUcxAVLTree.html',1,'']]],
+  ['ucxbuffer',['UcxBuffer',['../structUcxBuffer.html',1,'']]],
+  ['ucxkey',['UcxKey',['../structUcxKey.html',1,'']]],
+  ['ucxlist',['UcxList',['../structUcxList.html',1,'']]],
+  ['ucxlogger',['UcxLogger',['../structUcxLogger.html',1,'']]],
+  ['ucxmap',['UcxMap',['../structUcxMap.html',1,'']]],
+  ['ucxmapelement',['UcxMapElement',['../structUcxMapElement.html',1,'']]],
+  ['ucxmapiterator',['UcxMapIterator',['../structUcxMapIterator.html',1,'']]],
+  ['ucxmapkey',['UcxMapKey',['../structUcxMapKey.html',1,'']]],
+  ['ucxmempool',['UcxMempool',['../structUcxMempool.html',1,'']]],
+  ['ucxproperties',['UcxProperties',['../structUcxProperties.html',1,'']]],
+  ['ucxstack',['UcxStack',['../structUcxStack.html',1,'']]],
+  ['ucxtestlist',['UcxTestList',['../structUcxTestList.html',1,'']]],
+  ['ucxtestsuite',['UcxTestSuite',['../structUcxTestSuite.html',1,'']]]
+];
Binary file docs/api-2.1/search/close.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/defines_0.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/defines_0.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['_5f_5ffunction_5f_5f',['__FUNCTION__',['../test_8h.html#a828bb1dfda1afd67ca795075903d227d',1,'test.h']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/defines_1.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/defines_1.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,7 @@
+var searchData=
+[
+  ['alcalloc',['alcalloc',['../allocator_8h.html#a8d71470816f88f78cb9a9686c57e1b10',1,'allocator.h']]],
+  ['alfree',['alfree',['../allocator_8h.html#acd775785b54e97dc2b33a432c12c8fb2',1,'allocator.h']]],
+  ['almalloc',['almalloc',['../allocator_8h.html#ae1bc218fea8a35f4a3706f0beefcfb19',1,'allocator.h']]],
+  ['alrealloc',['alrealloc',['../allocator_8h.html#a029ee5c9bcbb3f873571553f788c5820',1,'allocator.h']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/defines_2.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/defines_2.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['prisstr',['PRIsstr',['../string_8h.html#a7d5bc48708405a28b23667e32dfcecae',1,'string.h']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/defines_3.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/defines_3.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,27 @@
+var searchData=
+[
+  ['s',['S',['../string_8h.html#a8fa17c8cf4c36df48f4108c36da8573e',1,'string.h']]],
+  ['sc',['SC',['../string_8h.html#a7d261dd0bc358c957a368bc058c1ce53',1,'string.h']]],
+  ['scstr',['SCSTR',['../string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed',1,'string.h']]],
+  ['sfmt',['SFMT',['../string_8h.html#a23ed51e87385886bb65e8cd19c839362',1,'string.h']]],
+  ['sstrcasecmp',['sstrcasecmp',['../string_8h.html#a81b0f6df794152c2038703d4e9d0ad59',1,'string.h']]],
+  ['sstrcaseprefix',['sstrcaseprefix',['../string_8h.html#acd3dc64e90db9b4046e14f115a815ff4',1,'string.h']]],
+  ['sstrcasesuffix',['sstrcasesuffix',['../string_8h.html#a57eabd4862d531dd685bbf2feb8468bf',1,'string.h']]],
+  ['sstrcat',['sstrcat',['../string_8h.html#a6af8a4c347c7fdb5980d4c4803be2759',1,'string.h']]],
+  ['sstrcat_5fa',['sstrcat_a',['../string_8h.html#a6068d460f9bc05962666a917d26568b3',1,'string.h']]],
+  ['sstrcmp',['sstrcmp',['../string_8h.html#a7ae7156c8de57454ca38d306100b8160',1,'string.h']]],
+  ['sstrdup',['sstrdup',['../string_8h.html#accbfd2b459a028d7af9fb7df6f977d80',1,'string.h']]],
+  ['sstrdup_5fa',['sstrdup_a',['../string_8h.html#a8d098baada4ea9ad5d8b6343b5aec007',1,'string.h']]],
+  ['sstrlower',['sstrlower',['../string_8h.html#a89343ea3e719f00ee802b557db57b769',1,'string.h']]],
+  ['sstrlower_5fa',['sstrlower_a',['../string_8h.html#a4bb4742fe71115f493991d307cb22b23',1,'string.h']]],
+  ['sstrnlen',['sstrnlen',['../string_8h.html#a33fa945acc5ac2ce962e5ef13cf1638c',1,'string.h']]],
+  ['sstrprefix',['sstrprefix',['../string_8h.html#a7d73b66256384b26927e787318fdefa2',1,'string.h']]],
+  ['sstrscstr',['sstrscstr',['../string_8h.html#aa696932213265e10f864678686f4ccde',1,'string.h']]],
+  ['sstrsplit',['sstrsplit',['../string_8h.html#aa929984004c3576bfafb95031aca8eb7',1,'string.h']]],
+  ['sstrsplit_5fa',['sstrsplit_a',['../string_8h.html#ac9f69fa3a17e26a3a5f9d985b5844601',1,'string.h']]],
+  ['sstrstr',['sstrstr',['../string_8h.html#a9d03be026afa9447c52bb34b9e3b895a',1,'string.h']]],
+  ['sstrsuffix',['sstrsuffix',['../string_8h.html#ac6a5246f26be2e8a5f34d8995b7ec14e',1,'string.h']]],
+  ['sstrupper',['sstrupper',['../string_8h.html#a084fe5a3a90d6fb6b15ecda03bb30824',1,'string.h']]],
+  ['sstrupper_5fa',['sstrupper_a',['../string_8h.html#a5f0dd83c0176b812fb428004b2877a34',1,'string.h']]],
+  ['st',['ST',['../string_8h.html#a9037956cca97a4e84b642f17f3d10378',1,'string.h']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/defines_4.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/defines_4.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,59 @@
+var searchData=
+[
+  ['ucx_5fallocator_5fdefault',['UCX_ALLOCATOR_DEFAULT',['../allocator_8h.html#a1283a8f875f90a7af3aba5e031fc2e3f',1,'allocator.h']]],
+  ['ucx_5farray_5futil_5fset',['ucx_array_util_set',['../array_8h.html#a1d959c29af3125bdd37cde3a554e729c',1,'array.h']]],
+  ['ucx_5farray_5futil_5fsetptr',['ucx_array_util_setptr',['../array_8h.html#a59a5b342965e790945f9c7a3f86b99f9',1,'array.h']]],
+  ['ucx_5favl_5fdefault_5fnew',['ucx_avl_default_new',['../avl_8h.html#ac2886d4b79b48c9fabf6408873f84cd2',1,'avl.h']]],
+  ['ucx_5favl_5ffind_5fclosest',['UCX_AVL_FIND_CLOSEST',['../avl_8h.html#af16f24d74fd6af0154de041566c6603b',1,'avl.h']]],
+  ['ucx_5favl_5ffind_5fexact',['UCX_AVL_FIND_EXACT',['../avl_8h.html#aaaf4a6f6f661cda7791db239212285d9',1,'avl.h']]],
+  ['ucx_5favl_5ffind_5flower_5fbounded',['UCX_AVL_FIND_LOWER_BOUNDED',['../avl_8h.html#abd2446d544d5412b6997ee8a17bd368c',1,'avl.h']]],
+  ['ucx_5favl_5ffind_5fupper_5fbounded',['UCX_AVL_FIND_UPPER_BOUNDED',['../avl_8h.html#ac74ee7649c1e206b08b31f37dd68ca5e',1,'avl.h']]],
+  ['ucx_5fbprintf',['ucx_bprintf',['../utils_8h.html#a9d7d65a420f026fcb6982803d5120519',1,'utils.h']]],
+  ['ucx_5fbuffer_5fautoextend',['UCX_BUFFER_AUTOEXTEND',['../buffer_8h.html#a05f9565f2d04399168c3b1c152a632be',1,'buffer.h']]],
+  ['ucx_5fbuffer_5fautofree',['UCX_BUFFER_AUTOFREE',['../buffer_8h.html#a8bab11ad8a76719228b9ee91e2e45535',1,'buffer.h']]],
+  ['ucx_5fbuffer_5fclear',['ucx_buffer_clear',['../buffer_8h.html#a374abd5aabfcc3ee0777a79d5fe651ab',1,'buffer.h']]],
+  ['ucx_5fbuffer_5fclone',['ucx_buffer_clone',['../buffer_8h.html#a828353846428c2c2f695f9938f059e52',1,'buffer.h']]],
+  ['ucx_5fbuffer_5fdefault',['UCX_BUFFER_DEFAULT',['../buffer_8h.html#acc77c8ed7b26854f555d4a5d11e49ea2',1,'buffer.h']]],
+  ['ucx_5fbuffer_5fto_5fsstr',['ucx_buffer_to_sstr',['../buffer_8h.html#a0f4b64f1b3a74c4f6c5d9409d6b6086a',1,'buffer.h']]],
+  ['ucx_5fforeach',['UCX_FOREACH',['../list_8h.html#a4b143b6526a410aa4d22cb3bb9365d70',1,'list.h']]],
+  ['ucx_5flogger_5fdebug',['ucx_logger_debug',['../logging_8h.html#a2936402799892db5138e5f1f8c25db0c',1,'ucx_logger_debug():&#160;logging.h'],['../logging_8h.html#acff01d1ef919ea997cfce755fc1b83d8',1,'UCX_LOGGER_DEBUG():&#160;logging.h']]],
+  ['ucx_5flogger_5ferror',['ucx_logger_error',['../logging_8h.html#a6a9e472e14d6768e59d96d245e065397',1,'ucx_logger_error():&#160;logging.h'],['../logging_8h.html#aa254c07fe3a907613e2256a318d5c9a8',1,'UCX_LOGGER_ERROR():&#160;logging.h']]],
+  ['ucx_5flogger_5finfo',['UCX_LOGGER_INFO',['../logging_8h.html#a4b0178bf60a6129373ffc59114ca4c9b',1,'UCX_LOGGER_INFO():&#160;logging.h'],['../logging_8h.html#a98464d8d51376ce2716dcc4eca00d5da',1,'ucx_logger_info():&#160;logging.h']]],
+  ['ucx_5flogger_5flevel',['UCX_LOGGER_LEVEL',['../logging_8h.html#aee18bc20e58ffb69910121512c350839',1,'logging.h']]],
+  ['ucx_5flogger_5flog',['ucx_logger_log',['../logging_8h.html#aa0245325031d95799b28def177fd14ec',1,'logging.h']]],
+  ['ucx_5flogger_5fregister_5flevel',['ucx_logger_register_level',['../logging_8h.html#a5cffc19502c4c90bfb3bd3bbcd18170a',1,'logging.h']]],
+  ['ucx_5flogger_5fsource',['UCX_LOGGER_SOURCE',['../logging_8h.html#a0e0d72b12616c1e49ff8834eaf4cb8a2',1,'logging.h']]],
+  ['ucx_5flogger_5ftimestamp',['UCX_LOGGER_TIMESTAMP',['../logging_8h.html#a38607008268b4f776ee500fb95d2e823',1,'logging.h']]],
+  ['ucx_5flogger_5ftrace',['UCX_LOGGER_TRACE',['../logging_8h.html#a55b88d1fec7036d841b3ddd6195c5586',1,'UCX_LOGGER_TRACE():&#160;logging.h'],['../logging_8h.html#a3031b7ff13f4cfae9c2916543be2877c',1,'ucx_logger_trace():&#160;logging.h']]],
+  ['ucx_5flogger_5fwarn',['UCX_LOGGER_WARN',['../logging_8h.html#abd01ca11486226ba34e8f7028d9fffba',1,'UCX_LOGGER_WARN():&#160;logging.h'],['../logging_8h.html#aca7bd861b646892813fd7310c0aa69af',1,'ucx_logger_warn():&#160;logging.h']]],
+  ['ucx_5fmap_5fcstr_5fget',['ucx_map_cstr_get',['../map_8h.html#a64e1fb55498fa502dd2ed8ed69062cdd',1,'map.h']]],
+  ['ucx_5fmap_5fcstr_5fput',['ucx_map_cstr_put',['../map_8h.html#ad9356b01425b934ab237b52339ac0cc3',1,'map.h']]],
+  ['ucx_5fmap_5fcstr_5fremove',['ucx_map_cstr_remove',['../map_8h.html#a9c4405a5a75ecf64e2ef3d0c6501a9fe',1,'map.h']]],
+  ['ucx_5fmap_5fforeach',['UCX_MAP_FOREACH',['../map_8h.html#a940896c4aa1b13e54c55c04c3efc186b',1,'map.h']]],
+  ['ucx_5fmap_5fint_5fget',['ucx_map_int_get',['../map_8h.html#aa1681bd2178553cd092fd24c4d681d3c',1,'map.h']]],
+  ['ucx_5fmap_5fint_5fput',['ucx_map_int_put',['../map_8h.html#aaa30af79b4068c923895619e83f44367',1,'map.h']]],
+  ['ucx_5fmap_5fint_5fremove',['ucx_map_int_remove',['../map_8h.html#aa767958b5468737755c09f7185b1770c',1,'map.h']]],
+  ['ucx_5fmap_5fsstr_5fget',['ucx_map_sstr_get',['../map_8h.html#a14d385f6b7f371f0507861cabd2eab4e',1,'map.h']]],
+  ['ucx_5fmap_5fsstr_5fput',['ucx_map_sstr_put',['../map_8h.html#ac26a8615bfc8f47ee9eaceb47645f98e',1,'map.h']]],
+  ['ucx_5fmap_5fsstr_5fremove',['ucx_map_sstr_remove',['../map_8h.html#a48700ea86fadb9ea54d13010f9124df2',1,'map.h']]],
+  ['ucx_5fmempool_5fnew_5fdefault',['ucx_mempool_new_default',['../mempool_8h.html#a49f7bd1da5ac201d0cf54dc0f0d82dd2',1,'mempool.h']]],
+  ['ucx_5fsprintf',['ucx_sprintf',['../utils_8h.html#af9f333b66ecd639c347c7235f4992e2e',1,'utils.h']]],
+  ['ucx_5fstack_5fdim',['ucx_stack_dim',['../stack_8h.html#a3b761343c6491222604341ebfa443226',1,'stack.h']]],
+  ['ucx_5fstack_5fempty',['ucx_stack_empty',['../stack_8h.html#a4f7239dbd6c032c56812e370b71c1985',1,'stack.h']]],
+  ['ucx_5fstack_5fpop',['ucx_stack_pop',['../stack_8h.html#a506b82374734ec476d086ddfb561174d',1,'stack.h']]],
+  ['ucx_5fstack_5ftopsize',['ucx_stack_topsize',['../stack_8h.html#a030197051a803e87d5eeac5adb80b15a',1,'stack.h']]],
+  ['ucx_5fstream_5fbcopy',['ucx_stream_bcopy',['../utils_8h.html#a6003a1750a66234169bd1f8cc84b297b',1,'utils.h']]],
+  ['ucx_5fstream_5fcopy',['ucx_stream_copy',['../utils_8h.html#a41ca1344f781c0d3bf7a414a6e811392',1,'utils.h']]],
+  ['ucx_5fstream_5fcopy_5fbufsize',['UCX_STREAM_COPY_BUFSIZE',['../utils_8h.html#a23efd74fa5f701d4cf26ccbfd138a439',1,'utils.h']]],
+  ['ucx_5fstream_5fncopy',['ucx_stream_ncopy',['../utils_8h.html#add13f39a8af440b4f7e6f74339eaada2',1,'utils.h']]],
+  ['ucx_5fszmul',['ucx_szmul',['../ucx_8h.html#a0b5ed6c1a0b15356f4f948acfd32a4cc',1,'ucx.h']]],
+  ['ucx_5ftest',['UCX_TEST',['../test_8h.html#a66cfb29c329fc9eaef071f2449836659',1,'test.h']]],
+  ['ucx_5ftest_5fassert',['UCX_TEST_ASSERT',['../test_8h.html#a08f477cd12fc3fe741a92493e5df58a9',1,'test.h']]],
+  ['ucx_5ftest_5fbegin',['UCX_TEST_BEGIN',['../test_8h.html#a0547b8d4f3bcdb0633fdd8925e8aa5d4',1,'test.h']]],
+  ['ucx_5ftest_5fcall_5fsubroutine',['UCX_TEST_CALL_SUBROUTINE',['../test_8h.html#a0efbab91c54f5237a2ab207f48cf0e51',1,'test.h']]],
+  ['ucx_5ftest_5fend',['UCX_TEST_END',['../test_8h.html#a86e64857c04f0447f8b16fb9c2b3b639',1,'test.h']]],
+  ['ucx_5ftest_5fsubroutine',['UCX_TEST_SUBROUTINE',['../test_8h.html#ae073cf5ead22cb27d662da048e16f44a',1,'test.h']]],
+  ['ucx_5fversion',['UCX_VERSION',['../ucx_8h.html#af12001920ca2fc1405615684e4dea284',1,'ucx.h']]],
+  ['ucx_5fversion_5fmajor',['UCX_VERSION_MAJOR',['../ucx_8h.html#aa57e5dd22d42387d748cc16777df1383',1,'ucx.h']]],
+  ['ucx_5fversion_5fminor',['UCX_VERSION_MINOR',['../ucx_8h.html#a9ac10d6353e23d4615a87fc737c65eb0',1,'ucx.h']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/files_0.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/files_0.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,6 @@
+var searchData=
+[
+  ['allocator_2eh',['allocator.h',['../allocator_8h.html',1,'']]],
+  ['array_2eh',['array.h',['../array_8h.html',1,'']]],
+  ['avl_2eh',['avl.h',['../avl_8h.html',1,'']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/files_1.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/files_1.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['buffer_2eh',['buffer.h',['../buffer_8h.html',1,'']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/files_2.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/files_2.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['list_2eh',['list.h',['../list_8h.html',1,'']]],
+  ['logging_2eh',['logging.h',['../logging_8h.html',1,'']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/files_3.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/files_3.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['map_2eh',['map.h',['../map_8h.html',1,'']]],
+  ['mempool_2eh',['mempool.h',['../mempool_8h.html',1,'']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/files_4.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/files_4.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['properties_2eh',['properties.h',['../properties_8h.html',1,'']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/files_5.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_5.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/files_5.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['stack_2eh',['stack.h',['../stack_8h.html',1,'']]],
+  ['string_2eh',['string.h',['../string_8h.html',1,'']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/files_6.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_6.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/files_6.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['test_2eh',['test.h',['../test_8h.html',1,'']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/files_7.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_7.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/files_7.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['ucx_2eh',['ucx.h',['../ucx_8h.html',1,'']]],
+  ['utils_2eh',['utils.h',['../utils_8h.html',1,'']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/functions_0.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/functions_0.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,36 @@
+var searchData=
+[
+  ['scstr',['scstr',['../string_8h.html#a2b1d6f1eca1c1549f37107b9c026c5a6',1,'string.c']]],
+  ['scstrcasecmp',['scstrcasecmp',['../string_8h.html#aca8142fb823d253054e17c17cfca05e0',1,'string.c']]],
+  ['scstrcaseprefix',['scstrcaseprefix',['../string_8h.html#a3718ef4aa1e86cdb26bda2f07fb585df',1,'string.c']]],
+  ['scstrcasesuffix',['scstrcasesuffix',['../string_8h.html#a6edb4b85f2b9efe79db7ffe6eccd7bc3',1,'string.c']]],
+  ['scstrcat',['scstrcat',['../string_8h.html#a7376842c19e954b49215da81ef76ac0c',1,'string.c']]],
+  ['scstrcat_5fa',['scstrcat_a',['../string_8h.html#abacce4cbd6f70fcb6453904ef08b02e9',1,'string.c']]],
+  ['scstrchr',['scstrchr',['../string_8h.html#a5836d6a7a744791c35e5c17bdc394a87',1,'string.c']]],
+  ['scstrcmp',['scstrcmp',['../string_8h.html#af35272a8e5408c88ed3e25a3a98f0a82',1,'string.c']]],
+  ['scstrdup',['scstrdup',['../string_8h.html#a97dccce03af419596dbdd592ca46a164',1,'string.c']]],
+  ['scstrdup_5fa',['scstrdup_a',['../string_8h.html#a8fe58921f51eb1fde038472377e63014',1,'string.c']]],
+  ['scstrlower',['scstrlower',['../string_8h.html#abccf198bea3186ff2abb080cc88dcae6',1,'string.c']]],
+  ['scstrlower_5fa',['scstrlower_a',['../string_8h.html#a3cf1e557df7ab58d03c78832c4060276',1,'string.c']]],
+  ['scstrn',['scstrn',['../string_8h.html#ae594f6e222ea394cef6a26c0dfad000d',1,'string.c']]],
+  ['scstrnlen',['scstrnlen',['../string_8h.html#ac1b000030d6d197eec48c15a182055d5',1,'string.c']]],
+  ['scstrprefix',['scstrprefix',['../string_8h.html#a599ddc2f88dd1df68b72eefd91347393',1,'string.c']]],
+  ['scstrrchr',['scstrrchr',['../string_8h.html#ae389835b97cd9382e7d6a6a075323376',1,'string.c']]],
+  ['scstrscstr',['scstrscstr',['../string_8h.html#a54f256c3abe811c52d58b4ff1b23f051',1,'string.c']]],
+  ['scstrsplit',['scstrsplit',['../string_8h.html#ae71cac352b00230848bde358f0fb05ea',1,'string.c']]],
+  ['scstrsplit_5fa',['scstrsplit_a',['../string_8h.html#a52906455ae530c9cdc6812c8e6d9bdef',1,'string.c']]],
+  ['scstrsstr',['scstrsstr',['../string_8h.html#aa4362cb36c6629f9d8484739fd827748',1,'string.c']]],
+  ['scstrsubs',['scstrsubs',['../string_8h.html#a9a6c8d8db0dda0037c3c852cce1a5060',1,'string.c']]],
+  ['scstrsubsl',['scstrsubsl',['../string_8h.html#ad50f0f67b906fad0744f46bcb51e144b',1,'string.c']]],
+  ['scstrsuffix',['scstrsuffix',['../string_8h.html#a1f0ae316a2afe85d5b4655e6ece6721a',1,'string.c']]],
+  ['scstrtrim',['scstrtrim',['../string_8h.html#ad374b16eb1be8b48019debad9b9f268c',1,'string.c']]],
+  ['scstrupper',['scstrupper',['../string_8h.html#af3dd09ec9d11162fe0075f4e60f41240',1,'string.c']]],
+  ['scstrupper_5fa',['scstrupper_a',['../string_8h.html#aea94613eb74668cc05d365803d32bfad',1,'string.c']]],
+  ['sstr',['sstr',['../string_8h.html#a539eb7059251a051ee5d179526a23e9a',1,'string.c']]],
+  ['sstrchr',['sstrchr',['../string_8h.html#af80898a0b75955eb2579298c3ae2c481',1,'string.c']]],
+  ['sstrn',['sstrn',['../string_8h.html#a2744c38ac44abf3e01fa059056dcf36c',1,'string.c']]],
+  ['sstrrchr',['sstrrchr',['../string_8h.html#adae3f59957ca328e1da5285cb8b02a72',1,'string.c']]],
+  ['sstrsubs',['sstrsubs',['../string_8h.html#a5eb9e0e1f26cf7fbecc038cd90e8b258',1,'string.c']]],
+  ['sstrsubsl',['sstrsubsl',['../string_8h.html#a78925c91af54f23cebd20ff99ef4331a',1,'string.c']]],
+  ['sstrtrim',['sstrtrim',['../string_8h.html#ae2d6da564d3fce51f2e0cac580fdbc56',1,'string.c']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/functions_1.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/functions_1.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,185 @@
+var searchData=
+[
+  ['ucx_5farray_5fappend_5ffrom',['ucx_array_append_from',['../array_8h.html#aea01731ad94ea73c0c8fb1d1b7a35fcf',1,'array.c']]],
+  ['ucx_5farray_5fat',['ucx_array_at',['../array_8h.html#aa698085fd1a8b70d6b709999c51b49e8',1,'array.c']]],
+  ['ucx_5farray_5fclone',['ucx_array_clone',['../array_8h.html#a4a8c273370e4a3a3e2624e364f5ab410',1,'array.c']]],
+  ['ucx_5farray_5fconcat',['ucx_array_concat',['../array_8h.html#aa5a0bf3d3f0df6406beb0e569021cc28',1,'array.c']]],
+  ['ucx_5farray_5fcontains',['ucx_array_contains',['../array_8h.html#a5241058cd2329147bc5b1593ae7e51dc',1,'array.c']]],
+  ['ucx_5farray_5fdestroy',['ucx_array_destroy',['../array_8h.html#a8e83681d8d5d8cddbf10f63ce5be4c10',1,'array.c']]],
+  ['ucx_5farray_5fequals',['ucx_array_equals',['../array_8h.html#a43292b448adb1741677aa8c578bcc201',1,'array.c']]],
+  ['ucx_5farray_5ffind',['ucx_array_find',['../array_8h.html#ae7bdbed94afee9b20b38b95e3ab470f0',1,'array.c']]],
+  ['ucx_5farray_5ffree',['ucx_array_free',['../array_8h.html#ac01ee914468a16f470bf3071fffbe438',1,'array.c']]],
+  ['ucx_5farray_5fgrow',['ucx_array_grow',['../array_8h.html#ab0cbf243824aaebee48277315e03afce',1,'array.c']]],
+  ['ucx_5farray_5finit',['ucx_array_init',['../array_8h.html#ad921e85c28ffae32230777a53c5037e5',1,'array.c']]],
+  ['ucx_5farray_5finit_5fa',['ucx_array_init_a',['../array_8h.html#a2451e61ebb15a7ba1c1319267ba75b8c',1,'array.c']]],
+  ['ucx_5farray_5fnew',['ucx_array_new',['../array_8h.html#a994a2fbf1c33a3833e2a70cd9a4352b7',1,'array.c']]],
+  ['ucx_5farray_5fnew_5fa',['ucx_array_new_a',['../array_8h.html#a177170258c215eb2e4f5a32e59f0cb1b',1,'array.c']]],
+  ['ucx_5farray_5fprepend_5ffrom',['ucx_array_prepend_from',['../array_8h.html#a95b52acc2193b5c33cf0eaa4f2082477',1,'array.c']]],
+  ['ucx_5farray_5fremove',['ucx_array_remove',['../array_8h.html#aa45eac6b697f83adac81c0860cf306b8',1,'array.c']]],
+  ['ucx_5farray_5fremove_5ffast',['ucx_array_remove_fast',['../array_8h.html#a548d81b07612bae3ba8c4c4b49104b8e',1,'array.c']]],
+  ['ucx_5farray_5freserve',['ucx_array_reserve',['../array_8h.html#a1c3bf8433c1de3c933f3854ab297fe1d',1,'array.c']]],
+  ['ucx_5farray_5fresize',['ucx_array_resize',['../array_8h.html#a27762e7c06a6c781015e3c8ceeee0ce3',1,'array.c']]],
+  ['ucx_5farray_5fset_5ffrom',['ucx_array_set_from',['../array_8h.html#a1bb545d065358d265d80d815ba382a28',1,'array.c']]],
+  ['ucx_5farray_5fshrink',['ucx_array_shrink',['../array_8h.html#a2daf50e80aee9bccebee876a7efd2dfc',1,'array.c']]],
+  ['ucx_5farray_5fsort',['ucx_array_sort',['../array_8h.html#add773514569b872a6624381b4b6af52c',1,'array.c']]],
+  ['ucx_5farray_5futil_5fset_5fa',['ucx_array_util_set_a',['../array_8h.html#ad0a8d76980cf1c1910e64a245803fb9a',1,'array.c']]],
+  ['ucx_5farray_5futil_5fsetptr_5fa',['ucx_array_util_setptr_a',['../array_8h.html#ad708b333c0c1b02c998309a58ea65e31',1,'array.c']]],
+  ['ucx_5fasprintf',['ucx_asprintf',['../utils_8h.html#a9f9cf0e89ffdc256ecb35429907f51f5',1,'utils.c']]],
+  ['ucx_5favl_5fcount',['ucx_avl_count',['../avl_8h.html#a92c1d41c2b22fe4a029a486ab2153e35',1,'avl.c']]],
+  ['ucx_5favl_5ffind',['ucx_avl_find',['../avl_8h.html#a51770e1614b28d7d22dea096c3704f83',1,'avl.c']]],
+  ['ucx_5favl_5ffind_5fnode',['ucx_avl_find_node',['../avl_8h.html#a664986f64d6865605199fbff06e19cd5',1,'avl.c']]],
+  ['ucx_5favl_5ffree',['ucx_avl_free',['../avl_8h.html#a2f92db538f25fce908d2cb3e5590944c',1,'avl.c']]],
+  ['ucx_5favl_5ffree_5fcontent',['ucx_avl_free_content',['../avl_8h.html#a31ad7fb196ca211f1fc39f4e15f72279',1,'avl.c']]],
+  ['ucx_5favl_5fget',['ucx_avl_get',['../avl_8h.html#adbcf7ceb3f014a30c7214f7304519efe',1,'avl.c']]],
+  ['ucx_5favl_5fget_5fnode',['ucx_avl_get_node',['../avl_8h.html#acf42da9a4168e47dc10b4ba0d27ceb4e',1,'avl.c']]],
+  ['ucx_5favl_5fnew',['ucx_avl_new',['../avl_8h.html#a11b043d65a11b7092d5d98b298e5ede3',1,'avl.c']]],
+  ['ucx_5favl_5fnew_5fa',['ucx_avl_new_a',['../avl_8h.html#af0f868d67e9dc08b4867c02a06c23ee2',1,'avl.c']]],
+  ['ucx_5favl_5fpred',['ucx_avl_pred',['../avl_8h.html#a0e739aeb66dda6a6a3f6eb51b50cf346',1,'avl.c']]],
+  ['ucx_5favl_5fput',['ucx_avl_put',['../avl_8h.html#aec401fab4a24a7edffa734f9baf88577',1,'avl.c']]],
+  ['ucx_5favl_5fput_5fs',['ucx_avl_put_s',['../avl_8h.html#a32cf8955cc0226a82bacfc7b76d6474c',1,'avl.c']]],
+  ['ucx_5favl_5fremove',['ucx_avl_remove',['../avl_8h.html#a1d821119c805d7fbb7e424bc3effeba9',1,'avl.c']]],
+  ['ucx_5favl_5fremove_5fnode',['ucx_avl_remove_node',['../avl_8h.html#a9a792b7d9e58073deef74a341f8bc720',1,'avl.c']]],
+  ['ucx_5favl_5fremove_5fs',['ucx_avl_remove_s',['../avl_8h.html#a01aeeecd6415f0cc2b623486eb28f254',1,'avl.c']]],
+  ['ucx_5favl_5fsucc',['ucx_avl_succ',['../avl_8h.html#aab1ad9b027ff5e50671aa0ee84e2d541',1,'avl.c']]],
+  ['ucx_5fbuffer_5feof',['ucx_buffer_eof',['../buffer_8h.html#abad7fd9ad5061224c780b8d1d4c55f09',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fextend',['ucx_buffer_extend',['../buffer_8h.html#afaf97d2cd7e9faad79a9d35fe33e30c6',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fextract',['ucx_buffer_extract',['../buffer_8h.html#a33fa7bb35fe08bbb3542f227514332ef',1,'buffer.c']]],
+  ['ucx_5fbuffer_5ffree',['ucx_buffer_free',['../buffer_8h.html#a2af8646d8905c22c7322e7540b0440af',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fgetc',['ucx_buffer_getc',['../buffer_8h.html#a396339022159ce4ca6d069de9f9209b0',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fnew',['ucx_buffer_new',['../buffer_8h.html#aacea876d692193ec6f859ce98da7351c',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fputc',['ucx_buffer_putc',['../buffer_8h.html#a7d6f01b9d631b0123475dfb98fb849ac',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fputs',['ucx_buffer_puts',['../buffer_8h.html#af1d4b478e04b3ae0bf30e7c2ea964ea2',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fread',['ucx_buffer_read',['../buffer_8h.html#ae5c3430759f0059547b35d5a254d4da5',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fseek',['ucx_buffer_seek',['../buffer_8h.html#a47d98482662073c74f35deb0957d15d1',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fshift',['ucx_buffer_shift',['../buffer_8h.html#a12a0c6a2379ef080043e6286bb8bad69',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fshift_5fleft',['ucx_buffer_shift_left',['../buffer_8h.html#a20431dd0ed6a6fe9f15333bd72afe4db',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fshift_5fright',['ucx_buffer_shift_right',['../buffer_8h.html#a4fa10b6471495547eb981248fd4f1bc2',1,'buffer.c']]],
+  ['ucx_5fbuffer_5fwrite',['ucx_buffer_write',['../buffer_8h.html#af8aacc7401814392b58c1b7b81bffc05',1,'buffer.c']]],
+  ['ucx_5fcmp_5fdouble',['ucx_cmp_double',['../utils_8h.html#ab804b7c27d0bfcd7bf3a3583140825b6',1,'utils.c']]],
+  ['ucx_5fcmp_5ffloat',['ucx_cmp_float',['../utils_8h.html#ad1196b561bcdad76c393885819769a97',1,'utils.c']]],
+  ['ucx_5fcmp_5fint',['ucx_cmp_int',['../utils_8h.html#a8ce7e11e6b3deafe89a32a091fde7f16',1,'utils.c']]],
+  ['ucx_5fcmp_5fint16',['ucx_cmp_int16',['../utils_8h.html#aa29e6e559946375e34113e34e0b0bd0d',1,'utils.c']]],
+  ['ucx_5fcmp_5fint32',['ucx_cmp_int32',['../utils_8h.html#a858b2ac443fb202643b71f6a7e9218dd',1,'utils.c']]],
+  ['ucx_5fcmp_5fint64',['ucx_cmp_int64',['../utils_8h.html#a54701aea6a89fed1402dfb0bf56bc7f6',1,'utils.c']]],
+  ['ucx_5fcmp_5flongint',['ucx_cmp_longint',['../utils_8h.html#aeb57a2b9a6aaa0460c7a6bec29accf2c',1,'utils.c']]],
+  ['ucx_5fcmp_5flonglong',['ucx_cmp_longlong',['../utils_8h.html#a366b57def20f86a41eaedf575eea5375',1,'utils.c']]],
+  ['ucx_5fcmp_5fmem',['ucx_cmp_mem',['../utils_8h.html#aff7d2bcded71196831a8c0664333f8e7',1,'utils.c']]],
+  ['ucx_5fcmp_5fptr',['ucx_cmp_ptr',['../utils_8h.html#aa174d539de3ea59be4f9640f17ce53d8',1,'utils.c']]],
+  ['ucx_5fcmp_5fsstr',['ucx_cmp_sstr',['../utils_8h.html#adee0739589166d272f8cb7c23aabf8ba',1,'utils.c']]],
+  ['ucx_5fcmp_5fstr',['ucx_cmp_str',['../utils_8h.html#aa6a37b9d172b6a5b2803d152f9e1b258',1,'utils.c']]],
+  ['ucx_5fcmp_5fstrn',['ucx_cmp_strn',['../utils_8h.html#ac6b354a878f551a3a5b20a167db3f308',1,'utils.c']]],
+  ['ucx_5fcmp_5fuint',['ucx_cmp_uint',['../utils_8h.html#abd83a5da91c3dd026a6931bd80c12f1e',1,'utils.c']]],
+  ['ucx_5fcmp_5fuint16',['ucx_cmp_uint16',['../utils_8h.html#acde5366437e886a459b7468f7a9e11f0',1,'utils.c']]],
+  ['ucx_5fcmp_5fuint32',['ucx_cmp_uint32',['../utils_8h.html#a5879d1722330355914d8c9146fa549d3',1,'utils.c']]],
+  ['ucx_5fcmp_5fuint64',['ucx_cmp_uint64',['../utils_8h.html#a1572a78b5b42f7151a5b2a5a7283d62d',1,'utils.c']]],
+  ['ucx_5fcmp_5fulongint',['ucx_cmp_ulongint',['../utils_8h.html#a3f3cbae2594d6f722bae29acb0408a24',1,'utils.c']]],
+  ['ucx_5fcmp_5fulonglong',['ucx_cmp_ulonglong',['../utils_8h.html#a6acfc359421f21f9a042a654ff7faac5',1,'utils.c']]],
+  ['ucx_5fdefault_5fallocator',['ucx_default_allocator',['../allocator_8h.html#a98d2f1b341118b7a0e341fda5d8b2ebf',1,'allocator.c']]],
+  ['ucx_5fdefault_5fcalloc',['ucx_default_calloc',['../allocator_8h.html#a3a0bfdd13d887012309c459b339f338f',1,'allocator.c']]],
+  ['ucx_5fdefault_5ffree',['ucx_default_free',['../allocator_8h.html#a646d83aaaadfe33ae414c0fad8bfc52a',1,'allocator.c']]],
+  ['ucx_5fdefault_5fmalloc',['ucx_default_malloc',['../allocator_8h.html#a96403ebf3d2312d95f2fe7627a1cdbc0',1,'allocator.c']]],
+  ['ucx_5fdefault_5frealloc',['ucx_default_realloc',['../allocator_8h.html#a47cfc8af626a86fcb93a2b14b90498ed',1,'allocator.c']]],
+  ['ucx_5fdist_5fint',['ucx_dist_int',['../utils_8h.html#a4ab6753739d56c09cdf6079fdcabf7c6',1,'utils.c']]],
+  ['ucx_5fdist_5fint16',['ucx_dist_int16',['../utils_8h.html#a81fb8434b70ca11bf2c14abfa21d16a9',1,'utils.c']]],
+  ['ucx_5fdist_5fint32',['ucx_dist_int32',['../utils_8h.html#ab4a659cc46096f0490c1dafa57726476',1,'utils.c']]],
+  ['ucx_5fdist_5fint64',['ucx_dist_int64',['../utils_8h.html#a54e7d06585bad3a899befc4e9c13853f',1,'utils.c']]],
+  ['ucx_5fdist_5flongint',['ucx_dist_longint',['../utils_8h.html#a43e73d288b1553a0078bf4c98dd341f5',1,'utils.c']]],
+  ['ucx_5fdist_5flonglong',['ucx_dist_longlong',['../utils_8h.html#a306778414a2427951ea263be92368627',1,'utils.c']]],
+  ['ucx_5fdist_5fuint',['ucx_dist_uint',['../utils_8h.html#a37b7d471ca1679992afc11a0deda45f4',1,'utils.c']]],
+  ['ucx_5fdist_5fuint16',['ucx_dist_uint16',['../utils_8h.html#a66e00a0703cbcde050ec922578e2f080',1,'utils.c']]],
+  ['ucx_5fdist_5fuint32',['ucx_dist_uint32',['../utils_8h.html#add2b5c5507caba59d894b84e056b079b',1,'utils.c']]],
+  ['ucx_5fdist_5fuint64',['ucx_dist_uint64',['../utils_8h.html#a3ba75e2e0b2479eef2b22fb219b42da7',1,'utils.c']]],
+  ['ucx_5fdist_5fulongint',['ucx_dist_ulongint',['../utils_8h.html#abb13476228d0c16bfaba08469adbae2d',1,'utils.c']]],
+  ['ucx_5fdist_5fulonglong',['ucx_dist_ulonglong',['../utils_8h.html#a59a5859272cb4b43cbdd58208c41e32b',1,'utils.c']]],
+  ['ucx_5ffprintf',['ucx_fprintf',['../utils_8h.html#aa0bec80e1c67f769ff5e112a7d4ce72a',1,'utils.c']]],
+  ['ucx_5fhash',['ucx_hash',['../map_8h.html#aea3be97254c05595d986ef6a9faae87b',1,'map.c']]],
+  ['ucx_5fkey',['ucx_key',['../map_8h.html#a3e540bb46b8ee19789aed63fd8919200',1,'map.c']]],
+  ['ucx_5flist_5fappend',['ucx_list_append',['../list_8h.html#a00c122c8a26d35b60676939df4161621',1,'list.c']]],
+  ['ucx_5flist_5fappend_5fa',['ucx_list_append_a',['../list_8h.html#adf3b3e2e0ff977d8928671d6bd82fc60',1,'list.c']]],
+  ['ucx_5flist_5fclone',['ucx_list_clone',['../list_8h.html#ae7054a41c289b24e6caf5cb07ac850ed',1,'list.c']]],
+  ['ucx_5flist_5fclone_5fa',['ucx_list_clone_a',['../list_8h.html#a08ca1ba0d2e82258b0408714c1f4c425',1,'list.c']]],
+  ['ucx_5flist_5fconcat',['ucx_list_concat',['../list_8h.html#a77163a0cc82fae52bec26c8c0c3674d9',1,'list.c']]],
+  ['ucx_5flist_5fcontains',['ucx_list_contains',['../list_8h.html#a8b0fa051fcfe12e1a82cca1087973852',1,'list.c']]],
+  ['ucx_5flist_5fdifference',['ucx_list_difference',['../list_8h.html#a6c5db5d1d11ad28b6fe1a80ee1c1e449',1,'list.c']]],
+  ['ucx_5flist_5fdifference_5fa',['ucx_list_difference_a',['../list_8h.html#a4a2a2fc5cc41073c516db6235bbc51d5',1,'list.c']]],
+  ['ucx_5flist_5fequals',['ucx_list_equals',['../list_8h.html#adc435447cecf885bc63d232191085bbe',1,'list.c']]],
+  ['ucx_5flist_5ffind',['ucx_list_find',['../list_8h.html#a9b3b6842d3be572e06a7f519e198cb83',1,'list.c']]],
+  ['ucx_5flist_5ffirst',['ucx_list_first',['../list_8h.html#a6aa0e34ebc5f0dca6f52d0f7626b4bd5',1,'list.c']]],
+  ['ucx_5flist_5ffree',['ucx_list_free',['../list_8h.html#a1a0fa2c5b1e478a96da19b0c3f013668',1,'list.c']]],
+  ['ucx_5flist_5ffree_5fa',['ucx_list_free_a',['../list_8h.html#a944e11f76c38767cd1100d72a4e3b25b',1,'list.c']]],
+  ['ucx_5flist_5ffree_5fcontent',['ucx_list_free_content',['../list_8h.html#a4ba6c96642f72ea046cc22627c72979c',1,'list.c']]],
+  ['ucx_5flist_5fget',['ucx_list_get',['../list_8h.html#a2509ffe19bce6a8708c77f89480c75fb',1,'list.c']]],
+  ['ucx_5flist_5findexof',['ucx_list_indexof',['../list_8h.html#ae2ff2974812ca185870f80bc4ed9337e',1,'list.c']]],
+  ['ucx_5flist_5fintersection',['ucx_list_intersection',['../list_8h.html#a259f9b754978aeca23dfabba16e20f39',1,'list.c']]],
+  ['ucx_5flist_5fintersection_5fa',['ucx_list_intersection_a',['../list_8h.html#a1d0b00514dbb81ba6270b58da0c5b9a8',1,'list.c']]],
+  ['ucx_5flist_5flast',['ucx_list_last',['../list_8h.html#add5ec40c5006e29c629d23c2eb5a6553',1,'list.c']]],
+  ['ucx_5flist_5fprepend',['ucx_list_prepend',['../list_8h.html#a8fcb68e4556395b15180eec2d0b77aa4',1,'list.c']]],
+  ['ucx_5flist_5fprepend_5fa',['ucx_list_prepend_a',['../list_8h.html#a54654e6dc60e1c3de9e886c150e404ec',1,'list.c']]],
+  ['ucx_5flist_5fremove',['ucx_list_remove',['../list_8h.html#a410cb3e8260037ba56c72d14b899b468',1,'list.c']]],
+  ['ucx_5flist_5fremove_5fa',['ucx_list_remove_a',['../list_8h.html#aca687b7c4e7170175f447e549125aa52',1,'list.c']]],
+  ['ucx_5flist_5fsize',['ucx_list_size',['../list_8h.html#ae88001cc8ae40b946560f31434abed8f',1,'list.c']]],
+  ['ucx_5flist_5fsort',['ucx_list_sort',['../list_8h.html#ac74962d9bd7cfc9d3e2e09651469377b',1,'list.c']]],
+  ['ucx_5flist_5funion',['ucx_list_union',['../list_8h.html#a94ecdb0cea1633ad7074f027fa8485fa',1,'list.c']]],
+  ['ucx_5flist_5funion_5fa',['ucx_list_union_a',['../list_8h.html#a65b4355536f4ebc4130211b46469f4c1',1,'list.c']]],
+  ['ucx_5flogger_5ffree',['ucx_logger_free',['../logging_8h.html#ac4697b784e01ec990d2acea192e21658',1,'logging.c']]],
+  ['ucx_5flogger_5flogf',['ucx_logger_logf',['../logging_8h.html#ac337e5d02ebea565012d4c11bd643801',1,'logging.c']]],
+  ['ucx_5flogger_5fnew',['ucx_logger_new',['../logging_8h.html#ac560f8517d2172794c9d2691735ec48c',1,'logging.c']]],
+  ['ucx_5fmap_5fclear',['ucx_map_clear',['../map_8h.html#a285e90e40681c6d9631c935dda0967f2',1,'map.c']]],
+  ['ucx_5fmap_5fclone',['ucx_map_clone',['../map_8h.html#a62c6c30cbb0d824ba710f5030ff9a4e4',1,'map.c']]],
+  ['ucx_5fmap_5fclone_5fa',['ucx_map_clone_a',['../map_8h.html#a9aea9103703d5c168420bb6bf85549ea',1,'map.c']]],
+  ['ucx_5fmap_5fcopy',['ucx_map_copy',['../map_8h.html#adfeb2d61003fd2896bcfdc9a57f36425',1,'map.c']]],
+  ['ucx_5fmap_5fdifference',['ucx_map_difference',['../map_8h.html#a774fcff87d1e58b6c5af77dd19a8c3dc',1,'map.c']]],
+  ['ucx_5fmap_5fdifference_5fa',['ucx_map_difference_a',['../map_8h.html#ad0ba103494247d798ac3037c50fc8831',1,'map.c']]],
+  ['ucx_5fmap_5ffree',['ucx_map_free',['../map_8h.html#abe3d9688e4224bf7bb962abf25ff8c2e',1,'map.c']]],
+  ['ucx_5fmap_5ffree_5fcontent',['ucx_map_free_content',['../map_8h.html#a750f3d9d83e2f3788a14c17a9d160618',1,'map.c']]],
+  ['ucx_5fmap_5fget',['ucx_map_get',['../map_8h.html#ab61192c5af2e06ecb9ad73880d1c95a6',1,'map.c']]],
+  ['ucx_5fmap_5fintersection',['ucx_map_intersection',['../map_8h.html#aa594d7a5afebc3bed6bb265348cf6b0d',1,'map.c']]],
+  ['ucx_5fmap_5fintersection_5fa',['ucx_map_intersection_a',['../map_8h.html#a169e0470a20484dd76425fdf77e3651e',1,'map.c']]],
+  ['ucx_5fmap_5fiter_5fnext',['ucx_map_iter_next',['../map_8h.html#aceb8675abf44860b4bbc301bbada5b91',1,'map.c']]],
+  ['ucx_5fmap_5fiterator',['ucx_map_iterator',['../map_8h.html#a9150e9c64fdf4dfcc2cad106b91aa110',1,'map.c']]],
+  ['ucx_5fmap_5fnew',['ucx_map_new',['../map_8h.html#a79f31de8b93814493759dbc8b940cf0c',1,'map.c']]],
+  ['ucx_5fmap_5fnew_5fa',['ucx_map_new_a',['../map_8h.html#aed508a94c66cc15372503c64b70eb03e',1,'map.c']]],
+  ['ucx_5fmap_5fput',['ucx_map_put',['../map_8h.html#ac04a08b604217070254d4c58f0e82498',1,'map.c']]],
+  ['ucx_5fmap_5frehash',['ucx_map_rehash',['../map_8h.html#a174bce9fad554dd92b8da354e0d32512',1,'map.c']]],
+  ['ucx_5fmap_5fremove',['ucx_map_remove',['../map_8h.html#a17248a4888eb8f9ae18be522d64632aa',1,'map.c']]],
+  ['ucx_5fmap_5funion',['ucx_map_union',['../map_8h.html#a3f65978c481af7f637cad021d93522d5',1,'map.c']]],
+  ['ucx_5fmap_5funion_5fa',['ucx_map_union_a',['../map_8h.html#ab6370c3fa8113fdad593ce4b0460c9c6',1,'map.c']]],
+  ['ucx_5fmemcpy',['ucx_memcpy',['../utils_8h.html#ab2e184e6a744941aab6b8058116baf30',1,'utils.c']]],
+  ['ucx_5fmempool_5fcalloc',['ucx_mempool_calloc',['../mempool_8h.html#a4b9142011824ae24f00fabe128417d69',1,'mempool.c']]],
+  ['ucx_5fmempool_5fchcap',['ucx_mempool_chcap',['../mempool_8h.html#aaf75b5016098723a9280531ccc3a6d77',1,'mempool.c']]],
+  ['ucx_5fmempool_5fdestroy',['ucx_mempool_destroy',['../mempool_8h.html#af096378da7e9bfbed3088497cf4c15bf',1,'mempool.c']]],
+  ['ucx_5fmempool_5ffree',['ucx_mempool_free',['../mempool_8h.html#aefa26e3015f5aefadbfc74221bd246ac',1,'mempool.c']]],
+  ['ucx_5fmempool_5fmalloc',['ucx_mempool_malloc',['../mempool_8h.html#a2ae492b8f2878ccc9837ac213dced11e',1,'mempool.c']]],
+  ['ucx_5fmempool_5fnew',['ucx_mempool_new',['../mempool_8h.html#ad71cb8c3b6fdb30360376a8b372ef22a',1,'mempool.c']]],
+  ['ucx_5fmempool_5frealloc',['ucx_mempool_realloc',['../mempool_8h.html#a660ef42520ed6737c2e77aae18e3a7a4',1,'mempool.c']]],
+  ['ucx_5fmempool_5freg_5fdestr',['ucx_mempool_reg_destr',['../mempool_8h.html#af47b6b7c40f8f263dc28cc9a4e77b27c',1,'mempool.c']]],
+  ['ucx_5fmempool_5fset_5fdestr',['ucx_mempool_set_destr',['../mempool_8h.html#adb788e7ec24cd7dbdea6381539c549f2',1,'mempool.c']]],
+  ['ucx_5fproperties2map',['ucx_properties2map',['../properties_8h.html#a5c7ff8bc3139960a3f3dc92072b742f3',1,'properties.c']]],
+  ['ucx_5fproperties_5ffill',['ucx_properties_fill',['../properties_8h.html#aaf8de121764a4d22c763ff2ab41f3a4d',1,'properties.c']]],
+  ['ucx_5fproperties_5ffree',['ucx_properties_free',['../properties_8h.html#a38a2fe7bb2986bd87c7e69356ab05c05',1,'properties.c']]],
+  ['ucx_5fproperties_5fload',['ucx_properties_load',['../properties_8h.html#ae1b600f839a6b2278b68fc314981a8a3',1,'properties.c']]],
+  ['ucx_5fproperties_5fnew',['ucx_properties_new',['../properties_8h.html#a44d9dd12cab3aaa0084f1c8b89405796',1,'properties.c']]],
+  ['ucx_5fproperties_5fnext',['ucx_properties_next',['../properties_8h.html#a7e03bc573d45d48c538cd721e810d33c',1,'properties.c']]],
+  ['ucx_5fproperties_5fstore',['ucx_properties_store',['../properties_8h.html#a63c0c1b7648e675b21a1788917ff36fb',1,'properties.c']]],
+  ['ucx_5fsc2sc',['ucx_sc2sc',['../string_8h.html#a69d5e3eeec783cc43314df71248768f5',1,'string.c']]],
+  ['ucx_5fss2c_5fs',['ucx_ss2c_s',['../string_8h.html#aedeb5d7bddda54116101a8d68af8c56d',1,'string.h']]],
+  ['ucx_5fss2sc',['ucx_ss2sc',['../string_8h.html#a9ce5ad1b2aa2dbeba204d452c2e64359',1,'string.c']]],
+  ['ucx_5fstack_5favail',['ucx_stack_avail',['../stack_8h.html#a53cd2c7743dc8ad9cbd35ade0b4873e7',1,'stack.c']]],
+  ['ucx_5fstack_5fcalloc',['ucx_stack_calloc',['../stack_8h.html#afdc467524b5e19a9a777c6bc03e17174',1,'stack.c']]],
+  ['ucx_5fstack_5ffree',['ucx_stack_free',['../stack_8h.html#aabd55c14a3866b3782ba324f4d8b4c41',1,'stack.c']]],
+  ['ucx_5fstack_5finit',['ucx_stack_init',['../stack_8h.html#abaef685df4e7ef95cd7218984a0618fe',1,'stack.c']]],
+  ['ucx_5fstack_5fmalloc',['ucx_stack_malloc',['../stack_8h.html#af865b416802140f6b6e8ab3626d7d1ac',1,'stack.c']]],
+  ['ucx_5fstack_5fpopn',['ucx_stack_popn',['../stack_8h.html#a07ea48f28eab474dcfefbb86fa66ef81',1,'stack.c']]],
+  ['ucx_5fstack_5fpush',['ucx_stack_push',['../stack_8h.html#af85e6f77a8341beb6188f9ae1a8e9f92',1,'stack.c']]],
+  ['ucx_5fstack_5fpusharr',['ucx_stack_pusharr',['../stack_8h.html#a7bb138979191bba138e76ea37488fae2',1,'stack.c']]],
+  ['ucx_5fstack_5frealloc',['ucx_stack_realloc',['../stack_8h.html#a0c678f96f6fabab49b2b034a1fe91c3a',1,'stack.c']]],
+  ['ucx_5fstrcpy',['ucx_strcpy',['../utils_8h.html#adeb6e8d0a53a829207cfa0a979d01fff',1,'utils.c']]],
+  ['ucx_5fstream_5fbncopy',['ucx_stream_bncopy',['../utils_8h.html#a114ee7f7da62656ffd35e2dc23394201',1,'utils.c']]],
+  ['ucx_5fszmul_5fimpl',['ucx_szmul_impl',['../ucx_8h.html#a6637171cc0ec097b297f731a3036dd3b',1,'ucx.c']]],
+  ['ucx_5ftest_5fregister',['ucx_test_register',['../test_8h.html#a8dfabc42f183d3a4d79379a5d17bf67d',1,'test.c']]],
+  ['ucx_5ftest_5frun',['ucx_test_run',['../test_8h.html#a3721458deeecb43aa322428f007714c3',1,'test.c']]],
+  ['ucx_5ftest_5fsuite_5ffree',['ucx_test_suite_free',['../test_8h.html#a4a6ac61a6f72722273f8eaa7a343edde',1,'test.c']]],
+  ['ucx_5ftest_5fsuite_5fnew',['ucx_test_suite_new',['../test_8h.html#a531f0df90363e0befbe900878f65f09e',1,'test.c']]],
+  ['ucx_5fvasprintf',['ucx_vasprintf',['../utils_8h.html#a3ea1dfb856c741f3e8ec6bfdc9ad427e',1,'utils.c']]],
+  ['ucx_5fvfprintf',['ucx_vfprintf',['../utils_8h.html#a4907967beb92c3ae351dd239abbb6927',1,'utils.c']]]
+];
Binary file docs/api-2.1/search/mag_sel.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/nomatches.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,12 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/pages_0.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/pages_0.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['uap_20common_20extensions',['UAP Common Extensions',['../index.html',1,'']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/search.css	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,271 @@
+/*---------------- Search Box */
+
+#FSearchBox {
+    float: left;
+}
+
+#MSearchBox {
+    white-space : nowrap;
+    float: none;
+    margin-top: 8px;
+    right: 0px;
+    width: 170px;
+    height: 24px;
+    z-index: 102;
+}
+
+#MSearchBox .left
+{
+    display:block;
+    position:absolute;
+    left:10px;
+    width:20px;
+    height:19px;
+    background:url('search_l.png') no-repeat;
+    background-position:right;
+}
+
+#MSearchSelect {
+    display:block;
+    position:absolute;
+    width:20px;
+    height:19px;
+}
+
+.left #MSearchSelect {
+    left:4px;
+}
+
+.right #MSearchSelect {
+    right:5px;
+}
+
+#MSearchField {
+    display:block;
+    position:absolute;
+    height:19px;
+    background:url('search_m.png') repeat-x;
+    border:none;
+    width:115px;
+    margin-left:20px;
+    padding-left:4px;
+    color: #909090;
+    outline: none;
+    font: 9pt Arial, Verdana, sans-serif;
+    -webkit-border-radius: 0px;
+}
+
+#FSearchBox #MSearchField {
+    margin-left:15px;
+}
+
+#MSearchBox .right {
+    display:block;
+    position:absolute;
+    right:10px;
+    top:8px;
+    width:20px;
+    height:19px;
+    background:url('search_r.png') no-repeat;
+    background-position:left;
+}
+
+#MSearchClose {
+    display: none;
+    position: absolute;
+    top: 4px;
+    background : none;
+    border: none;
+    margin: 0px 4px 0px 0px;
+    padding: 0px 0px;
+    outline: none;
+}
+
+.left #MSearchClose {
+    left: 6px;
+}
+
+.right #MSearchClose {
+    right: 2px;
+}
+
+.MSearchBoxActive #MSearchField {
+    color: #000000;
+}
+
+/*---------------- Search filter selection */
+
+#MSearchSelectWindow {
+    display: none;
+    position: absolute;
+    left: 0; top: 0;
+    border: 1px solid #90A5CE;
+    background-color: #F9FAFC;
+    z-index: 10001;
+    padding-top: 4px;
+    padding-bottom: 4px;
+    -moz-border-radius: 4px;
+    -webkit-border-top-left-radius: 4px;
+    -webkit-border-top-right-radius: 4px;
+    -webkit-border-bottom-left-radius: 4px;
+    -webkit-border-bottom-right-radius: 4px;
+    -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+.SelectItem {
+    font: 8pt Arial, Verdana, sans-serif;
+    padding-left:  2px;
+    padding-right: 12px;
+    border: 0px;
+}
+
+span.SelectionMark {
+    margin-right: 4px;
+    font-family: monospace;
+    outline-style: none;
+    text-decoration: none;
+}
+
+a.SelectItem {
+    display: block;
+    outline-style: none;
+    color: #000000; 
+    text-decoration: none;
+    padding-left:   6px;
+    padding-right: 12px;
+}
+
+a.SelectItem:focus,
+a.SelectItem:active {
+    color: #000000; 
+    outline-style: none;
+    text-decoration: none;
+}
+
+a.SelectItem:hover {
+    color: #FFFFFF;
+    background-color: #3D578C;
+    outline-style: none;
+    text-decoration: none;
+    cursor: pointer;
+    display: block;
+}
+
+/*---------------- Search results window */
+
+iframe#MSearchResults {
+    width: 60ex;
+    height: 15em;
+}
+
+#MSearchResultsWindow {
+    display: none;
+    position: absolute;
+    left: 0; top: 0;
+    border: 1px solid #000;
+    background-color: #EEF1F7;
+    z-index:10000;
+}
+
+/* ----------------------------------- */
+
+
+#SRIndex {
+    clear:both; 
+    padding-bottom: 15px;
+}
+
+.SREntry {
+    font-size: 10pt;
+    padding-left: 1ex;
+}
+
+.SRPage .SREntry {
+    font-size: 8pt;
+    padding: 1px 5px;
+}
+
+body.SRPage {
+    margin: 5px 2px;
+}
+
+.SRChildren {
+    padding-left: 3ex; padding-bottom: .5em 
+}
+
+.SRPage .SRChildren {
+    display: none;
+}
+
+.SRSymbol {
+    font-weight: bold; 
+    color: #425E97;
+    font-family: Arial, Verdana, sans-serif;
+    text-decoration: none;
+    outline: none;
+}
+
+a.SRScope {
+    display: block;
+    color: #425E97; 
+    font-family: Arial, Verdana, sans-serif;
+    text-decoration: none;
+    outline: none;
+}
+
+a.SRSymbol:focus, a.SRSymbol:active,
+a.SRScope:focus, a.SRScope:active {
+    text-decoration: underline;
+}
+
+span.SRScope {
+    padding-left: 4px;
+}
+
+.SRPage .SRStatus {
+    padding: 2px 5px;
+    font-size: 8pt;
+    font-style: italic;
+}
+
+.SRResult {
+    display: none;
+}
+
+DIV.searchresults {
+    margin-left: 10px;
+    margin-right: 10px;
+}
+
+/*---------------- External search page results */
+
+.searchresult {
+    background-color: #F0F3F8;
+}
+
+.pages b {
+   color: white;
+   padding: 5px 5px 3px 5px;
+   background-image: url("../tab_a.png");
+   background-repeat: repeat-x;
+   text-shadow: 0 1px 1px #000000;
+}
+
+.pages {
+    line-height: 17px;
+    margin-left: 4px;
+    text-decoration: none;
+}
+
+.hl {
+    font-weight: bold;
+}
+
+#searchresults {
+    margin-bottom: 20px;
+}
+
+.searchpages {
+    margin-top: 10px;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/search.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,791 @@
+function convertToId(search)
+{
+  var result = '';
+  for (i=0;i<search.length;i++)
+  {
+    var c = search.charAt(i);
+    var cn = c.charCodeAt(0);
+    if (c.match(/[a-z0-9\u0080-\uFFFF]/))
+    {
+      result+=c;
+    }
+    else if (cn<16)
+    {
+      result+="_0"+cn.toString(16);
+    }
+    else
+    {
+      result+="_"+cn.toString(16);
+    }
+  }
+  return result;
+}
+
+function getXPos(item)
+{
+  var x = 0;
+  if (item.offsetWidth)
+  {
+    while (item && item!=document.body)
+    {
+      x   += item.offsetLeft;
+      item = item.offsetParent;
+    }
+  }
+  return x;
+}
+
+function getYPos(item)
+{
+  var y = 0;
+  if (item.offsetWidth)
+  {
+     while (item && item!=document.body)
+     {
+       y   += item.offsetTop;
+       item = item.offsetParent;
+     }
+  }
+  return y;
+}
+
+/* A class handling everything associated with the search panel.
+
+   Parameters:
+   name - The name of the global variable that will be
+          storing this instance.  Is needed to be able to set timeouts.
+   resultPath - path to use for external files
+*/
+function SearchBox(name, resultsPath, inFrame, label)
+{
+  if (!name || !resultsPath) {  alert("Missing parameters to SearchBox."); }
+
+  // ---------- Instance variables
+  this.name                  = name;
+  this.resultsPath           = resultsPath;
+  this.keyTimeout            = 0;
+  this.keyTimeoutLength      = 500;
+  this.closeSelectionTimeout = 300;
+  this.lastSearchValue       = "";
+  this.lastResultsPage       = "";
+  this.hideTimeout           = 0;
+  this.searchIndex           = 0;
+  this.searchActive          = false;
+  this.insideFrame           = inFrame;
+  this.searchLabel           = label;
+
+  // ----------- DOM Elements
+
+  this.DOMSearchField = function()
+  {  return document.getElementById("MSearchField");  }
+
+  this.DOMSearchSelect = function()
+  {  return document.getElementById("MSearchSelect");  }
+
+  this.DOMSearchSelectWindow = function()
+  {  return document.getElementById("MSearchSelectWindow");  }
+
+  this.DOMPopupSearchResults = function()
+  {  return document.getElementById("MSearchResults");  }
+
+  this.DOMPopupSearchResultsWindow = function()
+  {  return document.getElementById("MSearchResultsWindow");  }
+
+  this.DOMSearchClose = function()
+  {  return document.getElementById("MSearchClose"); }
+
+  this.DOMSearchBox = function()
+  {  return document.getElementById("MSearchBox");  }
+
+  // ------------ Event Handlers
+
+  // Called when focus is added or removed from the search field.
+  this.OnSearchFieldFocus = function(isActive)
+  {
+    this.Activate(isActive);
+  }
+
+  this.OnSearchSelectShow = function()
+  {
+    var searchSelectWindow = this.DOMSearchSelectWindow();
+    var searchField        = this.DOMSearchSelect();
+
+    if (this.insideFrame)
+    {
+      var left = getXPos(searchField);
+      var top  = getYPos(searchField);
+      left += searchField.offsetWidth + 6;
+      top += searchField.offsetHeight;
+
+      // show search selection popup
+      searchSelectWindow.style.display='block';
+      left -= searchSelectWindow.offsetWidth;
+      searchSelectWindow.style.left =  left + 'px';
+      searchSelectWindow.style.top  =  top  + 'px';
+    }
+    else
+    {
+      var left = getXPos(searchField);
+      var top  = getYPos(searchField);
+      top += searchField.offsetHeight;
+
+      // show search selection popup
+      searchSelectWindow.style.display='block';
+      searchSelectWindow.style.left =  left + 'px';
+      searchSelectWindow.style.top  =  top  + 'px';
+    }
+
+    // stop selection hide timer
+    if (this.hideTimeout)
+    {
+      clearTimeout(this.hideTimeout);
+      this.hideTimeout=0;
+    }
+    return false; // to avoid "image drag" default event
+  }
+
+  this.OnSearchSelectHide = function()
+  {
+    this.hideTimeout = setTimeout(this.name +".CloseSelectionWindow()",
+                                  this.closeSelectionTimeout);
+  }
+
+  // Called when the content of the search field is changed.
+  this.OnSearchFieldChange = function(evt)
+  {
+    if (this.keyTimeout) // kill running timer
+    {
+      clearTimeout(this.keyTimeout);
+      this.keyTimeout = 0;
+    }
+
+    var e  = (evt) ? evt : window.event; // for IE
+    if (e.keyCode==40 || e.keyCode==13)
+    {
+      if (e.shiftKey==1)
+      {
+        this.OnSearchSelectShow();
+        var win=this.DOMSearchSelectWindow();
+        for (i=0;i<win.childNodes.length;i++)
+        {
+          var child = win.childNodes[i]; // get span within a
+          if (child.className=='SelectItem')
+          {
+            child.focus();
+            return;
+          }
+        }
+        return;
+      }
+      else if (window.frames.MSearchResults.searchResults)
+      {
+        var elem = window.frames.MSearchResults.searchResults.NavNext(0);
+        if (elem) elem.focus();
+      }
+    }
+    else if (e.keyCode==27) // Escape out of the search field
+    {
+      this.DOMSearchField().blur();
+      this.DOMPopupSearchResultsWindow().style.display = 'none';
+      this.DOMSearchClose().style.display = 'none';
+      this.lastSearchValue = '';
+      this.Activate(false);
+      return;
+    }
+
+    // strip whitespaces
+    var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+
+    if (searchValue != this.lastSearchValue) // search value has changed
+    {
+      if (searchValue != "") // non-empty search
+      {
+        // set timer for search update
+        this.keyTimeout = setTimeout(this.name + '.Search()',
+                                     this.keyTimeoutLength);
+      }
+      else // empty search field
+      {
+        this.DOMPopupSearchResultsWindow().style.display = 'none';
+        this.DOMSearchClose().style.display = 'none';
+        this.lastSearchValue = '';
+      }
+    }
+  }
+
+  this.SelectItemCount = function(id)
+  {
+    var count=0;
+    var win=this.DOMSearchSelectWindow();
+    for (i=0;i<win.childNodes.length;i++)
+    {
+      var child = win.childNodes[i]; // get span within a
+      if (child.className=='SelectItem')
+      {
+        count++;
+      }
+    }
+    return count;
+  }
+
+  this.SelectItemSet = function(id)
+  {
+    var i,j=0;
+    var win=this.DOMSearchSelectWindow();
+    for (i=0;i<win.childNodes.length;i++)
+    {
+      var child = win.childNodes[i]; // get span within a
+      if (child.className=='SelectItem')
+      {
+        var node = child.firstChild;
+        if (j==id)
+        {
+          node.innerHTML='&#8226;';
+        }
+        else
+        {
+          node.innerHTML='&#160;';
+        }
+        j++;
+      }
+    }
+  }
+
+  // Called when an search filter selection is made.
+  // set item with index id as the active item
+  this.OnSelectItem = function(id)
+  {
+    this.searchIndex = id;
+    this.SelectItemSet(id);
+    var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+    if (searchValue!="" && this.searchActive) // something was found -> do a search
+    {
+      this.Search();
+    }
+  }
+
+  this.OnSearchSelectKey = function(evt)
+  {
+    var e = (evt) ? evt : window.event; // for IE
+    if (e.keyCode==40 && this.searchIndex<this.SelectItemCount()) // Down
+    {
+      this.searchIndex++;
+      this.OnSelectItem(this.searchIndex);
+    }
+    else if (e.keyCode==38 && this.searchIndex>0) // Up
+    {
+      this.searchIndex--;
+      this.OnSelectItem(this.searchIndex);
+    }
+    else if (e.keyCode==13 || e.keyCode==27)
+    {
+      this.OnSelectItem(this.searchIndex);
+      this.CloseSelectionWindow();
+      this.DOMSearchField().focus();
+    }
+    return false;
+  }
+
+  // --------- Actions
+
+  // Closes the results window.
+  this.CloseResultsWindow = function()
+  {
+    this.DOMPopupSearchResultsWindow().style.display = 'none';
+    this.DOMSearchClose().style.display = 'none';
+    this.Activate(false);
+  }
+
+  this.CloseSelectionWindow = function()
+  {
+    this.DOMSearchSelectWindow().style.display = 'none';
+  }
+
+  // Performs a search.
+  this.Search = function()
+  {
+    this.keyTimeout = 0;
+
+    // strip leading whitespace
+    var searchValue = this.DOMSearchField().value.replace(/^ +/, "");
+
+    var code = searchValue.toLowerCase().charCodeAt(0);
+    var idxChar = searchValue.substr(0, 1).toLowerCase();
+    if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair
+    {
+      idxChar = searchValue.substr(0, 2);
+    }
+
+    var resultsPage;
+    var resultsPageWithSearch;
+    var hasResultsPage;
+
+    var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar);
+    if (idx!=-1)
+    {
+       var hexCode=idx.toString(16);
+       resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';
+       resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
+       hasResultsPage = true;
+    }
+    else // nothing available for this search term
+    {
+       resultsPage = this.resultsPath + '/nomatches.html';
+       resultsPageWithSearch = resultsPage;
+       hasResultsPage = false;
+    }
+
+    window.frames.MSearchResults.location = resultsPageWithSearch;
+    var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
+
+    if (domPopupSearchResultsWindow.style.display!='block')
+    {
+       var domSearchBox = this.DOMSearchBox();
+       this.DOMSearchClose().style.display = 'inline';
+       if (this.insideFrame)
+       {
+         var domPopupSearchResults = this.DOMPopupSearchResults();
+         domPopupSearchResultsWindow.style.position = 'relative';
+         domPopupSearchResultsWindow.style.display  = 'block';
+         var width = document.body.clientWidth - 8; // the -8 is for IE :-(
+         domPopupSearchResultsWindow.style.width    = width + 'px';
+         domPopupSearchResults.style.width          = width + 'px';
+       }
+       else
+       {
+         var domPopupSearchResults = this.DOMPopupSearchResults();
+         var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth;
+         var top  = getYPos(domSearchBox) + 20;  // domSearchBox.offsetHeight + 1;
+         domPopupSearchResultsWindow.style.display = 'block';
+         left -= domPopupSearchResults.offsetWidth;
+         domPopupSearchResultsWindow.style.top     = top  + 'px';
+         domPopupSearchResultsWindow.style.left    = left + 'px';
+       }
+    }
+
+    this.lastSearchValue = searchValue;
+    this.lastResultsPage = resultsPage;
+  }
+
+  // -------- Activation Functions
+
+  // Activates or deactivates the search panel, resetting things to
+  // their default values if necessary.
+  this.Activate = function(isActive)
+  {
+    if (isActive || // open it
+        this.DOMPopupSearchResultsWindow().style.display == 'block'
+       )
+    {
+      this.DOMSearchBox().className = 'MSearchBoxActive';
+
+      var searchField = this.DOMSearchField();
+
+      if (searchField.value == this.searchLabel) // clear "Search" term upon entry
+      {
+        searchField.value = '';
+        this.searchActive = true;
+      }
+    }
+    else if (!isActive) // directly remove the panel
+    {
+      this.DOMSearchBox().className = 'MSearchBoxInactive';
+      this.DOMSearchField().value   = this.searchLabel;
+      this.searchActive             = false;
+      this.lastSearchValue          = ''
+      this.lastResultsPage          = '';
+    }
+  }
+}
+
+// -----------------------------------------------------------------------
+
+// The class that handles everything on the search results page.
+function SearchResults(name)
+{
+    // The number of matches from the last run of <Search()>.
+    this.lastMatchCount = 0;
+    this.lastKey = 0;
+    this.repeatOn = false;
+
+    // Toggles the visibility of the passed element ID.
+    this.FindChildElement = function(id)
+    {
+      var parentElement = document.getElementById(id);
+      var element = parentElement.firstChild;
+
+      while (element && element!=parentElement)
+      {
+        if (element.nodeName == 'DIV' && element.className == 'SRChildren')
+        {
+          return element;
+        }
+
+        if (element.nodeName == 'DIV' && element.hasChildNodes())
+        {
+           element = element.firstChild;
+        }
+        else if (element.nextSibling)
+        {
+           element = element.nextSibling;
+        }
+        else
+        {
+          do
+          {
+            element = element.parentNode;
+          }
+          while (element && element!=parentElement && !element.nextSibling);
+
+          if (element && element!=parentElement)
+          {
+            element = element.nextSibling;
+          }
+        }
+      }
+    }
+
+    this.Toggle = function(id)
+    {
+      var element = this.FindChildElement(id);
+      if (element)
+      {
+        if (element.style.display == 'block')
+        {
+          element.style.display = 'none';
+        }
+        else
+        {
+          element.style.display = 'block';
+        }
+      }
+    }
+
+    // Searches for the passed string.  If there is no parameter,
+    // it takes it from the URL query.
+    //
+    // Always returns true, since other documents may try to call it
+    // and that may or may not be possible.
+    this.Search = function(search)
+    {
+      if (!search) // get search word from URL
+      {
+        search = window.location.search;
+        search = search.substring(1);  // Remove the leading '?'
+        search = unescape(search);
+      }
+
+      search = search.replace(/^ +/, ""); // strip leading spaces
+      search = search.replace(/ +$/, ""); // strip trailing spaces
+      search = search.toLowerCase();
+      search = convertToId(search);
+
+      var resultRows = document.getElementsByTagName("div");
+      var matches = 0;
+
+      var i = 0;
+      while (i < resultRows.length)
+      {
+        var row = resultRows.item(i);
+        if (row.className == "SRResult")
+        {
+          var rowMatchName = row.id.toLowerCase();
+          rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_'
+
+          if (search.length<=rowMatchName.length &&
+             rowMatchName.substr(0, search.length)==search)
+          {
+            row.style.display = 'block';
+            matches++;
+          }
+          else
+          {
+            row.style.display = 'none';
+          }
+        }
+        i++;
+      }
+      document.getElementById("Searching").style.display='none';
+      if (matches == 0) // no results
+      {
+        document.getElementById("NoMatches").style.display='block';
+      }
+      else // at least one result
+      {
+        document.getElementById("NoMatches").style.display='none';
+      }
+      this.lastMatchCount = matches;
+      return true;
+    }
+
+    // return the first item with index index or higher that is visible
+    this.NavNext = function(index)
+    {
+      var focusItem;
+      while (1)
+      {
+        var focusName = 'Item'+index;
+        focusItem = document.getElementById(focusName);
+        if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+        {
+          break;
+        }
+        else if (!focusItem) // last element
+        {
+          break;
+        }
+        focusItem=null;
+        index++;
+      }
+      return focusItem;
+    }
+
+    this.NavPrev = function(index)
+    {
+      var focusItem;
+      while (1)
+      {
+        var focusName = 'Item'+index;
+        focusItem = document.getElementById(focusName);
+        if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+        {
+          break;
+        }
+        else if (!focusItem) // last element
+        {
+          break;
+        }
+        focusItem=null;
+        index--;
+      }
+      return focusItem;
+    }
+
+    this.ProcessKeys = function(e)
+    {
+      if (e.type == "keydown")
+      {
+        this.repeatOn = false;
+        this.lastKey = e.keyCode;
+      }
+      else if (e.type == "keypress")
+      {
+        if (!this.repeatOn)
+        {
+          if (this.lastKey) this.repeatOn = true;
+          return false; // ignore first keypress after keydown
+        }
+      }
+      else if (e.type == "keyup")
+      {
+        this.lastKey = 0;
+        this.repeatOn = false;
+      }
+      return this.lastKey!=0;
+    }
+
+    this.Nav = function(evt,itemIndex)
+    {
+      var e  = (evt) ? evt : window.event; // for IE
+      if (e.keyCode==13) return true;
+      if (!this.ProcessKeys(e)) return false;
+
+      if (this.lastKey==38) // Up
+      {
+        var newIndex = itemIndex-1;
+        var focusItem = this.NavPrev(newIndex);
+        if (focusItem)
+        {
+          var child = this.FindChildElement(focusItem.parentNode.parentNode.id);
+          if (child && child.style.display == 'block') // children visible
+          {
+            var n=0;
+            var tmpElem;
+            while (1) // search for last child
+            {
+              tmpElem = document.getElementById('Item'+newIndex+'_c'+n);
+              if (tmpElem)
+              {
+                focusItem = tmpElem;
+              }
+              else // found it!
+              {
+                break;
+              }
+              n++;
+            }
+          }
+        }
+        if (focusItem)
+        {
+          focusItem.focus();
+        }
+        else // return focus to search field
+        {
+           parent.document.getElementById("MSearchField").focus();
+        }
+      }
+      else if (this.lastKey==40) // Down
+      {
+        var newIndex = itemIndex+1;
+        var focusItem;
+        var item = document.getElementById('Item'+itemIndex);
+        var elem = this.FindChildElement(item.parentNode.parentNode.id);
+        if (elem && elem.style.display == 'block') // children visible
+        {
+          focusItem = document.getElementById('Item'+itemIndex+'_c0');
+        }
+        if (!focusItem) focusItem = this.NavNext(newIndex);
+        if (focusItem)  focusItem.focus();
+      }
+      else if (this.lastKey==39) // Right
+      {
+        var item = document.getElementById('Item'+itemIndex);
+        var elem = this.FindChildElement(item.parentNode.parentNode.id);
+        if (elem) elem.style.display = 'block';
+      }
+      else if (this.lastKey==37) // Left
+      {
+        var item = document.getElementById('Item'+itemIndex);
+        var elem = this.FindChildElement(item.parentNode.parentNode.id);
+        if (elem) elem.style.display = 'none';
+      }
+      else if (this.lastKey==27) // Escape
+      {
+        parent.searchBox.CloseResultsWindow();
+        parent.document.getElementById("MSearchField").focus();
+      }
+      else if (this.lastKey==13) // Enter
+      {
+        return true;
+      }
+      return false;
+    }
+
+    this.NavChild = function(evt,itemIndex,childIndex)
+    {
+      var e  = (evt) ? evt : window.event; // for IE
+      if (e.keyCode==13) return true;
+      if (!this.ProcessKeys(e)) return false;
+
+      if (this.lastKey==38) // Up
+      {
+        if (childIndex>0)
+        {
+          var newIndex = childIndex-1;
+          document.getElementById('Item'+itemIndex+'_c'+newIndex).focus();
+        }
+        else // already at first child, jump to parent
+        {
+          document.getElementById('Item'+itemIndex).focus();
+        }
+      }
+      else if (this.lastKey==40) // Down
+      {
+        var newIndex = childIndex+1;
+        var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex);
+        if (!elem) // last child, jump to parent next parent
+        {
+          elem = this.NavNext(itemIndex+1);
+        }
+        if (elem)
+        {
+          elem.focus();
+        }
+      }
+      else if (this.lastKey==27) // Escape
+      {
+        parent.searchBox.CloseResultsWindow();
+        parent.document.getElementById("MSearchField").focus();
+      }
+      else if (this.lastKey==13) // Enter
+      {
+        return true;
+      }
+      return false;
+    }
+}
+
+function setKeyActions(elem,action)
+{
+  elem.setAttribute('onkeydown',action);
+  elem.setAttribute('onkeypress',action);
+  elem.setAttribute('onkeyup',action);
+}
+
+function setClassAttr(elem,attr)
+{
+  elem.setAttribute('class',attr);
+  elem.setAttribute('className',attr);
+}
+
+function createResults()
+{
+  var results = document.getElementById("SRResults");
+  for (var e=0; e<searchData.length; e++)
+  {
+    var id = searchData[e][0];
+    var srResult = document.createElement('div');
+    srResult.setAttribute('id','SR_'+id);
+    setClassAttr(srResult,'SRResult');
+    var srEntry = document.createElement('div');
+    setClassAttr(srEntry,'SREntry');
+    var srLink = document.createElement('a');
+    srLink.setAttribute('id','Item'+e);
+    setKeyActions(srLink,'return searchResults.Nav(event,'+e+')');
+    setClassAttr(srLink,'SRSymbol');
+    srLink.innerHTML = searchData[e][1][0];
+    srEntry.appendChild(srLink);
+    if (searchData[e][1].length==2) // single result
+    {
+      srLink.setAttribute('href',searchData[e][1][1][0]);
+      if (searchData[e][1][1][1])
+      {
+       srLink.setAttribute('target','_parent');
+      }
+      var srScope = document.createElement('span');
+      setClassAttr(srScope,'SRScope');
+      srScope.innerHTML = searchData[e][1][1][2];
+      srEntry.appendChild(srScope);
+    }
+    else // multiple results
+    {
+      srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")');
+      var srChildren = document.createElement('div');
+      setClassAttr(srChildren,'SRChildren');
+      for (var c=0; c<searchData[e][1].length-1; c++)
+      {
+        var srChild = document.createElement('a');
+        srChild.setAttribute('id','Item'+e+'_c'+c);
+        setKeyActions(srChild,'return searchResults.NavChild(event,'+e+','+c+')');
+        setClassAttr(srChild,'SRScope');
+        srChild.setAttribute('href',searchData[e][1][c+1][0]);
+        if (searchData[e][1][c+1][1])
+        {
+         srChild.setAttribute('target','_parent');
+        }
+        srChild.innerHTML = searchData[e][1][c+1][2];
+        srChildren.appendChild(srChild);
+      }
+      srEntry.appendChild(srChildren);
+    }
+    srResult.appendChild(srEntry);
+    results.appendChild(srResult);
+  }
+}
+
+function init_search()
+{
+  var results = document.getElementById("MSearchSelectWindow");
+  for (var key in indexSectionLabels)
+  {
+    var link = document.createElement('a');
+    link.setAttribute('class','SelectItem');
+    link.setAttribute('onclick','searchBox.OnSelectItem('+key+')');
+    link.href='javascript:void(0)';
+    link.innerHTML='<span class="SelectionMark">&#160;</span>'+indexSectionLabels[key];
+    results.appendChild(link);
+  }
+  searchBox.OnSelectItem(0);
+}
+
Binary file docs/api-2.1/search/search_l.png has changed
Binary file docs/api-2.1/search/search_m.png has changed
Binary file docs/api-2.1/search/search_r.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/searchdata.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,36 @@
+var indexSectionsWithContent =
+{
+  0: "_abcdefhiklmnprstuvw",
+  1: "su",
+  2: "ablmpstu",
+  3: "su",
+  4: "abcdefhiklmnprstuvw",
+  5: "cdruw",
+  6: "_apsu",
+  7: "u"
+};
+
+var indexSectionNames =
+{
+  0: "all",
+  1: "classes",
+  2: "files",
+  3: "functions",
+  4: "variables",
+  5: "typedefs",
+  6: "defines",
+  7: "pages"
+};
+
+var indexSectionLabels =
+{
+  0: "All",
+  1: "Data Structures",
+  2: "Files",
+  3: "Functions",
+  4: "Variables",
+  5: "Typedefs",
+  6: "Macros",
+  7: "Pages"
+};
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/typedefs_0.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="typedefs_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/typedefs_0.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['cmp_5ffunc',['cmp_func',['../ucx_8h.html#afe5e2d5dbf34778e0e97852051570791',1,'ucx.h']]],
+  ['copy_5ffunc',['copy_func',['../ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967',1,'ucx.h']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/typedefs_1.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="typedefs_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/typedefs_1.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['distance_5ffunc',['distance_func',['../ucx_8h.html#a0bc5bf89e556c1d45d10863d52728ac9',1,'ucx.h']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/typedefs_2.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="typedefs_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/typedefs_2.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['read_5ffunc',['read_func',['../ucx_8h.html#a6a67e255e460acb58f802067b3ff5fd5',1,'ucx.h']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/typedefs_3.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="typedefs_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/typedefs_3.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,17 @@
+var searchData=
+[
+  ['ucx_5fallocator_5fcalloc',['ucx_allocator_calloc',['../allocator_8h.html#a2c0aba4221c1ac6801f03ed799f15b12',1,'allocator.h']]],
+  ['ucx_5fallocator_5ffree',['ucx_allocator_free',['../allocator_8h.html#aaf2387ddaddd8ab4b267e6b00e5d6f7e',1,'allocator.h']]],
+  ['ucx_5fallocator_5fmalloc',['ucx_allocator_malloc',['../allocator_8h.html#a29f0f6a23a70db3b60635cd6dc384473',1,'allocator.h']]],
+  ['ucx_5fallocator_5frealloc',['ucx_allocator_realloc',['../allocator_8h.html#a6d7cf038a806e327c5da37321d04e426',1,'allocator.h']]],
+  ['ucx_5fdestructor',['ucx_destructor',['../ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3',1,'ucx.h']]],
+  ['ucxavlnode',['UcxAVLNode',['../avl_8h.html#a08ba2496c2316df58548c3cc29712add',1,'avl.h']]],
+  ['ucxkey',['UcxKey',['../map_8h.html#ad63828bb23123fc01a5315a2bac3b142',1,'map.h']]],
+  ['ucxlist',['UcxList',['../list_8h.html#aa6f89f91c1081c9a7c6866c298f497a2',1,'list.h']]],
+  ['ucxmap',['UcxMap',['../map_8h.html#a18e21948725b2da68c35da587a722033',1,'map.h']]],
+  ['ucxmapelement',['UcxMapElement',['../map_8h.html#ad7d7a910a32113eb93eae11c3dc97b4b',1,'map.h']]],
+  ['ucxmapiterator',['UcxMapIterator',['../map_8h.html#ae36aff5f645948c54f51578b11fd87fb',1,'map.h']]],
+  ['ucxtest',['UcxTest',['../test_8h.html#ae906817354c010b83c2784260cce7a1c',1,'test.h']]],
+  ['ucxtestlist',['UcxTestList',['../test_8h.html#a8048c50ae73ea690b776edfd63bd6a5d',1,'test.h']]],
+  ['ucxtestsuite',['UcxTestSuite',['../test_8h.html#a52115d1d0f1c4a565ed6ef7c1bfd0363',1,'test.h']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/typedefs_4.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="typedefs_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/typedefs_4.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['write_5ffunc',['write_func',['../ucx_8h.html#a989b3f0fa4d307d278378fde435641ed',1,'ucx.h']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_0.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_0.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['allocator',['allocator',['../structUcxArray.html#a2ef31303b7548b9aa8e2b9187e295212',1,'UcxArray::allocator()'],['../structUcxAVLTree.html#a30652776b540156ad54c7d52833e4e28',1,'UcxAVLTree::allocator()'],['../structUcxMap.html#a531f3e481c1c331cf037b916192e974d',1,'UcxMap::allocator()'],['../structUcxMempool.html#ac45fd1e9269399e4c434d6bdaa770d92',1,'UcxMempool::allocator()'],['../structUcxStack.html#a33cda4f6890ac56ab31701598bc1ae10',1,'UcxStack::allocator()']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_1.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_1.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['buffer',['buffer',['../structUcxProperties.html#a6bb4d29686df41a0f42641ee15232bfd',1,'UcxProperties']]],
+  ['buflen',['buflen',['../structUcxProperties.html#a4e7524434525267e29f493a25dcca6b5',1,'UcxProperties']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_10.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_10.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_10.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['userdata',['userdata',['../structUcxAVLTree.html#ae92a3bfad3fe33c8dcbdad85112f83fd',1,'UcxAVLTree']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_11.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_11.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_11.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['value',['value',['../structUcxAVLNode.html#a302501b8c04c3fde668fe72249871258',1,'UcxAVLNode']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_12.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_12.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_12.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['writer',['writer',['../structUcxLogger.html#ada13bba090a9dc4f8d6cd9be73c60930',1,'UcxLogger']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_2.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_2.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,12 @@
+var searchData=
+[
+  ['c',['c',['../structucx__memchunk.html#ab86550503e5f019bfa61a1e91f1c40da',1,'ucx_memchunk']]],
+  ['calloc',['calloc',['../structUcxAllocator.html#ab94ec1cba45cc4e7d81e1588a11cbb62',1,'UcxAllocator']]],
+  ['capacity',['capacity',['../structUcxArray.html#a7ed074887908e45bde7e1fbc67b31c18',1,'UcxArray::capacity()'],['../structUcxBuffer.html#a385661894f3cee9c549bfe07a8b316bf',1,'UcxBuffer::capacity()']]],
+  ['cmpfunc',['cmpfunc',['../structUcxAVLTree.html#a87aff25cb726cb9eb88eb815a10d1004',1,'UcxAVLTree']]],
+  ['comment1',['comment1',['../structUcxProperties.html#afaa2e6a289fa6949b7b01df35fa5def8',1,'UcxProperties']]],
+  ['comment2',['comment2',['../structUcxProperties.html#a9ea7ecb414ca8bc7bef62cdd19cc6363',1,'UcxProperties']]],
+  ['comment3',['comment3',['../structUcxProperties.html#a5f3e561e32bac03e36a191a6940cca92',1,'UcxProperties']]],
+  ['count',['count',['../structUcxMap.html#a14e9163f71f6c014dfa2103de70ae9cd',1,'UcxMap']]],
+  ['cur',['cur',['../structUcxMapIterator.html#af1fc40f899f37280adb5b85acf6e742f',1,'UcxMapIterator']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_3.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_3.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,7 @@
+var searchData=
+[
+  ['data',['data',['../structUcxArray.html#a04d2b03d0a45af1fab19b4216602075a',1,'UcxArray::data()'],['../structUcxList.html#a4a44905121b6fc2a088084ce578a9ea2',1,'UcxList::data()'],['../structUcxKey.html#a6176109f25b34f3fa92bcfbc8ae7a88c',1,'UcxKey::data()'],['../structUcxMapKey.html#ab71d1841e4f538628c00f782267fb6d5',1,'UcxMapKey::data()'],['../structUcxMapElement.html#abbd7f3bf5beef370f702d2d5bb07733c',1,'UcxMapElement::data()'],['../structUcxMempool.html#ae98c1b0150bb119ee0a8506a6f310d6e',1,'UcxMempool::data()']]],
+  ['dateformat',['dateformat',['../structUcxLogger.html#a086f75df0f6c81ec491f25c0a4d9262b',1,'UcxLogger']]],
+  ['delimiter',['delimiter',['../structUcxProperties.html#af6adb3f69616cf9d2bb5ea7b4d837ca5',1,'UcxProperties']]],
+  ['destructor',['destructor',['../structucx__memchunk.html#ac7b5e3fda47b917d6fb2a1d7ea28447b',1,'ucx_memchunk::destructor()'],['../structucx__regdestr.html#acea2a3bb66909aa800a931ac8b0cce56',1,'ucx_regdestr::destructor()']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_4.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_4.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['elemsize',['elemsize',['../structUcxArray.html#ac4e9ecdf8a8d010644f6e44dfef8190f',1,'UcxArray']]],
+  ['error',['error',['../structUcxProperties.html#a34f71a6ab6dcb6892e3b4eb802e75bff',1,'UcxProperties']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_5.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_5.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_5.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,6 @@
+var searchData=
+[
+  ['failure',['failure',['../structUcxTestSuite.html#abfd240541d1e956e49cde0ac36286951',1,'UcxTestSuite']]],
+  ['flags',['flags',['../structUcxBuffer.html#ac642e07b0a03be5aac48eb4aa5bec2f7',1,'UcxBuffer']]],
+  ['free',['free',['../structUcxAllocator.html#aecce1840378ed53f1002190f4f87026f',1,'UcxAllocator']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_6.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_6.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_6.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['hash',['hash',['../structUcxKey.html#aac9d372ac34a4cbd8459e2b04e505752',1,'UcxKey::hash()'],['../structUcxMapKey.html#a34c1f8fec98174583944fffd30e7c913',1,'UcxMapKey::hash()']]],
+  ['height',['height',['../structUcxAVLNode.html#af129fd32863a7c35e82c5cd9d11dc95a',1,'UcxAVLNode']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_7.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_7.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_7.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['index',['index',['../structUcxMapIterator.html#ac2376545c8816dd6895de4995e558c65',1,'UcxMapIterator']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_8.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_8.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_8.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['key',['key',['../structUcxAVLNode.html#ab65a31010d26a3df898e6ba534702af6',1,'UcxAVLNode::key()'],['../structUcxMapElement.html#aa446141b708e106e2c8de1303318187c',1,'UcxMapElement::key()']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_9.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_9.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_9.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,8 @@
+var searchData=
+[
+  ['left',['left',['../structUcxAVLNode.html#ad3a1c733f2c1cc81ac527f846fc24b9c',1,'UcxAVLNode']]],
+  ['len',['len',['../structUcxKey.html#abef01de37f355688f2ac797d2c280683',1,'UcxKey::len()'],['../structUcxMapKey.html#a504d46caa45c79cd87ff8cd835654270',1,'UcxMapKey::len()']]],
+  ['length',['length',['../structsstr__t.html#a5cf571708cdff92e45f08458f2b98229',1,'sstr_t::length()'],['../structscstr__t.html#aaa0229f64f1057b6f65adededaa5a172',1,'scstr_t::length()']]],
+  ['level',['level',['../structUcxLogger.html#a2e0ee94c25b2307096c7970280d189cd',1,'UcxLogger']]],
+  ['levels',['levels',['../structUcxLogger.html#a187129f7bc6e5064b3d92a5f1217f396',1,'UcxLogger']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_a.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_a.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,6 @@
+var searchData=
+[
+  ['malloc',['malloc',['../structUcxAllocator.html#a013376172be39ed54f77c4be6898845a',1,'UcxAllocator']]],
+  ['map',['map',['../structUcxMap.html#a5792b5037c4f77ea3cb144b66c9b8790',1,'UcxMap::map()'],['../structUcxMapIterator.html#af88d6e22547d09fe1d665dd650dcdb95',1,'UcxMapIterator::map()']]],
+  ['mask',['mask',['../structUcxLogger.html#a1de0db2e02dcf03366268f6943f8b97c',1,'UcxLogger']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_b.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_b.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_b.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['ndata',['ndata',['../structUcxMempool.html#aa3a73ab231e1bc207d526f46f1c1e23a',1,'UcxMempool']]],
+  ['next',['next',['../structUcxList.html#a82a1818f1abf765b026fa91478569a8f',1,'UcxList::next()'],['../structUcxMapElement.html#a99fe8188b0889201d70ff5f922deef51',1,'UcxMapElement::next()'],['../structUcxTestList.html#aeebb80ff75d9f6f82ab6dc2641a3c74e',1,'UcxTestList::next()']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_c.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_c.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,8 @@
+var searchData=
+[
+  ['parent',['parent',['../structUcxAVLNode.html#afc4e3b4f452aa2d91cabb2135b9d42f7',1,'UcxAVLNode']]],
+  ['pool',['pool',['../structUcxAllocator.html#a1b78012998d1c28be86dc595f8f0aac9',1,'UcxAllocator']]],
+  ['pos',['pos',['../structUcxBuffer.html#a7a64288f002cf62b492e2ea49c79615c',1,'UcxBuffer::pos()'],['../structUcxProperties.html#addd36ac8e5e42241c0a57453633970db',1,'UcxProperties::pos()']]],
+  ['prev',['prev',['../structUcxList.html#a0f1fddce9088b9c1414745d0b1b5c08b',1,'UcxList::prev()'],['../structucx__stack__metadata.html#ad46d2e8e5b0acf05f2def41d451c5579',1,'ucx_stack_metadata::prev()']]],
+  ['ptr',['ptr',['../structucx__regdestr.html#aac0e9ec8df4aab08728b4f8292b5f5e7',1,'ucx_regdestr::ptr()'],['../structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0',1,'sstr_t::ptr()'],['../structscstr__t.html#a305fd48934b474a9bf4a40869030e391',1,'scstr_t::ptr()']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_d.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_d.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,6 @@
+var searchData=
+[
+  ['realloc',['realloc',['../structUcxAllocator.html#a3550e3847f31d9e9ce3ffcb0d3440c15',1,'UcxAllocator']]],
+  ['right',['right',['../structUcxAVLNode.html#a7cbaa31dba8c7a89f4f8f7905f6fd238',1,'UcxAVLNode']]],
+  ['root',['root',['../structUcxAVLTree.html#a393a8fc99eb2c290d3cb67170081d742',1,'UcxAVLTree']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_e.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_e.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,7 @@
+var searchData=
+[
+  ['size',['size',['../structUcxArray.html#a20c11f2c9048cda80062842b7c094e20',1,'UcxArray::size()'],['../structUcxBuffer.html#aec0aea8325394951d5ad4a9fbb8e1ac7',1,'UcxBuffer::size()'],['../structUcxMap.html#afe120846b26d99580a7ff1276464e838',1,'UcxMap::size()'],['../structUcxMempool.html#a304729986f2894971d0469e71e196bf0',1,'UcxMempool::size()'],['../structUcxStack.html#a4df86b1917bfc3bbf760220870638143',1,'UcxStack::size()'],['../structucx__stack__metadata.html#ae2a2848b721cfa44a7e963484c5e4b28',1,'ucx_stack_metadata::size()']]],
+  ['space',['space',['../structUcxBuffer.html#a1a5076e85acb84b715a53bc0f37fb721',1,'UcxBuffer::space()'],['../structUcxStack.html#af64d528744bf3a47fec87d2e45d2992f',1,'UcxStack::space()']]],
+  ['stream',['stream',['../structUcxLogger.html#a33fddf4791e8d49e479ecc78bf5d1b9e',1,'UcxLogger']]],
+  ['success',['success',['../structUcxTestSuite.html#a6cefa870a3c2e38d6ee682e38643dbbb',1,'UcxTestSuite']]]
+];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_f.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/search/variables_f.js	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,9 @@
+var searchData=
+[
+  ['test',['test',['../structUcxTestList.html#a6022faa52e772b073141ca0a2f5a56c9',1,'UcxTestList']]],
+  ['tests',['tests',['../structUcxTestSuite.html#a630677a70ebc2c3296704cda3196492b',1,'UcxTestSuite']]],
+  ['tmp',['tmp',['../structUcxProperties.html#a68556d4260153f58dde44e4c365edce6',1,'UcxProperties']]],
+  ['tmpcap',['tmpcap',['../structUcxProperties.html#a5af10131ea9f679b4ee174499f92e210',1,'UcxProperties']]],
+  ['tmplen',['tmplen',['../structUcxProperties.html#a8a81853d5903bee2f4e1fa53fdffae6e',1,'UcxProperties']]],
+  ['top',['top',['../structUcxStack.html#af0ff6f58edce469f17683013b86ade27',1,'UcxStack']]]
+];
Binary file docs/api-2.1/splitbar.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/stack_8h.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,677 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/stack.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">stack.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Default stack memory allocation implementation.  
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="allocator_8h_source.html">allocator.h</a>&quot;</code><br />
+</div>
+<p><a href="stack_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxStack.html">UcxStack</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">UCX stack structure.  <a href="structUcxStack.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structucx__stack__metadata.html">ucx_stack_metadata</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Metadata for each UCX stack element.  <a href="structucx__stack__metadata.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a030197051a803e87d5eeac5adb80b15a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stack_8h.html#a030197051a803e87d5eeac5adb80b15a">ucx_stack_topsize</a>(stack)</td></tr>
+<tr class="memdesc:a030197051a803e87d5eeac5adb80b15a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the size of the top most element.  <a href="#a030197051a803e87d5eeac5adb80b15a">More...</a><br /></td></tr>
+<tr class="separator:a030197051a803e87d5eeac5adb80b15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a506b82374734ec476d086ddfb561174d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stack_8h.html#a506b82374734ec476d086ddfb561174d">ucx_stack_pop</a>(stack,  dest)&#160;&#160;&#160;<a class="el" href="stack_8h.html#a07ea48f28eab474dcfefbb86fa66ef81">ucx_stack_popn</a>(stack, dest, (size_t)-1)</td></tr>
+<tr class="memdesc:a506b82374734ec476d086ddfb561174d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Removes the top most element from the stack and copies the content to <code> dest</code>, if specified.  <a href="#a506b82374734ec476d086ddfb561174d">More...</a><br /></td></tr>
+<tr class="separator:a506b82374734ec476d086ddfb561174d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4f7239dbd6c032c56812e370b71c1985"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stack_8h.html#a4f7239dbd6c032c56812e370b71c1985">ucx_stack_empty</a>(stack)&#160;&#160;&#160;(!(stack)-&gt;top)</td></tr>
+<tr class="memdesc:a4f7239dbd6c032c56812e370b71c1985"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks, if the stack is empty.  <a href="#a4f7239dbd6c032c56812e370b71c1985">More...</a><br /></td></tr>
+<tr class="separator:a4f7239dbd6c032c56812e370b71c1985"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3b761343c6491222604341ebfa443226"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stack_8h.html#a3b761343c6491222604341ebfa443226">ucx_stack_dim</a>(size,  elems)</td></tr>
+<tr class="memdesc:a3b761343c6491222604341ebfa443226"><td class="mdescLeft">&#160;</td><td class="mdescRight">Computes a recommended size for the stack memory area.  <a href="#a3b761343c6491222604341ebfa443226">More...</a><br /></td></tr>
+<tr class="separator:a3b761343c6491222604341ebfa443226"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:abaef685df4e7ef95cd7218984a0618fe"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stack_8h.html#abaef685df4e7ef95cd7218984a0618fe">ucx_stack_init</a> (<a class="el" href="structUcxStack.html">UcxStack</a> *stack, char *space, size_t size)</td></tr>
+<tr class="memdesc:abaef685df4e7ef95cd7218984a0618fe"><td class="mdescLeft">&#160;</td><td class="mdescRight">Initializes <a class="el" href="structUcxStack.html" title="UCX stack structure. ">UcxStack</a> structure with memory.  <a href="#abaef685df4e7ef95cd7218984a0618fe">More...</a><br /></td></tr>
+<tr class="separator:abaef685df4e7ef95cd7218984a0618fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af865b416802140f6b6e8ab3626d7d1ac"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stack_8h.html#af865b416802140f6b6e8ab3626d7d1ac">ucx_stack_malloc</a> (<a class="el" href="structUcxStack.html">UcxStack</a> *stack, size_t n)</td></tr>
+<tr class="memdesc:af865b416802140f6b6e8ab3626d7d1ac"><td class="mdescLeft">&#160;</td><td class="mdescRight">Allocates stack memory.  <a href="#af865b416802140f6b6e8ab3626d7d1ac">More...</a><br /></td></tr>
+<tr class="separator:af865b416802140f6b6e8ab3626d7d1ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af85e6f77a8341beb6188f9ae1a8e9f92"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stack_8h.html#af85e6f77a8341beb6188f9ae1a8e9f92">ucx_stack_push</a> (<a class="el" href="structUcxStack.html">UcxStack</a> *stack, size_t n, const void *data)</td></tr>
+<tr class="memdesc:af85e6f77a8341beb6188f9ae1a8e9f92"><td class="mdescLeft">&#160;</td><td class="mdescRight">Allocates memory with <a class="el" href="stack_8h.html#af865b416802140f6b6e8ab3626d7d1ac" title="Allocates stack memory. ">ucx_stack_malloc()</a> and copies the specified data if the allocation was successful.  <a href="#af85e6f77a8341beb6188f9ae1a8e9f92">More...</a><br /></td></tr>
+<tr class="separator:af85e6f77a8341beb6188f9ae1a8e9f92"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afdc467524b5e19a9a777c6bc03e17174"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stack_8h.html#afdc467524b5e19a9a777c6bc03e17174">ucx_stack_calloc</a> (<a class="el" href="structUcxStack.html">UcxStack</a> *stack, size_t nelem, size_t elsize)</td></tr>
+<tr class="memdesc:afdc467524b5e19a9a777c6bc03e17174"><td class="mdescLeft">&#160;</td><td class="mdescRight">Allocates an array of stack memory.  <a href="#afdc467524b5e19a9a777c6bc03e17174">More...</a><br /></td></tr>
+<tr class="separator:afdc467524b5e19a9a777c6bc03e17174"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7bb138979191bba138e76ea37488fae2"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stack_8h.html#a7bb138979191bba138e76ea37488fae2">ucx_stack_pusharr</a> (<a class="el" href="structUcxStack.html">UcxStack</a> *stack, size_t nelem, size_t elsize, const void *data)</td></tr>
+<tr class="memdesc:a7bb138979191bba138e76ea37488fae2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Allocates memory with <a class="el" href="stack_8h.html#afdc467524b5e19a9a777c6bc03e17174" title="Allocates an array of stack memory. ">ucx_stack_calloc()</a> and copies the specified data if the allocation was successful.  <a href="#a7bb138979191bba138e76ea37488fae2">More...</a><br /></td></tr>
+<tr class="separator:a7bb138979191bba138e76ea37488fae2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0c678f96f6fabab49b2b034a1fe91c3a"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stack_8h.html#a0c678f96f6fabab49b2b034a1fe91c3a">ucx_stack_realloc</a> (<a class="el" href="structUcxStack.html">UcxStack</a> *stack, void *ptr, size_t n)</td></tr>
+<tr class="memdesc:a0c678f96f6fabab49b2b034a1fe91c3a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Reallocates memory on the stack.  <a href="#a0c678f96f6fabab49b2b034a1fe91c3a">More...</a><br /></td></tr>
+<tr class="separator:a0c678f96f6fabab49b2b034a1fe91c3a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aabd55c14a3866b3782ba324f4d8b4c41"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stack_8h.html#aabd55c14a3866b3782ba324f4d8b4c41">ucx_stack_free</a> (<a class="el" href="structUcxStack.html">UcxStack</a> *stack, void *ptr)</td></tr>
+<tr class="memdesc:aabd55c14a3866b3782ba324f4d8b4c41"><td class="mdescLeft">&#160;</td><td class="mdescRight">Frees memory on the stack.  <a href="#aabd55c14a3866b3782ba324f4d8b4c41">More...</a><br /></td></tr>
+<tr class="separator:aabd55c14a3866b3782ba324f4d8b4c41"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a07ea48f28eab474dcfefbb86fa66ef81"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stack_8h.html#a07ea48f28eab474dcfefbb86fa66ef81">ucx_stack_popn</a> (<a class="el" href="structUcxStack.html">UcxStack</a> *stack, void *dest, size_t n)</td></tr>
+<tr class="memdesc:a07ea48f28eab474dcfefbb86fa66ef81"><td class="mdescLeft">&#160;</td><td class="mdescRight">Removes the top most element from the stack and copies the content to <code> dest</code>.  <a href="#a07ea48f28eab474dcfefbb86fa66ef81">More...</a><br /></td></tr>
+<tr class="separator:a07ea48f28eab474dcfefbb86fa66ef81"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a53cd2c7743dc8ad9cbd35ade0b4873e7"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="stack_8h.html#a53cd2c7743dc8ad9cbd35ade0b4873e7">ucx_stack_avail</a> (<a class="el" href="structUcxStack.html">UcxStack</a> *stack)</td></tr>
+<tr class="memdesc:a53cd2c7743dc8ad9cbd35ade0b4873e7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the remaining available memory on the specified stack.  <a href="#a53cd2c7743dc8ad9cbd35ade0b4873e7">More...</a><br /></td></tr>
+<tr class="separator:a53cd2c7743dc8ad9cbd35ade0b4873e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Default stack memory allocation implementation. </p>
+<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
+<dd>
+Olaf Wintermann </dd></dl>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a3b761343c6491222604341ebfa443226"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3b761343c6491222604341ebfa443226">&#9670;&nbsp;</a></span>ucx_stack_dim</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_stack_dim</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">size, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">elems&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">(size+<span class="keyword">sizeof</span>(<span class="keyword">struct </span><a class="code" href="structucx__stack__metadata.html">ucx_stack_metadata</a>) * \</div><div class="line">                                    (elems + 1))</div><div class="ttc" id="structucx__stack__metadata_html"><div class="ttname"><a href="structucx__stack__metadata.html">ucx_stack_metadata</a></div><div class="ttdoc">Metadata for each UCX stack element. </div><div class="ttdef"><b>Definition:</b> stack.h:69</div></div>
+</div><!-- fragment -->
+<p>Computes a recommended size for the stack memory area. </p>
+<p>Note, that reallocations have not been taken into account, so you might need to reserve twice as much memory to allow many reallocations.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">size</td><td>the approximate payload </td></tr>
+    <tr><td class="paramname">elems</td><td>the approximate count of element allocations </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a recommended size for the stack space based on the information provided </dd></dl>
+
+</div>
+</div>
+<a id="a4f7239dbd6c032c56812e370b71c1985"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4f7239dbd6c032c56812e370b71c1985">&#9670;&nbsp;</a></span>ucx_stack_empty</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_stack_empty</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">stack</td><td>)</td>
+          <td>&#160;&#160;&#160;(!(stack)-&gt;top)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Checks, if the stack is empty. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">stack</td><td>a pointer to the stack </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>nonzero, if the stack is empty, zero otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a506b82374734ec476d086ddfb561174d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a506b82374734ec476d086ddfb561174d">&#9670;&nbsp;</a></span>ucx_stack_pop</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_stack_pop</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">stack, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="stack_8h.html#a07ea48f28eab474dcfefbb86fa66ef81">ucx_stack_popn</a>(stack, dest, (size_t)-1)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Removes the top most element from the stack and copies the content to <code> dest</code>, if specified. </p>
+<p>Use <a class="el" href="stack_8h.html#a030197051a803e87d5eeac5adb80b15a" title="Returns the size of the top most element. ">ucx_stack_topsize()</a># to get the amount of memory that must be available at the location of <code>dest</code>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">stack</td><td>a pointer to the stack </td></tr>
+    <tr><td class="paramname">dest</td><td>the location where the contents shall be written to, or <code> NULL</code>, if the element shall only be removed. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="stack_8h.html#aabd55c14a3866b3782ba324f4d8b4c41" title="Frees memory on the stack. ">ucx_stack_free</a> </dd>
+<dd>
+<a class="el" href="stack_8h.html#a07ea48f28eab474dcfefbb86fa66ef81" title="Removes the top most element from the stack and copies the content to  dest. ">ucx_stack_popn</a> </dd></dl>
+
+</div>
+</div>
+<a id="a030197051a803e87d5eeac5adb80b15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a030197051a803e87d5eeac5adb80b15a">&#9670;&nbsp;</a></span>ucx_stack_topsize</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_stack_topsize</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">stack</td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">((stack)-&gt;top ? ((<span class="keyword">struct</span> <a class="code" href="structucx__stack__metadata.html">ucx_stack_metadata</a>*)\</div><div class="line">                                  (stack)-&gt;top - 1)-&gt;size : 0)</div><div class="ttc" id="structucx__stack__metadata_html"><div class="ttname"><a href="structucx__stack__metadata.html">ucx_stack_metadata</a></div><div class="ttdoc">Metadata for each UCX stack element. </div><div class="ttdef"><b>Definition:</b> stack.h:69</div></div>
+</div><!-- fragment -->
+<p>Returns the size of the top most element. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">stack</td><td>a pointer to the stack </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the size of the top most element </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a53cd2c7743dc8ad9cbd35ade0b4873e7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a53cd2c7743dc8ad9cbd35ade0b4873e7">&#9670;&nbsp;</a></span>ucx_stack_avail()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t ucx_stack_avail </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxStack.html">UcxStack</a> *&#160;</td>
+          <td class="paramname"><em>stack</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns the remaining available memory on the specified stack. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">stack</td><td>a pointer to the stack </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the remaining available memory </dd></dl>
+
+</div>
+</div>
+<a id="afdc467524b5e19a9a777c6bc03e17174"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afdc467524b5e19a9a777c6bc03e17174">&#9670;&nbsp;</a></span>ucx_stack_calloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* ucx_stack_calloc </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxStack.html">UcxStack</a> *&#160;</td>
+          <td class="paramname"><em>stack</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>nelem</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>elsize</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Allocates an array of stack memory. </p>
+<p>The content of the allocated memory is set to zero.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">stack</td><td>a pointer to the stack </td></tr>
+    <tr><td class="paramname">nelem</td><td>amount of elements to allocate </td></tr>
+    <tr><td class="paramname">elsize</td><td>amount of memory per element </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the allocated memory </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="allocator_8h.html#a2c0aba4221c1ac6801f03ed799f15b12" title="A function pointer to the allocators calloc() function. ">ucx_allocator_calloc()</a> </dd></dl>
+
+</div>
+</div>
+<a id="aabd55c14a3866b3782ba324f4d8b4c41"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aabd55c14a3866b3782ba324f4d8b4c41">&#9670;&nbsp;</a></span>ucx_stack_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_stack_free </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxStack.html">UcxStack</a> *&#160;</td>
+          <td class="paramname"><em>stack</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>ptr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Frees memory on the stack. </p>
+<p>Freeing stack memory behaves in a special way.</p>
+<p>If the element, that should be freed, is the top most element of the stack, it is removed from the stack. Otherwise it is marked as freed. Marked elements are removed, when they become the top most elements of the stack.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">stack</td><td>a pointer to the stack </td></tr>
+    <tr><td class="paramname">ptr</td><td>a pointer to the memory that shall be freed </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="abaef685df4e7ef95cd7218984a0618fe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abaef685df4e7ef95cd7218984a0618fe">&#9670;&nbsp;</a></span>ucx_stack_init()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_stack_init </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxStack.html">UcxStack</a> *&#160;</td>
+          <td class="paramname"><em>stack</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">char *&#160;</td>
+          <td class="paramname"><em>space</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>size</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Initializes <a class="el" href="structUcxStack.html" title="UCX stack structure. ">UcxStack</a> structure with memory. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">stack</td><td>a pointer to an uninitialized stack structure </td></tr>
+    <tr><td class="paramname">space</td><td>the memory area that shall be managed </td></tr>
+    <tr><td class="paramname">size</td><td>size of the memory area </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new <a class="el" href="structUcxStack.html" title="UCX stack structure. ">UcxStack</a> structure </dd></dl>
+
+</div>
+</div>
+<a id="af865b416802140f6b6e8ab3626d7d1ac"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af865b416802140f6b6e8ab3626d7d1ac">&#9670;&nbsp;</a></span>ucx_stack_malloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* ucx_stack_malloc </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxStack.html">UcxStack</a> *&#160;</td>
+          <td class="paramname"><em>stack</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>n</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Allocates stack memory. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">stack</td><td>a pointer to the stack </td></tr>
+    <tr><td class="paramname">n</td><td>amount of memory to allocate </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the allocated memory or <code>NULL</code> on stack overflow </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="allocator_8h.html#a29f0f6a23a70db3b60635cd6dc384473" title="A function pointer to the allocators malloc() function. ">ucx_allocator_malloc()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a07ea48f28eab474dcfefbb86fa66ef81"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a07ea48f28eab474dcfefbb86fa66ef81">&#9670;&nbsp;</a></span>ucx_stack_popn()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_stack_popn </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxStack.html">UcxStack</a> *&#160;</td>
+          <td class="paramname"><em>stack</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>dest</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>n</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Removes the top most element from the stack and copies the content to <code> dest</code>. </p>
+<p>This function copies at most <code>n</code> bytes to the destination, but the element is always freed as a whole. If the element was larger than <code>n</code>, the remaining data is lost.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">stack</td><td>a pointer to the stack </td></tr>
+    <tr><td class="paramname">dest</td><td>the location where the contents shall be written to </td></tr>
+    <tr><td class="paramname">n</td><td>copies at most n bytes to <code>dest</code> </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="stack_8h.html#a506b82374734ec476d086ddfb561174d" title="Removes the top most element from the stack and copies the content to  dest, if specified. ">ucx_stack_pop</a> </dd></dl>
+
+</div>
+</div>
+<a id="af85e6f77a8341beb6188f9ae1a8e9f92"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af85e6f77a8341beb6188f9ae1a8e9f92">&#9670;&nbsp;</a></span>ucx_stack_push()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* ucx_stack_push </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxStack.html">UcxStack</a> *&#160;</td>
+          <td class="paramname"><em>stack</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>n</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Allocates memory with <a class="el" href="stack_8h.html#af865b416802140f6b6e8ab3626d7d1ac" title="Allocates stack memory. ">ucx_stack_malloc()</a> and copies the specified data if the allocation was successful. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">stack</td><td>a pointer to the stack </td></tr>
+    <tr><td class="paramname">n</td><td>amount of memory to allocate </td></tr>
+    <tr><td class="paramname">data</td><td>a pointer to the data to copy </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the allocated memory </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="stack_8h.html#af865b416802140f6b6e8ab3626d7d1ac" title="Allocates stack memory. ">ucx_stack_malloc</a> </dd></dl>
+
+</div>
+</div>
+<a id="a7bb138979191bba138e76ea37488fae2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7bb138979191bba138e76ea37488fae2">&#9670;&nbsp;</a></span>ucx_stack_pusharr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* ucx_stack_pusharr </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxStack.html">UcxStack</a> *&#160;</td>
+          <td class="paramname"><em>stack</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>nelem</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>elsize</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Allocates memory with <a class="el" href="stack_8h.html#afdc467524b5e19a9a777c6bc03e17174" title="Allocates an array of stack memory. ">ucx_stack_calloc()</a> and copies the specified data if the allocation was successful. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">stack</td><td>a pointer to the stack </td></tr>
+    <tr><td class="paramname">nelem</td><td>amount of elements to allocate </td></tr>
+    <tr><td class="paramname">elsize</td><td>amount of memory per element </td></tr>
+    <tr><td class="paramname">data</td><td>a pointer to the data </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the allocated memory </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="stack_8h.html#afdc467524b5e19a9a777c6bc03e17174" title="Allocates an array of stack memory. ">ucx_stack_calloc</a> </dd></dl>
+
+</div>
+</div>
+<a id="a0c678f96f6fabab49b2b034a1fe91c3a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0c678f96f6fabab49b2b034a1fe91c3a">&#9670;&nbsp;</a></span>ucx_stack_realloc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* ucx_stack_realloc </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxStack.html">UcxStack</a> *&#160;</td>
+          <td class="paramname"><em>stack</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>ptr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>n</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Reallocates memory on the stack. </p>
+<p>Shrinking memory is always safe. Extending memory can be very expensive.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">stack</td><td>the stack </td></tr>
+    <tr><td class="paramname">ptr</td><td>a pointer to the memory that shall be reallocated </td></tr>
+    <tr><td class="paramname">n</td><td>the new size of the memory </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to the new location of the memory </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="allocator_8h.html#a6d7cf038a806e327c5da37321d04e426" title="A function pointer to the allocators realloc() function. ">ucx_allocator_realloc()</a> </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/stack_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/stack.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">stack.h</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a href="stack_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment"> * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"> * Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment"> * modification, are permitted provided that the following conditions are met:</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> *   1. Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> *   2. Redistributions in binary form must reproduce the above copyright</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer in the</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment"> *      documentation and/or other materials provided with the distribution.</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment"> * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment"> * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment"> * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"> * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment"> * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment"> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment"> * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE</span></div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> * POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;</div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;<span class="preprocessor">#ifndef UCX_STACK_H</span></div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;<span class="preprocessor">#define UCX_STACK_H</span></div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;</div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ucx_8h.html">ucx.h</a>&quot;</span></div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="allocator_8h.html">allocator.h</a>&quot;</span></div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;</div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;</div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;</div><div class="line"><a name="l00052"></a><span class="lineno"><a class="line" href="structUcxStack.html">   52</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span>{</div><div class="line"><a name="l00054"></a><span class="lineno"><a class="line" href="structUcxStack.html#a33cda4f6890ac56ab31701598bc1ae10">   54</a></span>&#160;    <a class="code" href="structUcxAllocator.html">UcxAllocator</a> <a class="code" href="structUcxStack.html#a33cda4f6890ac56ab31701598bc1ae10">allocator</a>;</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;    </div><div class="line"><a name="l00057"></a><span class="lineno"><a class="line" href="structUcxStack.html#a4df86b1917bfc3bbf760220870638143">   57</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="structUcxStack.html#a4df86b1917bfc3bbf760220870638143">size</a>;</div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;    </div><div class="line"><a name="l00060"></a><span class="lineno"><a class="line" href="structUcxStack.html#af64d528744bf3a47fec87d2e45d2992f">   60</a></span>&#160;    <span class="keywordtype">char</span> *<a class="code" href="structUcxStack.html#af64d528744bf3a47fec87d2e45d2992f">space</a>;</div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;    </div><div class="line"><a name="l00063"></a><span class="lineno"><a class="line" href="structUcxStack.html#af0ff6f58edce469f17683013b86ade27">   63</a></span>&#160;    <span class="keywordtype">char</span> *<a class="code" href="structUcxStack.html#af0ff6f58edce469f17683013b86ade27">top</a>;</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;} <a class="code" href="structUcxStack.html">UcxStack</a>;</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;</div><div class="line"><a name="l00069"></a><span class="lineno"><a class="line" href="structucx__stack__metadata.html">   69</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structucx__stack__metadata.html">ucx_stack_metadata</a> {</div><div class="line"><a name="l00073"></a><span class="lineno"><a class="line" href="structucx__stack__metadata.html#ad46d2e8e5b0acf05f2def41d451c5579">   73</a></span>&#160;    <span class="keywordtype">char</span> *<a class="code" href="structucx__stack__metadata.html#ad46d2e8e5b0acf05f2def41d451c5579">prev</a>;</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;    </div><div class="line"><a name="l00076"></a><span class="lineno"><a class="line" href="structucx__stack__metadata.html#ae2a2848b721cfa44a7e963484c5e4b28">   76</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="structucx__stack__metadata.html#ae2a2848b721cfa44a7e963484c5e4b28">size</a>;</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;};</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;<span class="keywordtype">void</span> <a class="code" href="stack_8h.html#abaef685df4e7ef95cd7218984a0618fe">ucx_stack_init</a>(<a class="code" href="structUcxStack.html">UcxStack</a> *stack, <span class="keywordtype">char</span>* space, <span class="keywordtype">size_t</span> <a class="code" href="structucx__stack__metadata.html#ae2a2848b721cfa44a7e963484c5e4b28">size</a>);</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;</div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;<span class="keywordtype">void</span> *<a class="code" href="stack_8h.html#af865b416802140f6b6e8ab3626d7d1ac">ucx_stack_malloc</a>(<a class="code" href="structUcxStack.html">UcxStack</a> *stack, <span class="keywordtype">size_t</span> n);</div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;</div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;<span class="keywordtype">void</span> *<a class="code" href="stack_8h.html#af85e6f77a8341beb6188f9ae1a8e9f92">ucx_stack_push</a>(<a class="code" href="structUcxStack.html">UcxStack</a> *stack, <span class="keywordtype">size_t</span> n, <span class="keyword">const</span> <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;<span class="keywordtype">void</span> *<a class="code" href="stack_8h.html#afdc467524b5e19a9a777c6bc03e17174">ucx_stack_calloc</a>(<a class="code" href="structUcxStack.html">UcxStack</a> *stack, <span class="keywordtype">size_t</span> nelem, <span class="keywordtype">size_t</span> elsize);</div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;</div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;<span class="keywordtype">void</span> *<a class="code" href="stack_8h.html#a7bb138979191bba138e76ea37488fae2">ucx_stack_pusharr</a>(<a class="code" href="structUcxStack.html">UcxStack</a> *stack,</div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;        <span class="keywordtype">size_t</span> nelem, <span class="keywordtype">size_t</span> elsize, <span class="keyword">const</span> <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;</div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;<span class="keywordtype">void</span> *<a class="code" href="stack_8h.html#a0c678f96f6fabab49b2b034a1fe91c3a">ucx_stack_realloc</a>(<a class="code" href="structUcxStack.html">UcxStack</a> *stack, <span class="keywordtype">void</span> *ptr, <span class="keywordtype">size_t</span> n);</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;</div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;<span class="keywordtype">void</span> <a class="code" href="stack_8h.html#aabd55c14a3866b3782ba324f4d8b4c41">ucx_stack_free</a>(<a class="code" href="structUcxStack.html">UcxStack</a> *stack, <span class="keywordtype">void</span> *ptr);</div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;</div><div class="line"><a name="l00172"></a><span class="lineno"><a class="line" href="stack_8h.html#a030197051a803e87d5eeac5adb80b15a">  172</a></span>&#160;<span class="preprocessor">#define ucx_stack_topsize(stack) ((stack)-&gt;top ? ((struct ucx_stack_metadata*)\</span></div><div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;<span class="preprocessor">                                  (stack)-&gt;top - 1)-&gt;size : 0)</span></div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;</div><div class="line"><a name="l00188"></a><span class="lineno"><a class="line" href="stack_8h.html#a506b82374734ec476d086ddfb561174d">  188</a></span>&#160;<span class="preprocessor">#define ucx_stack_pop(stack, dest) ucx_stack_popn(stack, dest, (size_t)-1)</span></div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;<span class="keywordtype">void</span> <a class="code" href="stack_8h.html#a07ea48f28eab474dcfefbb86fa66ef81">ucx_stack_popn</a>(<a class="code" href="structUcxStack.html">UcxStack</a> *stack, <span class="keywordtype">void</span> *dest, <span class="keywordtype">size_t</span> n);</div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;</div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;<span class="keywordtype">size_t</span> <a class="code" href="stack_8h.html#a53cd2c7743dc8ad9cbd35ade0b4873e7">ucx_stack_avail</a>(<a class="code" href="structUcxStack.html">UcxStack</a> *stack);</div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;</div><div class="line"><a name="l00219"></a><span class="lineno"><a class="line" href="stack_8h.html#a4f7239dbd6c032c56812e370b71c1985">  219</a></span>&#160;<span class="preprocessor">#define ucx_stack_empty(stack) (!(stack)-&gt;top)</span></div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;</div><div class="line"><a name="l00231"></a><span class="lineno"><a class="line" href="stack_8h.html#a3b761343c6491222604341ebfa443226">  231</a></span>&#160;<span class="preprocessor">#define ucx_stack_dim(size, elems) (size+sizeof(struct ucx_stack_metadata) * \</span></div><div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;<span class="preprocessor">                                    (elems + 1))</span></div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;</div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;</div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;}</div><div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;</div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;<span class="preprocessor">#endif  </span><span class="comment">/* UCX_STACK_H */</span><span class="preprocessor"></span></div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;</div><div class="ttc" id="structUcxStack_html_a4df86b1917bfc3bbf760220870638143"><div class="ttname"><a href="structUcxStack.html#a4df86b1917bfc3bbf760220870638143">UcxStack::size</a></div><div class="ttdeci">size_t size</div><div class="ttdoc">Stack size. </div><div class="ttdef"><b>Definition:</b> stack.h:57</div></div>
+<div class="ttc" id="structUcxStack_html"><div class="ttname"><a href="structUcxStack.html">UcxStack</a></div><div class="ttdoc">UCX stack structure. </div><div class="ttdef"><b>Definition:</b> stack.h:52</div></div>
+<div class="ttc" id="stack_8h_html_aabd55c14a3866b3782ba324f4d8b4c41"><div class="ttname"><a href="stack_8h.html#aabd55c14a3866b3782ba324f4d8b4c41">ucx_stack_free</a></div><div class="ttdeci">void ucx_stack_free(UcxStack *stack, void *ptr)</div><div class="ttdoc">Frees memory on the stack. </div><div class="ttdef"><b>Definition:</b> stack.c:106</div></div>
+<div class="ttc" id="ucx_8h_html"><div class="ttname"><a href="ucx_8h.html">ucx.h</a></div><div class="ttdoc">Main UCX Header providing most common definitions. </div></div>
+<div class="ttc" id="stack_8h_html_af865b416802140f6b6e8ab3626d7d1ac"><div class="ttname"><a href="stack_8h.html#af865b416802140f6b6e8ab3626d7d1ac">ucx_stack_malloc</a></div><div class="ttdeci">void * ucx_stack_malloc(UcxStack *stack, size_t n)</div><div class="ttdoc">Allocates stack memory. </div><div class="ttdef"><b>Definition:</b> stack.c:53</div></div>
+<div class="ttc" id="stack_8h_html_af85e6f77a8341beb6188f9ae1a8e9f92"><div class="ttname"><a href="stack_8h.html#af85e6f77a8341beb6188f9ae1a8e9f92">ucx_stack_push</a></div><div class="ttdeci">void * ucx_stack_push(UcxStack *stack, size_t n, const void *data)</div><div class="ttdoc">Allocates memory with ucx_stack_malloc() and copies the specified data if the allocation was successf...</div><div class="ttdef"><b>Definition:</b> stack.c:148</div></div>
+<div class="ttc" id="structucx__stack__metadata_html"><div class="ttname"><a href="structucx__stack__metadata.html">ucx_stack_metadata</a></div><div class="ttdoc">Metadata for each UCX stack element. </div><div class="ttdef"><b>Definition:</b> stack.h:69</div></div>
+<div class="ttc" id="stack_8h_html_a0c678f96f6fabab49b2b034a1fe91c3a"><div class="ttname"><a href="stack_8h.html#a0c678f96f6fabab49b2b034a1fe91c3a">ucx_stack_realloc</a></div><div class="ttdeci">void * ucx_stack_realloc(UcxStack *stack, void *ptr, size_t n)</div><div class="ttdoc">Reallocates memory on the stack. </div><div class="ttdef"><b>Definition:</b> stack.c:79</div></div>
+<div class="ttc" id="structucx__stack__metadata_html_ad46d2e8e5b0acf05f2def41d451c5579"><div class="ttname"><a href="structucx__stack__metadata.html#ad46d2e8e5b0acf05f2def41d451c5579">ucx_stack_metadata::prev</a></div><div class="ttdeci">char * prev</div><div class="ttdoc">Location of the previous element (NULL if this is the first) </div><div class="ttdef"><b>Definition:</b> stack.h:73</div></div>
+<div class="ttc" id="stack_8h_html_a53cd2c7743dc8ad9cbd35ade0b4873e7"><div class="ttname"><a href="stack_8h.html#a53cd2c7743dc8ad9cbd35ade0b4873e7">ucx_stack_avail</a></div><div class="ttdeci">size_t ucx_stack_avail(UcxStack *stack)</div><div class="ttdoc">Returns the remaining available memory on the specified stack. </div><div class="ttdef"><b>Definition:</b> stack.c:135</div></div>
+<div class="ttc" id="structUcxAllocator_html"><div class="ttname"><a href="structUcxAllocator.html">UcxAllocator</a></div><div class="ttdoc">UCX allocator data structure containing memory management functions. </div><div class="ttdef"><b>Definition:</b> allocator.h:88</div></div>
+<div class="ttc" id="structUcxStack_html_af64d528744bf3a47fec87d2e45d2992f"><div class="ttname"><a href="structUcxStack.html#af64d528744bf3a47fec87d2e45d2992f">UcxStack::space</a></div><div class="ttdeci">char * space</div><div class="ttdoc">Pointer to the bottom of the stack. </div><div class="ttdef"><b>Definition:</b> stack.h:60</div></div>
+<div class="ttc" id="stack_8h_html_a07ea48f28eab474dcfefbb86fa66ef81"><div class="ttname"><a href="stack_8h.html#a07ea48f28eab474dcfefbb86fa66ef81">ucx_stack_popn</a></div><div class="ttdeci">void ucx_stack_popn(UcxStack *stack, void *dest, size_t n)</div><div class="ttdoc">Removes the top most element from the stack and copies the content to  dest. </div><div class="ttdef"><b>Definition:</b> stack.c:118</div></div>
+<div class="ttc" id="allocator_8h_html"><div class="ttname"><a href="allocator_8h.html">allocator.h</a></div><div class="ttdoc">Allocator for custom memory management. </div></div>
+<div class="ttc" id="stack_8h_html_abaef685df4e7ef95cd7218984a0618fe"><div class="ttname"><a href="stack_8h.html#abaef685df4e7ef95cd7218984a0618fe">ucx_stack_init</a></div><div class="ttdeci">void ucx_stack_init(UcxStack *stack, char *space, size_t size)</div><div class="ttdoc">Initializes UcxStack structure with memory. </div><div class="ttdef"><b>Definition:</b> stack.c:41</div></div>
+<div class="ttc" id="structucx__stack__metadata_html_ae2a2848b721cfa44a7e963484c5e4b28"><div class="ttname"><a href="structucx__stack__metadata.html#ae2a2848b721cfa44a7e963484c5e4b28">ucx_stack_metadata::size</a></div><div class="ttdeci">size_t size</div><div class="ttdoc">Size of this element. </div><div class="ttdef"><b>Definition:</b> stack.h:76</div></div>
+<div class="ttc" id="stack_8h_html_a7bb138979191bba138e76ea37488fae2"><div class="ttname"><a href="stack_8h.html#a7bb138979191bba138e76ea37488fae2">ucx_stack_pusharr</a></div><div class="ttdeci">void * ucx_stack_pusharr(UcxStack *stack, size_t nelem, size_t elsize, const void *data)</div><div class="ttdoc">Allocates memory with ucx_stack_calloc() and copies the specified data if the allocation was successf...</div><div class="ttdef"><b>Definition:</b> stack.c:156</div></div>
+<div class="ttc" id="stack_8h_html_afdc467524b5e19a9a777c6bc03e17174"><div class="ttname"><a href="stack_8h.html#afdc467524b5e19a9a777c6bc03e17174">ucx_stack_calloc</a></div><div class="ttdeci">void * ucx_stack_calloc(UcxStack *stack, size_t nelem, size_t elsize)</div><div class="ttdoc">Allocates an array of stack memory. </div><div class="ttdef"><b>Definition:</b> stack.c:73</div></div>
+<div class="ttc" id="structUcxStack_html_af0ff6f58edce469f17683013b86ade27"><div class="ttname"><a href="structUcxStack.html#af0ff6f58edce469f17683013b86ade27">UcxStack::top</a></div><div class="ttdeci">char * top</div><div class="ttdoc">Pointer to the top of the stack. </div><div class="ttdef"><b>Definition:</b> stack.h:63</div></div>
+<div class="ttc" id="structUcxStack_html_a33cda4f6890ac56ab31701598bc1ae10"><div class="ttname"><a href="structUcxStack.html#a33cda4f6890ac56ab31701598bc1ae10">UcxStack::allocator</a></div><div class="ttdeci">UcxAllocator allocator</div><div class="ttdoc">UcxAllocator based on this stack. </div><div class="ttdef"><b>Definition:</b> stack.h:54</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/string_8h.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,2598 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/string.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">string.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Bounded string implementation.  
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="allocator_8h_source.html">allocator.h</a>&quot;</code><br />
+<code>#include &lt;stddef.h&gt;</code><br />
+</div>
+<p><a href="string_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsstr__t.html">sstr_t</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">The UCX string structure.  <a href="structsstr__t.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structscstr__t.html">scstr_t</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">The UCX string structure for immutable (constant) strings.  <a href="structscstr__t.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a9037956cca97a4e84b642f17f3d10378"><td class="memItemLeft" align="right" valign="top"><a id="a9037956cca97a4e84b642f17f3d10378"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a9037956cca97a4e84b642f17f3d10378">ST</a>(s)&#160;&#160;&#160;{ s, sizeof(s)-1 }</td></tr>
+<tr class="memdesc:a9037956cca97a4e84b642f17f3d10378"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shortcut for a <code><a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> struct</code> or <code><a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a> struct</code> literal. <br /></td></tr>
+<tr class="separator:a9037956cca97a4e84b642f17f3d10378"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8fa17c8cf4c36df48f4108c36da8573e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a8fa17c8cf4c36df48f4108c36da8573e">S</a>(s)&#160;&#160;&#160;<a class="el" href="string_8h.html#a2744c38ac44abf3e01fa059056dcf36c">sstrn</a>(s, sizeof(s)-1)</td></tr>
+<tr class="memdesc:a8fa17c8cf4c36df48f4108c36da8573e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shortcut for the conversion of a C string to a <code><a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a></code>.  <a href="#a8fa17c8cf4c36df48f4108c36da8573e">More...</a><br /></td></tr>
+<tr class="separator:a8fa17c8cf4c36df48f4108c36da8573e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7d261dd0bc358c957a368bc058c1ce53"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a7d261dd0bc358c957a368bc058c1ce53">SC</a>(s)&#160;&#160;&#160;<a class="el" href="string_8h.html#ae594f6e222ea394cef6a26c0dfad000d">scstrn</a>(s, sizeof(s)-1)</td></tr>
+<tr class="memdesc:a7d261dd0bc358c957a368bc058c1ce53"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shortcut for the conversion of a C string to a <code><a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a></code>.  <a href="#a7d261dd0bc358c957a368bc058c1ce53">More...</a><br /></td></tr>
+<tr class="separator:a7d261dd0bc358c957a368bc058c1ce53"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a23ed51e87385886bb65e8cd19c839362"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a23ed51e87385886bb65e8cd19c839362">SFMT</a>(s)&#160;&#160;&#160;(int) (s).length, (s).ptr</td></tr>
+<tr class="memdesc:a23ed51e87385886bb65e8cd19c839362"><td class="mdescLeft">&#160;</td><td class="mdescRight">Expands a <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> or <a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a> to printf arguments.  <a href="#a23ed51e87385886bb65e8cd19c839362">More...</a><br /></td></tr>
+<tr class="separator:a23ed51e87385886bb65e8cd19c839362"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7d5bc48708405a28b23667e32dfcecae"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a7d5bc48708405a28b23667e32dfcecae">PRIsstr</a>&#160;&#160;&#160;&quot;.*s&quot;</td></tr>
+<tr class="memdesc:a7d5bc48708405a28b23667e32dfcecae"><td class="mdescLeft">&#160;</td><td class="mdescRight">Format specifier for a <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> or <a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a>.  <a href="#a7d5bc48708405a28b23667e32dfcecae">More...</a><br /></td></tr>
+<tr class="separator:a7d5bc48708405a28b23667e32dfcecae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad4293350a9b39a23a6546bd0fef2aeed"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(str)&#160;&#160;&#160;<a class="el" href="string_8h.html#aedeb5d7bddda54116101a8d68af8c56d">ucx_ss2c_s</a>(str)</td></tr>
+<tr class="memdesc:ad4293350a9b39a23a6546bd0fef2aeed"><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts a UCX string to an immutable UCX string (<a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a>).  <a href="#ad4293350a9b39a23a6546bd0fef2aeed">More...</a><br /></td></tr>
+<tr class="separator:ad4293350a9b39a23a6546bd0fef2aeed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a33fa945acc5ac2ce962e5ef13cf1638c"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a33fa945acc5ac2ce962e5ef13cf1638c">sstrnlen</a>(count, ...)&#160;&#160;&#160;<a class="el" href="string_8h.html#ac1b000030d6d197eec48c15a182055d5">scstrnlen</a>(count, __VA_ARGS__)</td></tr>
+<tr class="memdesc:a33fa945acc5ac2ce962e5ef13cf1638c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the accumulated length of all specified strings.  <a href="#a33fa945acc5ac2ce962e5ef13cf1638c">More...</a><br /></td></tr>
+<tr class="separator:a33fa945acc5ac2ce962e5ef13cf1638c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6af8a4c347c7fdb5980d4c4803be2759"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a6af8a4c347c7fdb5980d4c4803be2759">sstrcat</a>(count,  s1, ...)&#160;&#160;&#160;<a class="el" href="string_8h.html#a7376842c19e954b49215da81ef76ac0c">scstrcat</a>(count, <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(s1), __VA_ARGS__)</td></tr>
+<tr class="memdesc:a6af8a4c347c7fdb5980d4c4803be2759"><td class="mdescLeft">&#160;</td><td class="mdescRight">Concatenates two or more strings.  <a href="#a6af8a4c347c7fdb5980d4c4803be2759">More...</a><br /></td></tr>
+<tr class="separator:a6af8a4c347c7fdb5980d4c4803be2759"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6068d460f9bc05962666a917d26568b3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a6068d460f9bc05962666a917d26568b3">sstrcat_a</a>(alloc,  count,  s1, ...)&#160;&#160;&#160;<a class="el" href="string_8h.html#abacce4cbd6f70fcb6453904ef08b02e9">scstrcat_a</a>(alloc, count, <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(s1), __VA_ARGS__)</td></tr>
+<tr class="memdesc:a6068d460f9bc05962666a917d26568b3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Concatenates two or more strings using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>.  <a href="#a6068d460f9bc05962666a917d26568b3">More...</a><br /></td></tr>
+<tr class="separator:a6068d460f9bc05962666a917d26568b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9d03be026afa9447c52bb34b9e3b895a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a9d03be026afa9447c52bb34b9e3b895a">sstrstr</a>(string,  match)&#160;&#160;&#160;<a class="el" href="string_8h.html#aa4362cb36c6629f9d8484739fd827748">scstrsstr</a>(string, <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(match))</td></tr>
+<tr class="memdesc:a9d03be026afa9447c52bb34b9e3b895a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a substring starting at the location of the first occurrence of the specified string.  <a href="#a9d03be026afa9447c52bb34b9e3b895a">More...</a><br /></td></tr>
+<tr class="separator:a9d03be026afa9447c52bb34b9e3b895a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa696932213265e10f864678686f4ccde"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#aa696932213265e10f864678686f4ccde">sstrscstr</a>(string,  match)&#160;&#160;&#160;<a class="el" href="string_8h.html#a54f256c3abe811c52d58b4ff1b23f051">scstrscstr</a>(string, <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(match))</td></tr>
+<tr class="memdesc:aa696932213265e10f864678686f4ccde"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns an immutable substring starting at the location of the first occurrence of the specified immutable string.  <a href="#aa696932213265e10f864678686f4ccde">More...</a><br /></td></tr>
+<tr class="separator:aa696932213265e10f864678686f4ccde"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa929984004c3576bfafb95031aca8eb7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#aa929984004c3576bfafb95031aca8eb7">sstrsplit</a>(string,  delim,  count)&#160;&#160;&#160;<a class="el" href="string_8h.html#ae71cac352b00230848bde358f0fb05ea">scstrsplit</a>(<a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(string), <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(delim), count)</td></tr>
+<tr class="memdesc:aa929984004c3576bfafb95031aca8eb7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Splits a string into parts by using a delimiter string.  <a href="#aa929984004c3576bfafb95031aca8eb7">More...</a><br /></td></tr>
+<tr class="separator:aa929984004c3576bfafb95031aca8eb7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac9f69fa3a17e26a3a5f9d985b5844601"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#ac9f69fa3a17e26a3a5f9d985b5844601">sstrsplit_a</a>(allocator,  string,  delim,  count)&#160;&#160;&#160;<a class="el" href="string_8h.html#a52906455ae530c9cdc6812c8e6d9bdef">scstrsplit_a</a>(allocator, <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(string), <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(delim), count)</td></tr>
+<tr class="memdesc:ac9f69fa3a17e26a3a5f9d985b5844601"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performing <a class="el" href="string_8h.html#aa929984004c3576bfafb95031aca8eb7" title="Splits a string into parts by using a delimiter string. ">sstrsplit()</a> using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>.  <a href="#ac9f69fa3a17e26a3a5f9d985b5844601">More...</a><br /></td></tr>
+<tr class="separator:ac9f69fa3a17e26a3a5f9d985b5844601"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7ae7156c8de57454ca38d306100b8160"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a7ae7156c8de57454ca38d306100b8160">sstrcmp</a>(s1,  s2)&#160;&#160;&#160;<a class="el" href="string_8h.html#af35272a8e5408c88ed3e25a3a98f0a82">scstrcmp</a>(<a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(s1), <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(s2))</td></tr>
+<tr class="memdesc:a7ae7156c8de57454ca38d306100b8160"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two UCX strings with standard <code>memcmp()</code>.  <a href="#a7ae7156c8de57454ca38d306100b8160">More...</a><br /></td></tr>
+<tr class="separator:a7ae7156c8de57454ca38d306100b8160"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a81b0f6df794152c2038703d4e9d0ad59"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a81b0f6df794152c2038703d4e9d0ad59">sstrcasecmp</a>(s1,  s2)&#160;&#160;&#160;<a class="el" href="string_8h.html#aca8142fb823d253054e17c17cfca05e0">scstrcasecmp</a>(<a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(s1), <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(s2))</td></tr>
+<tr class="memdesc:a81b0f6df794152c2038703d4e9d0ad59"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two UCX strings ignoring the case.  <a href="#a81b0f6df794152c2038703d4e9d0ad59">More...</a><br /></td></tr>
+<tr class="separator:a81b0f6df794152c2038703d4e9d0ad59"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:accbfd2b459a028d7af9fb7df6f977d80"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#accbfd2b459a028d7af9fb7df6f977d80">sstrdup</a>(string)&#160;&#160;&#160;<a class="el" href="string_8h.html#a97dccce03af419596dbdd592ca46a164">scstrdup</a>(<a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(string))</td></tr>
+<tr class="memdesc:accbfd2b459a028d7af9fb7df6f977d80"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a duplicate of the specified string.  <a href="#accbfd2b459a028d7af9fb7df6f977d80">More...</a><br /></td></tr>
+<tr class="separator:accbfd2b459a028d7af9fb7df6f977d80"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8d098baada4ea9ad5d8b6343b5aec007"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a8d098baada4ea9ad5d8b6343b5aec007">sstrdup_a</a>(allocator,  string)&#160;&#160;&#160;<a class="el" href="string_8h.html#a8fe58921f51eb1fde038472377e63014">scstrdup_a</a>(allocator, <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(string))</td></tr>
+<tr class="memdesc:a8d098baada4ea9ad5d8b6343b5aec007"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a duplicate of the specified string using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>.  <a href="#a8d098baada4ea9ad5d8b6343b5aec007">More...</a><br /></td></tr>
+<tr class="separator:a8d098baada4ea9ad5d8b6343b5aec007"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7d73b66256384b26927e787318fdefa2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a7d73b66256384b26927e787318fdefa2">sstrprefix</a>(string,  prefix)&#160;&#160;&#160;<a class="el" href="string_8h.html#a599ddc2f88dd1df68b72eefd91347393">scstrprefix</a>(<a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(string), <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(prefix))</td></tr>
+<tr class="memdesc:a7d73b66256384b26927e787318fdefa2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks, if a string has a specific prefix.  <a href="#a7d73b66256384b26927e787318fdefa2">More...</a><br /></td></tr>
+<tr class="separator:a7d73b66256384b26927e787318fdefa2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac6a5246f26be2e8a5f34d8995b7ec14e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#ac6a5246f26be2e8a5f34d8995b7ec14e">sstrsuffix</a>(string,  suffix)&#160;&#160;&#160;<a class="el" href="string_8h.html#a1f0ae316a2afe85d5b4655e6ece6721a">scstrsuffix</a>(<a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(string), <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(suffix))</td></tr>
+<tr class="memdesc:ac6a5246f26be2e8a5f34d8995b7ec14e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks, if a string has a specific suffix.  <a href="#ac6a5246f26be2e8a5f34d8995b7ec14e">More...</a><br /></td></tr>
+<tr class="separator:ac6a5246f26be2e8a5f34d8995b7ec14e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acd3dc64e90db9b4046e14f115a815ff4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#acd3dc64e90db9b4046e14f115a815ff4">sstrcaseprefix</a>(string,  prefix)&#160;&#160;&#160;<a class="el" href="string_8h.html#a3718ef4aa1e86cdb26bda2f07fb585df">scstrcaseprefix</a>(<a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(string), <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(prefix))</td></tr>
+<tr class="memdesc:acd3dc64e90db9b4046e14f115a815ff4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks, if a string has a specific prefix, ignoring the case.  <a href="#acd3dc64e90db9b4046e14f115a815ff4">More...</a><br /></td></tr>
+<tr class="separator:acd3dc64e90db9b4046e14f115a815ff4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a57eabd4862d531dd685bbf2feb8468bf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a57eabd4862d531dd685bbf2feb8468bf">sstrcasesuffix</a>(string,  suffix)&#160;&#160;&#160;<a class="el" href="string_8h.html#a6edb4b85f2b9efe79db7ffe6eccd7bc3">scstrcasesuffix</a>(<a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(string), <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(suffix))</td></tr>
+<tr class="memdesc:a57eabd4862d531dd685bbf2feb8468bf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks, if a string has a specific suffix, ignoring the case.  <a href="#a57eabd4862d531dd685bbf2feb8468bf">More...</a><br /></td></tr>
+<tr class="separator:a57eabd4862d531dd685bbf2feb8468bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a89343ea3e719f00ee802b557db57b769"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a89343ea3e719f00ee802b557db57b769">sstrlower</a>(string)&#160;&#160;&#160;<a class="el" href="string_8h.html#abccf198bea3186ff2abb080cc88dcae6">scstrlower</a>(<a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(string))</td></tr>
+<tr class="memdesc:a89343ea3e719f00ee802b557db57b769"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a lower case version of a string.  <a href="#a89343ea3e719f00ee802b557db57b769">More...</a><br /></td></tr>
+<tr class="separator:a89343ea3e719f00ee802b557db57b769"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4bb4742fe71115f493991d307cb22b23"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a4bb4742fe71115f493991d307cb22b23">sstrlower_a</a>(allocator,  string)&#160;&#160;&#160;<a class="el" href="string_8h.html#a3cf1e557df7ab58d03c78832c4060276">scstrlower_a</a>(allocator, <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(string))</td></tr>
+<tr class="memdesc:a4bb4742fe71115f493991d307cb22b23"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a lower case version of a string.  <a href="#a4bb4742fe71115f493991d307cb22b23">More...</a><br /></td></tr>
+<tr class="separator:a4bb4742fe71115f493991d307cb22b23"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a084fe5a3a90d6fb6b15ecda03bb30824"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a084fe5a3a90d6fb6b15ecda03bb30824">sstrupper</a>(string)&#160;&#160;&#160;<a class="el" href="string_8h.html#af3dd09ec9d11162fe0075f4e60f41240">scstrupper</a>(<a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(string))</td></tr>
+<tr class="memdesc:a084fe5a3a90d6fb6b15ecda03bb30824"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a upper case version of a string.  <a href="#a084fe5a3a90d6fb6b15ecda03bb30824">More...</a><br /></td></tr>
+<tr class="separator:a084fe5a3a90d6fb6b15ecda03bb30824"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5f0dd83c0176b812fb428004b2877a34"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a5f0dd83c0176b812fb428004b2877a34">sstrupper_a</a>(allocator,  string)&#160;&#160;&#160;<a class="el" href="string_8h.html#aea94613eb74668cc05d365803d32bfad">scstrupper_a</a>(allocator, string)</td></tr>
+<tr class="memdesc:a5f0dd83c0176b812fb428004b2877a34"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a upper case version of a string.  <a href="#a5f0dd83c0176b812fb428004b2877a34">More...</a><br /></td></tr>
+<tr class="separator:a5f0dd83c0176b812fb428004b2877a34"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a69d5e3eeec783cc43314df71248768f5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a69d5e3eeec783cc43314df71248768f5">ucx_sc2sc</a> (<a class="el" href="structscstr__t.html">scstr_t</a> str)</td></tr>
+<tr class="memdesc:a69d5e3eeec783cc43314df71248768f5"><td class="mdescLeft">&#160;</td><td class="mdescRight">One of two type adjustment functions that return an <a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a>.  <a href="#a69d5e3eeec783cc43314df71248768f5">More...</a><br /></td></tr>
+<tr class="separator:a69d5e3eeec783cc43314df71248768f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ce5ad1b2aa2dbeba204d452c2e64359"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a9ce5ad1b2aa2dbeba204d452c2e64359">ucx_ss2sc</a> (<a class="el" href="structsstr__t.html">sstr_t</a> str)</td></tr>
+<tr class="memdesc:a9ce5ad1b2aa2dbeba204d452c2e64359"><td class="mdescLeft">&#160;</td><td class="mdescRight">One of two type adjustment functions that return an <a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a>.  <a href="#a9ce5ad1b2aa2dbeba204d452c2e64359">More...</a><br /></td></tr>
+<tr class="separator:a9ce5ad1b2aa2dbeba204d452c2e64359"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aedeb5d7bddda54116101a8d68af8c56d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#aedeb5d7bddda54116101a8d68af8c56d">ucx_ss2c_s</a> ()</td></tr>
+<tr class="memdesc:aedeb5d7bddda54116101a8d68af8c56d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Converts a UCX string to an immutable UCX string (<a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a>).  <a href="#aedeb5d7bddda54116101a8d68af8c56d">More...</a><br /></td></tr>
+<tr class="separator:aedeb5d7bddda54116101a8d68af8c56d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a539eb7059251a051ee5d179526a23e9a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a539eb7059251a051ee5d179526a23e9a">sstr</a> (char *cstring)</td></tr>
+<tr class="memdesc:a539eb7059251a051ee5d179526a23e9a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> based on a C string.  <a href="#a539eb7059251a051ee5d179526a23e9a">More...</a><br /></td></tr>
+<tr class="separator:a539eb7059251a051ee5d179526a23e9a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2744c38ac44abf3e01fa059056dcf36c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a2744c38ac44abf3e01fa059056dcf36c">sstrn</a> (char *cstring, size_t length)</td></tr>
+<tr class="memdesc:a2744c38ac44abf3e01fa059056dcf36c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> of the specified length based on a C string.  <a href="#a2744c38ac44abf3e01fa059056dcf36c">More...</a><br /></td></tr>
+<tr class="separator:a2744c38ac44abf3e01fa059056dcf36c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b1d6f1eca1c1549f37107b9c026c5a6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a2b1d6f1eca1c1549f37107b9c026c5a6">scstr</a> (const char *cstring)</td></tr>
+<tr class="memdesc:a2b1d6f1eca1c1549f37107b9c026c5a6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new <a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a> based on a constant C string.  <a href="#a2b1d6f1eca1c1549f37107b9c026c5a6">More...</a><br /></td></tr>
+<tr class="separator:a2b1d6f1eca1c1549f37107b9c026c5a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae594f6e222ea394cef6a26c0dfad000d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#ae594f6e222ea394cef6a26c0dfad000d">scstrn</a> (const char *cstring, size_t length)</td></tr>
+<tr class="memdesc:ae594f6e222ea394cef6a26c0dfad000d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new <a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a> of the specified length based on a constant C string.  <a href="#ae594f6e222ea394cef6a26c0dfad000d">More...</a><br /></td></tr>
+<tr class="separator:ae594f6e222ea394cef6a26c0dfad000d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac1b000030d6d197eec48c15a182055d5"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#ac1b000030d6d197eec48c15a182055d5">scstrnlen</a> (size_t count,...)</td></tr>
+<tr class="memdesc:ac1b000030d6d197eec48c15a182055d5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the accumulated length of all specified strings.  <a href="#ac1b000030d6d197eec48c15a182055d5">More...</a><br /></td></tr>
+<tr class="separator:ac1b000030d6d197eec48c15a182055d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7376842c19e954b49215da81ef76ac0c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a7376842c19e954b49215da81ef76ac0c">scstrcat</a> (size_t count, <a class="el" href="structscstr__t.html">scstr_t</a> s1,...)</td></tr>
+<tr class="memdesc:a7376842c19e954b49215da81ef76ac0c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Concatenates two or more strings.  <a href="#a7376842c19e954b49215da81ef76ac0c">More...</a><br /></td></tr>
+<tr class="separator:a7376842c19e954b49215da81ef76ac0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abacce4cbd6f70fcb6453904ef08b02e9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#abacce4cbd6f70fcb6453904ef08b02e9">scstrcat_a</a> (<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *alloc, size_t count, <a class="el" href="structscstr__t.html">scstr_t</a> s1,...)</td></tr>
+<tr class="memdesc:abacce4cbd6f70fcb6453904ef08b02e9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Concatenates two or more strings using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>.  <a href="#abacce4cbd6f70fcb6453904ef08b02e9">More...</a><br /></td></tr>
+<tr class="separator:abacce4cbd6f70fcb6453904ef08b02e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5eb9e0e1f26cf7fbecc038cd90e8b258"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a5eb9e0e1f26cf7fbecc038cd90e8b258">sstrsubs</a> (<a class="el" href="structsstr__t.html">sstr_t</a> string, size_t start)</td></tr>
+<tr class="memdesc:a5eb9e0e1f26cf7fbecc038cd90e8b258"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a substring starting at the specified location.  <a href="#a5eb9e0e1f26cf7fbecc038cd90e8b258">More...</a><br /></td></tr>
+<tr class="separator:a5eb9e0e1f26cf7fbecc038cd90e8b258"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a78925c91af54f23cebd20ff99ef4331a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a78925c91af54f23cebd20ff99ef4331a">sstrsubsl</a> (<a class="el" href="structsstr__t.html">sstr_t</a> string, size_t start, size_t length)</td></tr>
+<tr class="memdesc:a78925c91af54f23cebd20ff99ef4331a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a substring with the given length starting at the specified location.  <a href="#a78925c91af54f23cebd20ff99ef4331a">More...</a><br /></td></tr>
+<tr class="separator:a78925c91af54f23cebd20ff99ef4331a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9a6c8d8db0dda0037c3c852cce1a5060"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a9a6c8d8db0dda0037c3c852cce1a5060">scstrsubs</a> (<a class="el" href="structscstr__t.html">scstr_t</a> string, size_t start)</td></tr>
+<tr class="memdesc:a9a6c8d8db0dda0037c3c852cce1a5060"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a substring of an immutable string starting at the specified location.  <a href="#a9a6c8d8db0dda0037c3c852cce1a5060">More...</a><br /></td></tr>
+<tr class="separator:a9a6c8d8db0dda0037c3c852cce1a5060"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad50f0f67b906fad0744f46bcb51e144b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#ad50f0f67b906fad0744f46bcb51e144b">scstrsubsl</a> (<a class="el" href="structscstr__t.html">scstr_t</a> string, size_t start, size_t length)</td></tr>
+<tr class="memdesc:ad50f0f67b906fad0744f46bcb51e144b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a substring of an immutable string with a maximum length starting at the specified location.  <a href="#ad50f0f67b906fad0744f46bcb51e144b">More...</a><br /></td></tr>
+<tr class="separator:ad50f0f67b906fad0744f46bcb51e144b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af80898a0b75955eb2579298c3ae2c481"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#af80898a0b75955eb2579298c3ae2c481">sstrchr</a> (<a class="el" href="structsstr__t.html">sstr_t</a> string, int chr)</td></tr>
+<tr class="memdesc:af80898a0b75955eb2579298c3ae2c481"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a substring starting at the location of the first occurrence of the specified character.  <a href="#af80898a0b75955eb2579298c3ae2c481">More...</a><br /></td></tr>
+<tr class="separator:af80898a0b75955eb2579298c3ae2c481"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adae3f59957ca328e1da5285cb8b02a72"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#adae3f59957ca328e1da5285cb8b02a72">sstrrchr</a> (<a class="el" href="structsstr__t.html">sstr_t</a> string, int chr)</td></tr>
+<tr class="memdesc:adae3f59957ca328e1da5285cb8b02a72"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a substring starting at the location of the last occurrence of the specified character.  <a href="#adae3f59957ca328e1da5285cb8b02a72">More...</a><br /></td></tr>
+<tr class="separator:adae3f59957ca328e1da5285cb8b02a72"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5836d6a7a744791c35e5c17bdc394a87"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a5836d6a7a744791c35e5c17bdc394a87">scstrchr</a> (<a class="el" href="structscstr__t.html">scstr_t</a> string, int chr)</td></tr>
+<tr class="memdesc:a5836d6a7a744791c35e5c17bdc394a87"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns an immutable substring starting at the location of the first occurrence of the specified character.  <a href="#a5836d6a7a744791c35e5c17bdc394a87">More...</a><br /></td></tr>
+<tr class="separator:a5836d6a7a744791c35e5c17bdc394a87"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae389835b97cd9382e7d6a6a075323376"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#ae389835b97cd9382e7d6a6a075323376">scstrrchr</a> (<a class="el" href="structscstr__t.html">scstr_t</a> string, int chr)</td></tr>
+<tr class="memdesc:ae389835b97cd9382e7d6a6a075323376"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns an immutable substring starting at the location of the last occurrence of the specified character.  <a href="#ae389835b97cd9382e7d6a6a075323376">More...</a><br /></td></tr>
+<tr class="separator:ae389835b97cd9382e7d6a6a075323376"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa4362cb36c6629f9d8484739fd827748"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#aa4362cb36c6629f9d8484739fd827748">scstrsstr</a> (<a class="el" href="structsstr__t.html">sstr_t</a> string, <a class="el" href="structscstr__t.html">scstr_t</a> match)</td></tr>
+<tr class="memdesc:aa4362cb36c6629f9d8484739fd827748"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a substring starting at the location of the first occurrence of the specified string.  <a href="#aa4362cb36c6629f9d8484739fd827748">More...</a><br /></td></tr>
+<tr class="separator:aa4362cb36c6629f9d8484739fd827748"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a54f256c3abe811c52d58b4ff1b23f051"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a54f256c3abe811c52d58b4ff1b23f051">scstrscstr</a> (<a class="el" href="structscstr__t.html">scstr_t</a> string, <a class="el" href="structscstr__t.html">scstr_t</a> match)</td></tr>
+<tr class="memdesc:a54f256c3abe811c52d58b4ff1b23f051"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns an immutable substring starting at the location of the first occurrence of the specified immutable string.  <a href="#a54f256c3abe811c52d58b4ff1b23f051">More...</a><br /></td></tr>
+<tr class="separator:a54f256c3abe811c52d58b4ff1b23f051"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae71cac352b00230848bde358f0fb05ea"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structsstr__t.html">sstr_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#ae71cac352b00230848bde358f0fb05ea">scstrsplit</a> (<a class="el" href="structscstr__t.html">scstr_t</a> string, <a class="el" href="structscstr__t.html">scstr_t</a> delim, ssize_t *count)</td></tr>
+<tr class="memdesc:ae71cac352b00230848bde358f0fb05ea"><td class="mdescLeft">&#160;</td><td class="mdescRight">Splits a string into parts by using a delimiter string.  <a href="#ae71cac352b00230848bde358f0fb05ea">More...</a><br /></td></tr>
+<tr class="separator:ae71cac352b00230848bde358f0fb05ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a52906455ae530c9cdc6812c8e6d9bdef"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structsstr__t.html">sstr_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a52906455ae530c9cdc6812c8e6d9bdef">scstrsplit_a</a> (<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *allocator, <a class="el" href="structscstr__t.html">scstr_t</a> string, <a class="el" href="structscstr__t.html">scstr_t</a> delim, ssize_t *count)</td></tr>
+<tr class="memdesc:a52906455ae530c9cdc6812c8e6d9bdef"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performing <a class="el" href="string_8h.html#ae71cac352b00230848bde358f0fb05ea" title="Splits a string into parts by using a delimiter string. ">scstrsplit()</a> using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>.  <a href="#a52906455ae530c9cdc6812c8e6d9bdef">More...</a><br /></td></tr>
+<tr class="separator:a52906455ae530c9cdc6812c8e6d9bdef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af35272a8e5408c88ed3e25a3a98f0a82"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#af35272a8e5408c88ed3e25a3a98f0a82">scstrcmp</a> (<a class="el" href="structscstr__t.html">scstr_t</a> s1, <a class="el" href="structscstr__t.html">scstr_t</a> s2)</td></tr>
+<tr class="memdesc:af35272a8e5408c88ed3e25a3a98f0a82"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two UCX strings with standard <code>memcmp()</code>.  <a href="#af35272a8e5408c88ed3e25a3a98f0a82">More...</a><br /></td></tr>
+<tr class="separator:af35272a8e5408c88ed3e25a3a98f0a82"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aca8142fb823d253054e17c17cfca05e0"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#aca8142fb823d253054e17c17cfca05e0">scstrcasecmp</a> (<a class="el" href="structscstr__t.html">scstr_t</a> s1, <a class="el" href="structscstr__t.html">scstr_t</a> s2)</td></tr>
+<tr class="memdesc:aca8142fb823d253054e17c17cfca05e0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two UCX strings ignoring the case.  <a href="#aca8142fb823d253054e17c17cfca05e0">More...</a><br /></td></tr>
+<tr class="separator:aca8142fb823d253054e17c17cfca05e0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97dccce03af419596dbdd592ca46a164"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a97dccce03af419596dbdd592ca46a164">scstrdup</a> (<a class="el" href="structscstr__t.html">scstr_t</a> string)</td></tr>
+<tr class="memdesc:a97dccce03af419596dbdd592ca46a164"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a duplicate of the specified string.  <a href="#a97dccce03af419596dbdd592ca46a164">More...</a><br /></td></tr>
+<tr class="separator:a97dccce03af419596dbdd592ca46a164"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8fe58921f51eb1fde038472377e63014"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a8fe58921f51eb1fde038472377e63014">scstrdup_a</a> (<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *allocator, <a class="el" href="structscstr__t.html">scstr_t</a> string)</td></tr>
+<tr class="memdesc:a8fe58921f51eb1fde038472377e63014"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a duplicate of the specified string using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>.  <a href="#a8fe58921f51eb1fde038472377e63014">More...</a><br /></td></tr>
+<tr class="separator:a8fe58921f51eb1fde038472377e63014"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae2d6da564d3fce51f2e0cac580fdbc56"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#ae2d6da564d3fce51f2e0cac580fdbc56">sstrtrim</a> (<a class="el" href="structsstr__t.html">sstr_t</a> string)</td></tr>
+<tr class="memdesc:ae2d6da564d3fce51f2e0cac580fdbc56"><td class="mdescLeft">&#160;</td><td class="mdescRight">Omits leading and trailing spaces.  <a href="#ae2d6da564d3fce51f2e0cac580fdbc56">More...</a><br /></td></tr>
+<tr class="separator:ae2d6da564d3fce51f2e0cac580fdbc56"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad374b16eb1be8b48019debad9b9f268c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#ad374b16eb1be8b48019debad9b9f268c">scstrtrim</a> (<a class="el" href="structscstr__t.html">scstr_t</a> string)</td></tr>
+<tr class="memdesc:ad374b16eb1be8b48019debad9b9f268c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Omits leading and trailing spaces.  <a href="#ad374b16eb1be8b48019debad9b9f268c">More...</a><br /></td></tr>
+<tr class="separator:ad374b16eb1be8b48019debad9b9f268c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a599ddc2f88dd1df68b72eefd91347393"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a599ddc2f88dd1df68b72eefd91347393">scstrprefix</a> (<a class="el" href="structscstr__t.html">scstr_t</a> string, <a class="el" href="structscstr__t.html">scstr_t</a> prefix)</td></tr>
+<tr class="memdesc:a599ddc2f88dd1df68b72eefd91347393"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks, if a string has a specific prefix.  <a href="#a599ddc2f88dd1df68b72eefd91347393">More...</a><br /></td></tr>
+<tr class="separator:a599ddc2f88dd1df68b72eefd91347393"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1f0ae316a2afe85d5b4655e6ece6721a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a1f0ae316a2afe85d5b4655e6ece6721a">scstrsuffix</a> (<a class="el" href="structscstr__t.html">scstr_t</a> string, <a class="el" href="structscstr__t.html">scstr_t</a> suffix)</td></tr>
+<tr class="memdesc:a1f0ae316a2afe85d5b4655e6ece6721a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks, if a string has a specific suffix.  <a href="#a1f0ae316a2afe85d5b4655e6ece6721a">More...</a><br /></td></tr>
+<tr class="separator:a1f0ae316a2afe85d5b4655e6ece6721a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3718ef4aa1e86cdb26bda2f07fb585df"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a3718ef4aa1e86cdb26bda2f07fb585df">scstrcaseprefix</a> (<a class="el" href="structscstr__t.html">scstr_t</a> string, <a class="el" href="structscstr__t.html">scstr_t</a> prefix)</td></tr>
+<tr class="memdesc:a3718ef4aa1e86cdb26bda2f07fb585df"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks, if a string has a specific prefix, ignoring the case.  <a href="#a3718ef4aa1e86cdb26bda2f07fb585df">More...</a><br /></td></tr>
+<tr class="separator:a3718ef4aa1e86cdb26bda2f07fb585df"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6edb4b85f2b9efe79db7ffe6eccd7bc3"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a6edb4b85f2b9efe79db7ffe6eccd7bc3">scstrcasesuffix</a> (<a class="el" href="structscstr__t.html">scstr_t</a> string, <a class="el" href="structscstr__t.html">scstr_t</a> suffix)</td></tr>
+<tr class="memdesc:a6edb4b85f2b9efe79db7ffe6eccd7bc3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks, if a string has a specific suffix, ignoring the case.  <a href="#a6edb4b85f2b9efe79db7ffe6eccd7bc3">More...</a><br /></td></tr>
+<tr class="separator:a6edb4b85f2b9efe79db7ffe6eccd7bc3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abccf198bea3186ff2abb080cc88dcae6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#abccf198bea3186ff2abb080cc88dcae6">scstrlower</a> (<a class="el" href="structscstr__t.html">scstr_t</a> string)</td></tr>
+<tr class="memdesc:abccf198bea3186ff2abb080cc88dcae6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a lower case version of a string.  <a href="#abccf198bea3186ff2abb080cc88dcae6">More...</a><br /></td></tr>
+<tr class="separator:abccf198bea3186ff2abb080cc88dcae6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3cf1e557df7ab58d03c78832c4060276"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#a3cf1e557df7ab58d03c78832c4060276">scstrlower_a</a> (<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *allocator, <a class="el" href="structscstr__t.html">scstr_t</a> string)</td></tr>
+<tr class="memdesc:a3cf1e557df7ab58d03c78832c4060276"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a lower case version of a string.  <a href="#a3cf1e557df7ab58d03c78832c4060276">More...</a><br /></td></tr>
+<tr class="separator:a3cf1e557df7ab58d03c78832c4060276"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af3dd09ec9d11162fe0075f4e60f41240"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#af3dd09ec9d11162fe0075f4e60f41240">scstrupper</a> (<a class="el" href="structscstr__t.html">scstr_t</a> string)</td></tr>
+<tr class="memdesc:af3dd09ec9d11162fe0075f4e60f41240"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a upper case version of a string.  <a href="#af3dd09ec9d11162fe0075f4e60f41240">More...</a><br /></td></tr>
+<tr class="separator:af3dd09ec9d11162fe0075f4e60f41240"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aea94613eb74668cc05d365803d32bfad"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="string_8h.html#aea94613eb74668cc05d365803d32bfad">scstrupper_a</a> (<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *allocator, <a class="el" href="structscstr__t.html">scstr_t</a> string)</td></tr>
+<tr class="memdesc:aea94613eb74668cc05d365803d32bfad"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a upper case version of a string.  <a href="#aea94613eb74668cc05d365803d32bfad">More...</a><br /></td></tr>
+<tr class="separator:aea94613eb74668cc05d365803d32bfad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Bounded string implementation. </p>
+<p>The UCX strings (<code><a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a></code>) provide an alternative to C strings. The main difference to C strings is, that <code><a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a></code> does <b>not need to be <code>NULL</code>-terminated</b>. Instead the length is stored within the structure.</p>
+<p>When using <code><a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a></code>, developers must be full aware of what type of string (<code>NULL</code>-terminated) or not) they are using, when accessing the <code>char* ptr</code> directly.</p>
+<p>The UCX string module provides some common string functions, known from standard libc, working with <code><a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a></code>.</p>
+<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
+<dd>
+Olaf Wintermann </dd></dl>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a7d5bc48708405a28b23667e32dfcecae"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7d5bc48708405a28b23667e32dfcecae">&#9670;&nbsp;</a></span>PRIsstr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define PRIsstr&#160;&#160;&#160;&quot;.*s&quot;</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Format specifier for a <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> or <a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a>. </p>
+
+</div>
+</div>
+<a id="a8fa17c8cf4c36df48f4108c36da8573e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8fa17c8cf4c36df48f4108c36da8573e">&#9670;&nbsp;</a></span>S</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define S</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="string_8h.html#a2744c38ac44abf3e01fa059056dcf36c">sstrn</a>(s, sizeof(s)-1)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shortcut for the conversion of a C string to a <code><a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a></code>. </p>
+
+</div>
+</div>
+<a id="a7d261dd0bc358c957a368bc058c1ce53"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7d261dd0bc358c957a368bc058c1ce53">&#9670;&nbsp;</a></span>SC</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SC</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="string_8h.html#ae594f6e222ea394cef6a26c0dfad000d">scstrn</a>(s, sizeof(s)-1)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shortcut for the conversion of a C string to a <code><a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a></code>. </p>
+
+</div>
+</div>
+<a id="ad4293350a9b39a23a6546bd0fef2aeed"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad4293350a9b39a23a6546bd0fef2aeed">&#9670;&nbsp;</a></span>SCSTR</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SCSTR</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">str</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="string_8h.html#aedeb5d7bddda54116101a8d68af8c56d">ucx_ss2c_s</a>(str)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Converts a UCX string to an immutable UCX string (<a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a>). </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">str</td><td>some UCX string </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the an immutable version of the provided string </dd></dl>
+
+</div>
+</div>
+<a id="a23ed51e87385886bb65e8cd19c839362"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a23ed51e87385886bb65e8cd19c839362">&#9670;&nbsp;</a></span>SFMT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define SFMT</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s</td><td>)</td>
+          <td>&#160;&#160;&#160;(int) (s).length, (s).ptr</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Expands a <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> or <a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a> to printf arguments. </p>
+
+</div>
+</div>
+<a id="a81b0f6df794152c2038703d4e9d0ad59"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a81b0f6df794152c2038703d4e9d0ad59">&#9670;&nbsp;</a></span>sstrcasecmp</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sstrcasecmp</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s1, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s2&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="string_8h.html#aca8142fb823d253054e17c17cfca05e0">scstrcasecmp</a>(<a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(s1), <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(s2))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Compares two UCX strings ignoring the case. </p>
+<p>At first it compares the <a class="el" href="structsstr__t.html#a5cf571708cdff92e45f08458f2b98229" title="The length of the string. ">sstr_t.length</a> attribute of the two strings. If and only if the lengths match, both strings are compared char by char ignoring the case.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">s1</td><td>the first string </td></tr>
+    <tr><td class="paramname">s2</td><td>the second string </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>-1, if the length of s1 is less than the length of s2 or 1, if the length of s1 is greater than the length of s2 or the result of the platform specific string comparison function ignoring the case. </dd></dl>
+
+</div>
+</div>
+<a id="acd3dc64e90db9b4046e14f115a815ff4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acd3dc64e90db9b4046e14f115a815ff4">&#9670;&nbsp;</a></span>sstrcaseprefix</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sstrcaseprefix</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">string, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">prefix&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="string_8h.html#a3718ef4aa1e86cdb26bda2f07fb585df">scstrcaseprefix</a>(<a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(string), <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(prefix))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Checks, if a string has a specific prefix, ignoring the case. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the string to check </td></tr>
+    <tr><td class="paramname">prefix</td><td>the prefix the string should have </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1, if and only if the string has the specified prefix, 0 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a57eabd4862d531dd685bbf2feb8468bf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a57eabd4862d531dd685bbf2feb8468bf">&#9670;&nbsp;</a></span>sstrcasesuffix</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sstrcasesuffix</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">string, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">suffix&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="string_8h.html#a6edb4b85f2b9efe79db7ffe6eccd7bc3">scstrcasesuffix</a>(<a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(string), <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(suffix))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Checks, if a string has a specific suffix, ignoring the case. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the string to check </td></tr>
+    <tr><td class="paramname">suffix</td><td>the suffix the string should have </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1, if and only if the string has the specified suffix, 0 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a6af8a4c347c7fdb5980d4c4803be2759"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6af8a4c347c7fdb5980d4c4803be2759">&#9670;&nbsp;</a></span>sstrcat</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sstrcat</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">count, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s1, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><em>...</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="string_8h.html#a7376842c19e954b49215da81ef76ac0c">scstrcat</a>(count, <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(s1), __VA_ARGS__)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Concatenates two or more strings. </p>
+<p>The resulting string will be allocated by standard <code>malloc()</code>. So developers <b>MUST</b> pass the <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0" title="A pointer to the string (not necessarily NULL-terminated) ">sstr_t.ptr</a> to <code>free()</code>.</p>
+<p>The <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0" title="A pointer to the string (not necessarily NULL-terminated) ">sstr_t.ptr</a> of the return value will <em>always</em> be <code>NULL</code>- terminated.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">count</td><td>the total number of strings to concatenate </td></tr>
+    <tr><td class="paramname">s1</td><td>first string </td></tr>
+    <tr><td class="paramname">...</td><td>all remaining strings </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the concatenated string </dd></dl>
+
+</div>
+</div>
+<a id="a6068d460f9bc05962666a917d26568b3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6068d460f9bc05962666a917d26568b3">&#9670;&nbsp;</a></span>sstrcat_a</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sstrcat_a</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">alloc, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">count, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s1, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><em>...</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="string_8h.html#abacce4cbd6f70fcb6453904ef08b02e9">scstrcat_a</a>(alloc, count, <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(s1), __VA_ARGS__)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Concatenates two or more strings using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>. </p>
+<p>The resulting string must be freed by the allocators <code>free()</code> implementation.</p>
+<p>The <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0" title="A pointer to the string (not necessarily NULL-terminated) ">sstr_t.ptr</a> of the return value will <em>always</em> be <code>NULL</code>- terminated.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">alloc</td><td>the allocator to use </td></tr>
+    <tr><td class="paramname">count</td><td>the total number of strings to concatenate </td></tr>
+    <tr><td class="paramname">s1</td><td>first string </td></tr>
+    <tr><td class="paramname">...</td><td>all remaining strings </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the concatenated string</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#a6af8a4c347c7fdb5980d4c4803be2759" title="Concatenates two or more strings. ">sstrcat()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a7ae7156c8de57454ca38d306100b8160"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7ae7156c8de57454ca38d306100b8160">&#9670;&nbsp;</a></span>sstrcmp</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sstrcmp</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s1, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">s2&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="string_8h.html#af35272a8e5408c88ed3e25a3a98f0a82">scstrcmp</a>(<a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(s1), <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(s2))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Compares two UCX strings with standard <code>memcmp()</code>. </p>
+<p>At first it compares the <a class="el" href="structsstr__t.html#a5cf571708cdff92e45f08458f2b98229" title="The length of the string. ">sstr_t.length</a> attribute of the two strings. The <code>memcmp()</code> function is called, if and only if the lengths match.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">s1</td><td>the first string </td></tr>
+    <tr><td class="paramname">s2</td><td>the second string </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>-1, if the length of s1 is less than the length of s2 or 1, if the length of s1 is greater than the length of s2 or the result of <code>memcmp()</code> otherwise (i.e. 0 if the strings match) </dd></dl>
+
+</div>
+</div>
+<a id="accbfd2b459a028d7af9fb7df6f977d80"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#accbfd2b459a028d7af9fb7df6f977d80">&#9670;&nbsp;</a></span>sstrdup</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sstrdup</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">string</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="string_8h.html#a97dccce03af419596dbdd592ca46a164">scstrdup</a>(<a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(string))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Creates a duplicate of the specified string. </p>
+<p>The new <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> will contain a copy allocated by standard <code>malloc()</code>. So developers <b>MUST</b> pass the <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0" title="A pointer to the string (not necessarily NULL-terminated) ">sstr_t.ptr</a> to <code>free()</code>.</p>
+<p>The <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0" title="A pointer to the string (not necessarily NULL-terminated) ">sstr_t.ptr</a> of the return value will <em>always</em> be <code>NULL</code>- terminated, regardless of the argument.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the string to duplicate </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a duplicate of the string </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#a8d098baada4ea9ad5d8b6343b5aec007" title="Creates a duplicate of the specified string using a UcxAllocator. ">sstrdup_a()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a8d098baada4ea9ad5d8b6343b5aec007"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8d098baada4ea9ad5d8b6343b5aec007">&#9670;&nbsp;</a></span>sstrdup_a</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sstrdup_a</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">allocator, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">string&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="string_8h.html#a8fe58921f51eb1fde038472377e63014">scstrdup_a</a>(allocator, <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(string))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Creates a duplicate of the specified string using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>. </p>
+<p>The new <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> will contain a copy allocated by the allocators <a class="el" href="structUcxAllocator.html#a013376172be39ed54f77c4be6898845a" title="The malloc() function for this allocator. ">UcxAllocator.malloc()</a> function. So it is implementation depended, whether the returned <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0" title="A pointer to the string (not necessarily NULL-terminated) ">sstr_t.ptr</a> pointer must be passed to the allocators <a class="el" href="structUcxAllocator.html#aecce1840378ed53f1002190f4f87026f" title="The free() function for this allocator. ">UcxAllocator.free()</a> function manually.</p>
+<p>The <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0" title="A pointer to the string (not necessarily NULL-terminated) ">sstr_t.ptr</a> of the return value will <em>always</em> be <code>NULL</code>- terminated, regardless of the argument.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>a valid instance of a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a> </td></tr>
+    <tr><td class="paramname">string</td><td>the string to duplicate </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a duplicate of the string </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#a97dccce03af419596dbdd592ca46a164" title="Creates a duplicate of the specified string. ">scstrdup()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a89343ea3e719f00ee802b557db57b769"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a89343ea3e719f00ee802b557db57b769">&#9670;&nbsp;</a></span>sstrlower</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sstrlower</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">string</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="string_8h.html#abccf198bea3186ff2abb080cc88dcae6">scstrlower</a>(<a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(string))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns a lower case version of a string. </p>
+<p>This function creates a duplicate of the input string, first (see <a class="el" href="string_8h.html#accbfd2b459a028d7af9fb7df6f977d80" title="Creates a duplicate of the specified string. ">sstrdup()</a>).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the input string </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the resulting lower case string </dd></dl>
+
+</div>
+</div>
+<a id="a4bb4742fe71115f493991d307cb22b23"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4bb4742fe71115f493991d307cb22b23">&#9670;&nbsp;</a></span>sstrlower_a</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sstrlower_a</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">allocator, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">string&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="string_8h.html#a3cf1e557df7ab58d03c78832c4060276">scstrlower_a</a>(allocator, <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(string))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns a lower case version of a string. </p>
+<p>This function creates a duplicate of the input string, first (see <a class="el" href="string_8h.html#a8d098baada4ea9ad5d8b6343b5aec007" title="Creates a duplicate of the specified string using a UcxAllocator. ">sstrdup_a()</a>).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>the allocator used for duplicating the string </td></tr>
+    <tr><td class="paramname">string</td><td>the input string </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the resulting lower case string </dd></dl>
+
+</div>
+</div>
+<a id="a33fa945acc5ac2ce962e5ef13cf1638c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a33fa945acc5ac2ce962e5ef13cf1638c">&#9670;&nbsp;</a></span>sstrnlen</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sstrnlen</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">count, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><em>...</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="string_8h.html#ac1b000030d6d197eec48c15a182055d5">scstrnlen</a>(count, __VA_ARGS__)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns the accumulated length of all specified strings. </p>
+<p><b>Attention:</b> if the count argument is larger than the count of the specified strings, the behavior is undefined.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">count</td><td>the total number of specified strings </td></tr>
+    <tr><td class="paramname">...</td><td>all strings </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the cumulated length of all strings </dd></dl>
+
+</div>
+</div>
+<a id="a7d73b66256384b26927e787318fdefa2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7d73b66256384b26927e787318fdefa2">&#9670;&nbsp;</a></span>sstrprefix</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sstrprefix</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">string, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">prefix&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="string_8h.html#a599ddc2f88dd1df68b72eefd91347393">scstrprefix</a>(<a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(string), <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(prefix))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Checks, if a string has a specific prefix. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the string to check </td></tr>
+    <tr><td class="paramname">prefix</td><td>the prefix the string should have </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1, if and only if the string has the specified prefix, 0 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="aa696932213265e10f864678686f4ccde"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa696932213265e10f864678686f4ccde">&#9670;&nbsp;</a></span>sstrscstr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sstrscstr</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">string, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">match&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="string_8h.html#a54f256c3abe811c52d58b4ff1b23f051">scstrscstr</a>(string, <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(match))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns an immutable substring starting at the location of the first occurrence of the specified immutable string. </p>
+<p>If the string does not contain the other string, an empty string is returned.</p>
+<p>If <code>match</code> is an empty string, the complete <code>string</code> is returned.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the string to be scanned </td></tr>
+    <tr><td class="paramname">match</td><td>string containing the sequence of characters to match </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a substring starting at the first occurrence of <code>match</code>, or an empty string, if the sequence is not present in <code>string</code> </dd></dl>
+
+</div>
+</div>
+<a id="aa929984004c3576bfafb95031aca8eb7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa929984004c3576bfafb95031aca8eb7">&#9670;&nbsp;</a></span>sstrsplit</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sstrsplit</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">string, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">delim, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">count&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="string_8h.html#ae71cac352b00230848bde358f0fb05ea">scstrsplit</a>(<a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(string), <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(delim), count)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Splits a string into parts by using a delimiter string. </p>
+<p>This function will return <code>NULL</code>, if one of the following happens: </p><ul>
+<li>
+the string length is zero </li>
+<li>
+the delimeter length is zero </li>
+<li>
+the string equals the delimeter </li>
+<li>
+memory allocation fails </li>
+</ul>
+<p>The integer referenced by <code>count</code> is used as input and determines the maximum size of the resulting array, i.e. the maximum count of splits to perform + 1.</p>
+<p>The integer referenced by <code>count</code> is also used as output and is set to </p><ul>
+<li>
+-2, on memory allocation errors </li>
+<li>
+-1, if either the string or the delimiter is an empty string </li>
+<li>
+0, if the string equals the delimiter </li>
+<li>
+1, if the string does not contain the delimiter </li>
+<li>
+the count of array items, otherwise </li>
+</ul>
+<p>If the string starts with the delimiter, the first item of the resulting array will be an empty string.</p>
+<p>If the string ends with the delimiter and the maximum list size is not exceeded, the last array item will be an empty string. In case the list size would be exceeded, the last array item will be the remaining string after the last split, <em>including</em> the terminating delimiter.</p>
+<p><b>Attention:</b> The array pointer <b>AND</b> all <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0" title="A pointer to the string (not necessarily NULL-terminated) ">sstr_t.ptr</a> of the array items must be manually passed to <code>free()</code>. Use <a class="el" href="string_8h.html#ac9f69fa3a17e26a3a5f9d985b5844601" title="Performing sstrsplit() using a UcxAllocator. ">sstrsplit_a()</a> with an allocator to managed memory, to avoid this.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the string to split </td></tr>
+    <tr><td class="paramname">delim</td><td>the delimiter string </td></tr>
+    <tr><td class="paramname">count</td><td>IN: the maximum size of the resulting array (0 = no limit), OUT: the actual size of the array </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> array containing the split strings or <code>NULL</code> on error</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#ac9f69fa3a17e26a3a5f9d985b5844601" title="Performing sstrsplit() using a UcxAllocator. ">sstrsplit_a()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ac9f69fa3a17e26a3a5f9d985b5844601"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac9f69fa3a17e26a3a5f9d985b5844601">&#9670;&nbsp;</a></span>sstrsplit_a</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sstrsplit_a</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">allocator, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">string, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">delim, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">count&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="string_8h.html#a52906455ae530c9cdc6812c8e6d9bdef">scstrsplit_a</a>(allocator, <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(string), <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(delim), count)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Performing <a class="el" href="string_8h.html#aa929984004c3576bfafb95031aca8eb7" title="Splits a string into parts by using a delimiter string. ">sstrsplit()</a> using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>. </p>
+<p><em>Read the description of <a class="el" href="string_8h.html#aa929984004c3576bfafb95031aca8eb7" title="Splits a string into parts by using a delimiter string. ">sstrsplit()</a> for details.</em></p>
+<p>The memory for the <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0" title="A pointer to the string (not necessarily NULL-terminated) ">sstr_t.ptr</a> pointers of the array items and the memory for the <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> array itself are allocated by using the <a class="el" href="structUcxAllocator.html#a013376172be39ed54f77c4be6898845a" title="The malloc() function for this allocator. ">UcxAllocator.malloc()</a> function.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>the <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a> used for allocating memory </td></tr>
+    <tr><td class="paramname">string</td><td>the string to split </td></tr>
+    <tr><td class="paramname">delim</td><td>the delimiter string </td></tr>
+    <tr><td class="paramname">count</td><td>IN: the maximum size of the resulting array (0 = no limit), OUT: the actual size of the array </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> array containing the split strings or <code>NULL</code> on error</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#aa929984004c3576bfafb95031aca8eb7" title="Splits a string into parts by using a delimiter string. ">sstrsplit()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a9d03be026afa9447c52bb34b9e3b895a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9d03be026afa9447c52bb34b9e3b895a">&#9670;&nbsp;</a></span>sstrstr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sstrstr</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">string, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">match&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="string_8h.html#aa4362cb36c6629f9d8484739fd827748">scstrsstr</a>(string, <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(match))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns a substring starting at the location of the first occurrence of the specified string. </p>
+<p>If the string does not contain the other string, an empty string is returned.</p>
+<p>If <code>match</code> is an empty string, the complete <code>string</code> is returned.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the string to be scanned </td></tr>
+    <tr><td class="paramname">match</td><td>string containing the sequence of characters to match </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a substring starting at the first occurrence of <code>match</code>, or an empty string, if the sequence is not present in <code>string</code> </dd></dl>
+
+</div>
+</div>
+<a id="ac6a5246f26be2e8a5f34d8995b7ec14e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac6a5246f26be2e8a5f34d8995b7ec14e">&#9670;&nbsp;</a></span>sstrsuffix</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sstrsuffix</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">string, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">suffix&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="string_8h.html#a1f0ae316a2afe85d5b4655e6ece6721a">scstrsuffix</a>(<a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(string), <a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(suffix))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Checks, if a string has a specific suffix. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the string to check </td></tr>
+    <tr><td class="paramname">suffix</td><td>the suffix the string should have </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1, if and only if the string has the specified suffix, 0 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a084fe5a3a90d6fb6b15ecda03bb30824"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a084fe5a3a90d6fb6b15ecda03bb30824">&#9670;&nbsp;</a></span>sstrupper</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sstrupper</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">string</td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="string_8h.html#af3dd09ec9d11162fe0075f4e60f41240">scstrupper</a>(<a class="el" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">SCSTR</a>(string))</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns a upper case version of a string. </p>
+<p>This function creates a duplicate of the input string, first (see <a class="el" href="string_8h.html#accbfd2b459a028d7af9fb7df6f977d80" title="Creates a duplicate of the specified string. ">sstrdup()</a>).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the input string </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the resulting upper case string </dd></dl>
+
+</div>
+</div>
+<a id="a5f0dd83c0176b812fb428004b2877a34"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5f0dd83c0176b812fb428004b2877a34">&#9670;&nbsp;</a></span>sstrupper_a</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define sstrupper_a</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">allocator, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">string&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="string_8h.html#aea94613eb74668cc05d365803d32bfad">scstrupper_a</a>(allocator, string)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns a upper case version of a string. </p>
+<p>This function creates a duplicate of the input string, first (see <a class="el" href="string_8h.html#a8d098baada4ea9ad5d8b6343b5aec007" title="Creates a duplicate of the specified string using a UcxAllocator. ">sstrdup_a()</a>).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>the allocator used for duplicating the string </td></tr>
+    <tr><td class="paramname">string</td><td>the input string </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the resulting upper case string </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a2b1d6f1eca1c1549f37107b9c026c5a6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2b1d6f1eca1c1549f37107b9c026c5a6">&#9670;&nbsp;</a></span>scstr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structscstr__t.html">scstr_t</a> scstr </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>cstring</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Creates a new <a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a> based on a constant C string. </p>
+<p>The length is implicitly inferred by using a call to <code>strlen()</code>.</p>
+<p><b>Note:</b> the <a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a> will share the specified pointer to the C string. If you do want a copy, use <a class="el" href="string_8h.html#a97dccce03af419596dbdd592ca46a164" title="Creates a duplicate of the specified string. ">scstrdup()</a> on the return value of this function.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">cstring</td><td>the C string to wrap </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new <a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a> containing the C string</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#ae594f6e222ea394cef6a26c0dfad000d" title="Creates a new scstr_t of the specified length based on a constant C string. ">scstrn()</a> </dd></dl>
+
+</div>
+</div>
+<a id="aca8142fb823d253054e17c17cfca05e0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aca8142fb823d253054e17c17cfca05e0">&#9670;&nbsp;</a></span>scstrcasecmp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int scstrcasecmp </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>s1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>s2</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Compares two UCX strings ignoring the case. </p>
+<p>At first it compares the <a class="el" href="structscstr__t.html#aaa0229f64f1057b6f65adededaa5a172" title="The length of the string. ">scstr_t.length</a> attribute of the two strings. If and only if the lengths match, both strings are compared char by char ignoring the case.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">s1</td><td>the first string </td></tr>
+    <tr><td class="paramname">s2</td><td>the second string </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>-1, if the length of s1 is less than the length of s2 or 1, if the length of s1 is greater than the length of s2 or the result of the platform specific string comparison function ignoring the case. </dd></dl>
+
+</div>
+</div>
+<a id="a3718ef4aa1e86cdb26bda2f07fb585df"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3718ef4aa1e86cdb26bda2f07fb585df">&#9670;&nbsp;</a></span>scstrcaseprefix()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int scstrcaseprefix </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>prefix</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Checks, if a string has a specific prefix, ignoring the case. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the string to check </td></tr>
+    <tr><td class="paramname">prefix</td><td>the prefix the string should have </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1, if and only if the string has the specified prefix, 0 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a6edb4b85f2b9efe79db7ffe6eccd7bc3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6edb4b85f2b9efe79db7ffe6eccd7bc3">&#9670;&nbsp;</a></span>scstrcasesuffix()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int scstrcasesuffix </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>suffix</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Checks, if a string has a specific suffix, ignoring the case. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the string to check </td></tr>
+    <tr><td class="paramname">suffix</td><td>the suffix the string should have </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1, if and only if the string has the specified suffix, 0 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="a7376842c19e954b49215da81ef76ac0c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7376842c19e954b49215da81ef76ac0c">&#9670;&nbsp;</a></span>scstrcat()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> scstrcat </td>
+          <td>(</td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>count</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>s1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><em>...</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Concatenates two or more strings. </p>
+<p>The resulting string will be allocated by standard <code>malloc()</code>. So developers <b>MUST</b> pass the <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0" title="A pointer to the string (not necessarily NULL-terminated) ">sstr_t.ptr</a> to <code>free()</code>.</p>
+<p>The <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0" title="A pointer to the string (not necessarily NULL-terminated) ">sstr_t.ptr</a> of the return value will <em>always</em> be <code>NULL</code>- terminated.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">count</td><td>the total number of strings to concatenate </td></tr>
+    <tr><td class="paramname">s1</td><td>first string </td></tr>
+    <tr><td class="paramname">...</td><td>all remaining strings </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the concatenated string </dd></dl>
+
+</div>
+</div>
+<a id="abacce4cbd6f70fcb6453904ef08b02e9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abacce4cbd6f70fcb6453904ef08b02e9">&#9670;&nbsp;</a></span>scstrcat_a()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> scstrcat_a </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>alloc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>count</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>s1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><em>...</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Concatenates two or more strings using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>. </p>
+<p>The resulting string must be freed by the allocators <code>free()</code> implementation.</p>
+<p>The <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0" title="A pointer to the string (not necessarily NULL-terminated) ">sstr_t.ptr</a> of the return value will <em>always</em> be <code>NULL</code>- terminated.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">alloc</td><td>the allocator to use </td></tr>
+    <tr><td class="paramname">count</td><td>the total number of strings to concatenate </td></tr>
+    <tr><td class="paramname">s1</td><td>first string </td></tr>
+    <tr><td class="paramname">...</td><td>all remaining strings </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the concatenated string</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#a7376842c19e954b49215da81ef76ac0c" title="Concatenates two or more strings. ">scstrcat()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a5836d6a7a744791c35e5c17bdc394a87"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5836d6a7a744791c35e5c17bdc394a87">&#9670;&nbsp;</a></span>scstrchr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structscstr__t.html">scstr_t</a> scstrchr </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>chr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns an immutable substring starting at the location of the first occurrence of the specified character. </p>
+<p>If the string does not contain the character, an empty string is returned.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the string where to locate the character </td></tr>
+    <tr><td class="paramname">chr</td><td>the character to locate </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a substring starting at the first location of <code>chr</code></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#a9a6c8d8db0dda0037c3c852cce1a5060" title="Returns a substring of an immutable string starting at the specified location. ">scstrsubs()</a> </dd></dl>
+
+</div>
+</div>
+<a id="af35272a8e5408c88ed3e25a3a98f0a82"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af35272a8e5408c88ed3e25a3a98f0a82">&#9670;&nbsp;</a></span>scstrcmp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int scstrcmp </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>s1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>s2</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Compares two UCX strings with standard <code>memcmp()</code>. </p>
+<p>At first it compares the <a class="el" href="structscstr__t.html#aaa0229f64f1057b6f65adededaa5a172" title="The length of the string. ">scstr_t.length</a> attribute of the two strings. The <code>memcmp()</code> function is called, if and only if the lengths match.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">s1</td><td>the first string </td></tr>
+    <tr><td class="paramname">s2</td><td>the second string </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>-1, if the length of s1 is less than the length of s2 or 1, if the length of s1 is greater than the length of s2 or the result of <code>memcmp()</code> otherwise (i.e. 0 if the strings match) </dd></dl>
+
+</div>
+</div>
+<a id="a97dccce03af419596dbdd592ca46a164"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a97dccce03af419596dbdd592ca46a164">&#9670;&nbsp;</a></span>scstrdup()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> scstrdup </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Creates a duplicate of the specified string. </p>
+<p>The new <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> will contain a copy allocated by standard <code>malloc()</code>. So developers <b>MUST</b> pass the <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0" title="A pointer to the string (not necessarily NULL-terminated) ">sstr_t.ptr</a> to <code>free()</code>.</p>
+<p>The <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0" title="A pointer to the string (not necessarily NULL-terminated) ">sstr_t.ptr</a> of the return value will <em>always</em> be <code>NULL</code>- terminated and mutable, regardless of the argument.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the string to duplicate </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a duplicate of the string </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#a8fe58921f51eb1fde038472377e63014" title="Creates a duplicate of the specified string using a UcxAllocator. ">scstrdup_a()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a8fe58921f51eb1fde038472377e63014"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8fe58921f51eb1fde038472377e63014">&#9670;&nbsp;</a></span>scstrdup_a()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> scstrdup_a </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Creates a duplicate of the specified string using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>. </p>
+<p>The new <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> will contain a copy allocated by the allocators <a class="el" href="structUcxAllocator.html#a013376172be39ed54f77c4be6898845a" title="The malloc() function for this allocator. ">UcxAllocator.malloc()</a> function. So it is implementation depended, whether the returned <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0" title="A pointer to the string (not necessarily NULL-terminated) ">sstr_t.ptr</a> pointer must be passed to the allocators <a class="el" href="structUcxAllocator.html#aecce1840378ed53f1002190f4f87026f" title="The free() function for this allocator. ">UcxAllocator.free()</a> function manually.</p>
+<p>The <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0" title="A pointer to the string (not necessarily NULL-terminated) ">sstr_t.ptr</a> of the return value will <em>always</em> be <code>NULL</code>- terminated and mutable, regardless of the argument.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>a valid instance of a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a> </td></tr>
+    <tr><td class="paramname">string</td><td>the string to duplicate </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a duplicate of the string </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#a97dccce03af419596dbdd592ca46a164" title="Creates a duplicate of the specified string. ">scstrdup()</a> </dd></dl>
+
+</div>
+</div>
+<a id="abccf198bea3186ff2abb080cc88dcae6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abccf198bea3186ff2abb080cc88dcae6">&#9670;&nbsp;</a></span>scstrlower()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> scstrlower </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns a lower case version of a string. </p>
+<p>This function creates a duplicate of the input string, first (see <a class="el" href="string_8h.html#a97dccce03af419596dbdd592ca46a164" title="Creates a duplicate of the specified string. ">scstrdup()</a>).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the input string </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the resulting lower case string </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#a97dccce03af419596dbdd592ca46a164" title="Creates a duplicate of the specified string. ">scstrdup()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a3cf1e557df7ab58d03c78832c4060276"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3cf1e557df7ab58d03c78832c4060276">&#9670;&nbsp;</a></span>scstrlower_a()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> scstrlower_a </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns a lower case version of a string. </p>
+<p>This function creates a duplicate of the input string, first (see <a class="el" href="string_8h.html#a8fe58921f51eb1fde038472377e63014" title="Creates a duplicate of the specified string using a UcxAllocator. ">scstrdup_a()</a>).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>the allocator used for duplicating the string </td></tr>
+    <tr><td class="paramname">string</td><td>the input string </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the resulting lower case string </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#a8fe58921f51eb1fde038472377e63014" title="Creates a duplicate of the specified string using a UcxAllocator. ">scstrdup_a()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ae594f6e222ea394cef6a26c0dfad000d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae594f6e222ea394cef6a26c0dfad000d">&#9670;&nbsp;</a></span>scstrn()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structscstr__t.html">scstr_t</a> scstrn </td>
+          <td>(</td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>cstring</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>length</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Creates a new <a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a> of the specified length based on a constant C string. </p>
+<p><b>Note:</b> the <a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a> will share the specified pointer to the C string. If you do want a copy, use <a class="el" href="string_8h.html#a97dccce03af419596dbdd592ca46a164" title="Creates a duplicate of the specified string. ">scstrdup()</a> on the return value of this function. *</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">cstring</td><td>the C string to wrap </td></tr>
+    <tr><td class="paramname">length</td><td>the length of the string </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new <a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a> containing the C string</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#a2b1d6f1eca1c1549f37107b9c026c5a6" title="Creates a new scstr_t based on a constant C string. ">scstr()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ac1b000030d6d197eec48c15a182055d5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac1b000030d6d197eec48c15a182055d5">&#9670;&nbsp;</a></span>scstrnlen()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t scstrnlen </td>
+          <td>(</td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>count</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><em>...</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns the accumulated length of all specified strings. </p>
+<p><b>Attention:</b> if the count argument is larger than the count of the specified strings, the behavior is undefined.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">count</td><td>the total number of specified strings </td></tr>
+    <tr><td class="paramname">...</td><td>all strings </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the accumulated length of all strings </dd></dl>
+
+</div>
+</div>
+<a id="a599ddc2f88dd1df68b72eefd91347393"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a599ddc2f88dd1df68b72eefd91347393">&#9670;&nbsp;</a></span>scstrprefix()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int scstrprefix </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>prefix</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Checks, if a string has a specific prefix. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the string to check </td></tr>
+    <tr><td class="paramname">prefix</td><td>the prefix the string should have </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1, if and only if the string has the specified prefix, 0 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ae389835b97cd9382e7d6a6a075323376"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae389835b97cd9382e7d6a6a075323376">&#9670;&nbsp;</a></span>scstrrchr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structscstr__t.html">scstr_t</a> scstrrchr </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>chr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns an immutable substring starting at the location of the last occurrence of the specified character. </p>
+<p>If the string does not contain the character, an empty string is returned.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the string where to locate the character </td></tr>
+    <tr><td class="paramname">chr</td><td>the character to locate </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a substring starting at the last location of <code>chr</code></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#a9a6c8d8db0dda0037c3c852cce1a5060" title="Returns a substring of an immutable string starting at the specified location. ">scstrsubs()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a54f256c3abe811c52d58b4ff1b23f051"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a54f256c3abe811c52d58b4ff1b23f051">&#9670;&nbsp;</a></span>scstrscstr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structscstr__t.html">scstr_t</a> scstrscstr </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>match</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns an immutable substring starting at the location of the first occurrence of the specified immutable string. </p>
+<p>If the string does not contain the other string, an empty string is returned.</p>
+<p>If <code>match</code> is an empty string, the complete <code>string</code> is returned.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the string to be scanned </td></tr>
+    <tr><td class="paramname">match</td><td>string containing the sequence of characters to match </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a substring starting at the first occurrence of <code>match</code>, or an empty string, if the sequence is not present in <code>string</code> </dd></dl>
+
+</div>
+</div>
+<a id="ae71cac352b00230848bde358f0fb05ea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae71cac352b00230848bde358f0fb05ea">&#9670;&nbsp;</a></span>scstrsplit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a>* scstrsplit </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>delim</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">ssize_t *&#160;</td>
+          <td class="paramname"><em>count</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Splits a string into parts by using a delimiter string. </p>
+<p>This function will return <code>NULL</code>, if one of the following happens: </p><ul>
+<li>
+the string length is zero </li>
+<li>
+the delimeter length is zero </li>
+<li>
+the string equals the delimeter </li>
+<li>
+memory allocation fails </li>
+</ul>
+<p>The integer referenced by <code>count</code> is used as input and determines the maximum size of the resulting array, i.e. the maximum count of splits to perform + 1.</p>
+<p>The integer referenced by <code>count</code> is also used as output and is set to </p><ul>
+<li>
+-2, on memory allocation errors </li>
+<li>
+-1, if either the string or the delimiter is an empty string </li>
+<li>
+0, if the string equals the delimiter </li>
+<li>
+1, if the string does not contain the delimiter </li>
+<li>
+the count of array items, otherwise </li>
+</ul>
+<p>If the string starts with the delimiter, the first item of the resulting array will be an empty string.</p>
+<p>If the string ends with the delimiter and the maximum list size is not exceeded, the last array item will be an empty string. In case the list size would be exceeded, the last array item will be the remaining string after the last split, <em>including</em> the terminating delimiter.</p>
+<p><b>Attention:</b> The array pointer <b>AND</b> all <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0" title="A pointer to the string (not necessarily NULL-terminated) ">sstr_t.ptr</a> of the array items must be manually passed to <code>free()</code>. Use <a class="el" href="string_8h.html#a52906455ae530c9cdc6812c8e6d9bdef" title="Performing scstrsplit() using a UcxAllocator. ">scstrsplit_a()</a> with an allocator to managed memory, to avoid this.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the string to split </td></tr>
+    <tr><td class="paramname">delim</td><td>the delimiter string </td></tr>
+    <tr><td class="paramname">count</td><td>IN: the maximum size of the resulting array (0 = no limit), OUT: the actual size of the array </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> array containing the split strings or <code>NULL</code> on error</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#a52906455ae530c9cdc6812c8e6d9bdef" title="Performing scstrsplit() using a UcxAllocator. ">scstrsplit_a()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a52906455ae530c9cdc6812c8e6d9bdef"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a52906455ae530c9cdc6812c8e6d9bdef">&#9670;&nbsp;</a></span>scstrsplit_a()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a>* scstrsplit_a </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>delim</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">ssize_t *&#160;</td>
+          <td class="paramname"><em>count</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Performing <a class="el" href="string_8h.html#ae71cac352b00230848bde358f0fb05ea" title="Splits a string into parts by using a delimiter string. ">scstrsplit()</a> using a <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a>. </p>
+<p><em>Read the description of <a class="el" href="string_8h.html#ae71cac352b00230848bde358f0fb05ea" title="Splits a string into parts by using a delimiter string. ">scstrsplit()</a> for details.</em></p>
+<p>The memory for the <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0" title="A pointer to the string (not necessarily NULL-terminated) ">sstr_t.ptr</a> pointers of the array items and the memory for the <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> array itself are allocated by using the <a class="el" href="structUcxAllocator.html#a013376172be39ed54f77c4be6898845a" title="The malloc() function for this allocator. ">UcxAllocator.malloc()</a> function.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>the <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a> used for allocating memory </td></tr>
+    <tr><td class="paramname">string</td><td>the string to split </td></tr>
+    <tr><td class="paramname">delim</td><td>the delimiter string </td></tr>
+    <tr><td class="paramname">count</td><td>IN: the maximum size of the resulting array (0 = no limit), OUT: the actual size of the array </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> array containing the split strings or <code>NULL</code> on error</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#ae71cac352b00230848bde358f0fb05ea" title="Splits a string into parts by using a delimiter string. ">scstrsplit()</a> </dd></dl>
+
+</div>
+</div>
+<a id="aa4362cb36c6629f9d8484739fd827748"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa4362cb36c6629f9d8484739fd827748">&#9670;&nbsp;</a></span>scstrsstr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> scstrsstr </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>match</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns a substring starting at the location of the first occurrence of the specified string. </p>
+<p>If the string does not contain the other string, an empty string is returned.</p>
+<p>If <code>match</code> is an empty string, the complete <code>string</code> is returned.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the string to be scanned </td></tr>
+    <tr><td class="paramname">match</td><td>string containing the sequence of characters to match </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a substring starting at the first occurrence of <code>match</code>, or an empty string, if the sequence is not present in <code>string</code> </dd></dl>
+
+</div>
+</div>
+<a id="a9a6c8d8db0dda0037c3c852cce1a5060"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9a6c8d8db0dda0037c3c852cce1a5060">&#9670;&nbsp;</a></span>scstrsubs()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structscstr__t.html">scstr_t</a> scstrsubs </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>start</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns a substring of an immutable string starting at the specified location. </p>
+<p><b>Attention:</b> the new string references the same memory area as the input string and is <b>NOT</b> required to be <code>NULL</code>-terminated. Use <a class="el" href="string_8h.html#a97dccce03af419596dbdd592ca46a164" title="Creates a duplicate of the specified string. ">scstrdup()</a> to get a copy.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>input string </td></tr>
+    <tr><td class="paramname">start</td><td>start location of the substring </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a substring of <code>string</code> starting at <code>start</code></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#ad50f0f67b906fad0744f46bcb51e144b" title="Returns a substring of an immutable string with a maximum length starting at the specified location...">scstrsubsl()</a> </dd>
+<dd>
+<a class="el" href="string_8h.html#a5836d6a7a744791c35e5c17bdc394a87" title="Returns an immutable substring starting at the location of the first occurrence of the specified char...">scstrchr()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ad50f0f67b906fad0744f46bcb51e144b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad50f0f67b906fad0744f46bcb51e144b">&#9670;&nbsp;</a></span>scstrsubsl()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structscstr__t.html">scstr_t</a> scstrsubsl </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>start</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>length</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns a substring of an immutable string with a maximum length starting at the specified location. </p>
+<p><b>Attention:</b> the new string references the same memory area as the input string and is <b>NOT</b> required to be <code>NULL</code>-terminated. Use <a class="el" href="string_8h.html#a97dccce03af419596dbdd592ca46a164" title="Creates a duplicate of the specified string. ">scstrdup()</a> to get a copy.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>input string </td></tr>
+    <tr><td class="paramname">start</td><td>start location of the substring </td></tr>
+    <tr><td class="paramname">length</td><td>the maximum length of the substring </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a substring of <code>string</code> starting at <code>start</code> with a maximum length of <code>length</code></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#a9a6c8d8db0dda0037c3c852cce1a5060" title="Returns a substring of an immutable string starting at the specified location. ">scstrsubs()</a> </dd>
+<dd>
+<a class="el" href="string_8h.html#a5836d6a7a744791c35e5c17bdc394a87" title="Returns an immutable substring starting at the location of the first occurrence of the specified char...">scstrchr()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a1f0ae316a2afe85d5b4655e6ece6721a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1f0ae316a2afe85d5b4655e6ece6721a">&#9670;&nbsp;</a></span>scstrsuffix()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int scstrsuffix </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>suffix</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Checks, if a string has a specific suffix. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the string to check </td></tr>
+    <tr><td class="paramname">suffix</td><td>the suffix the string should have </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1, if and only if the string has the specified suffix, 0 otherwise </dd></dl>
+
+</div>
+</div>
+<a id="ad374b16eb1be8b48019debad9b9f268c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad374b16eb1be8b48019debad9b9f268c">&#9670;&nbsp;</a></span>scstrtrim()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structscstr__t.html">scstr_t</a> scstrtrim </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Omits leading and trailing spaces. </p>
+<p>This function returns a new <a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a> containing a trimmed version of the specified string.</p>
+<p><b>Note:</b> the new <a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a> references the same memory, thus you <b>MUST NOT</b> pass the <a class="el" href="structscstr__t.html#a305fd48934b474a9bf4a40869030e391" title="A constant pointer to the immutable string (not necessarily NULL-terminated) ">scstr_t.ptr</a> of the return value to <code>free()</code>. It is also highly recommended to avoid assignments like <code>mystr = scstrtrim(mystr);</code> as you lose the reference to the source string. Assignments of this type are only permitted, if the <a class="el" href="structscstr__t.html#a305fd48934b474a9bf4a40869030e391" title="A constant pointer to the immutable string (not necessarily NULL-terminated) ">scstr_t.ptr</a> of the source string does not need to be freed or if another reference to the source string exists.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the string that shall be trimmed </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new <a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a> containing the trimmed string </dd></dl>
+
+</div>
+</div>
+<a id="af3dd09ec9d11162fe0075f4e60f41240"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af3dd09ec9d11162fe0075f4e60f41240">&#9670;&nbsp;</a></span>scstrupper()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> scstrupper </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns a upper case version of a string. </p>
+<p>This function creates a duplicate of the input string, first (see <a class="el" href="string_8h.html#a97dccce03af419596dbdd592ca46a164" title="Creates a duplicate of the specified string. ">scstrdup()</a>).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the input string </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the resulting upper case string </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#a97dccce03af419596dbdd592ca46a164" title="Creates a duplicate of the specified string. ">scstrdup()</a> </dd></dl>
+
+</div>
+</div>
+<a id="aea94613eb74668cc05d365803d32bfad"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aea94613eb74668cc05d365803d32bfad">&#9670;&nbsp;</a></span>scstrupper_a()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> scstrupper_a </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns a upper case version of a string. </p>
+<p>This function creates a duplicate of the input string, first (see <a class="el" href="string_8h.html#a8fe58921f51eb1fde038472377e63014" title="Creates a duplicate of the specified string using a UcxAllocator. ">scstrdup_a()</a>).</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>the allocator used for duplicating the string </td></tr>
+    <tr><td class="paramname">string</td><td>the input string </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the resulting upper case string </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#a8fe58921f51eb1fde038472377e63014" title="Creates a duplicate of the specified string using a UcxAllocator. ">scstrdup_a()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a539eb7059251a051ee5d179526a23e9a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a539eb7059251a051ee5d179526a23e9a">&#9670;&nbsp;</a></span>sstr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> sstr </td>
+          <td>(</td>
+          <td class="paramtype">char *&#160;</td>
+          <td class="paramname"><em>cstring</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Creates a new <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> based on a C string. </p>
+<p>The length is implicitly inferred by using a call to <code>strlen()</code>.</p>
+<p><b>Note:</b> the <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> will share the specified pointer to the C string. If you do want a copy, use <a class="el" href="string_8h.html#accbfd2b459a028d7af9fb7df6f977d80" title="Creates a duplicate of the specified string. ">sstrdup()</a> on the return value of this function.</p>
+<p>If you need to wrap a constant string, use <a class="el" href="string_8h.html#a2b1d6f1eca1c1549f37107b9c026c5a6" title="Creates a new scstr_t based on a constant C string. ">scstr()</a>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">cstring</td><td>the C string to wrap </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> containing the C string</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#a2744c38ac44abf3e01fa059056dcf36c" title="Creates a new sstr_t of the specified length based on a C string. ">sstrn()</a> </dd></dl>
+
+</div>
+</div>
+<a id="af80898a0b75955eb2579298c3ae2c481"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af80898a0b75955eb2579298c3ae2c481">&#9670;&nbsp;</a></span>sstrchr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> sstrchr </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>chr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns a substring starting at the location of the first occurrence of the specified character. </p>
+<p>If the string does not contain the character, an empty string is returned.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the string where to locate the character </td></tr>
+    <tr><td class="paramname">chr</td><td>the character to locate </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a substring starting at the first location of <code>chr</code></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#a5eb9e0e1f26cf7fbecc038cd90e8b258" title="Returns a substring starting at the specified location. ">sstrsubs()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a2744c38ac44abf3e01fa059056dcf36c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2744c38ac44abf3e01fa059056dcf36c">&#9670;&nbsp;</a></span>sstrn()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> sstrn </td>
+          <td>(</td>
+          <td class="paramtype">char *&#160;</td>
+          <td class="paramname"><em>cstring</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>length</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Creates a new <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> of the specified length based on a C string. </p>
+<p><b>Note:</b> the <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> will share the specified pointer to the C string. If you do want a copy, use <a class="el" href="string_8h.html#accbfd2b459a028d7af9fb7df6f977d80" title="Creates a duplicate of the specified string. ">sstrdup()</a> on the return value of this function.</p>
+<p>If you need to wrap a constant string, use <a class="el" href="string_8h.html#ae594f6e222ea394cef6a26c0dfad000d" title="Creates a new scstr_t of the specified length based on a constant C string. ">scstrn()</a>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">cstring</td><td>the C string to wrap </td></tr>
+    <tr><td class="paramname">length</td><td>the length of the string </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> containing the C string</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#a539eb7059251a051ee5d179526a23e9a" title="Creates a new sstr_t based on a C string. ">sstr()</a> </dd>
+<dd>
+<a class="el" href="string_8h.html#a8fa17c8cf4c36df48f4108c36da8573e" title="Shortcut for the conversion of a C string to a sstr_t. ">S()</a> </dd></dl>
+
+</div>
+</div>
+<a id="adae3f59957ca328e1da5285cb8b02a72"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adae3f59957ca328e1da5285cb8b02a72">&#9670;&nbsp;</a></span>sstrrchr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> sstrrchr </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int&#160;</td>
+          <td class="paramname"><em>chr</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns a substring starting at the location of the last occurrence of the specified character. </p>
+<p>If the string does not contain the character, an empty string is returned.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the string where to locate the character </td></tr>
+    <tr><td class="paramname">chr</td><td>the character to locate </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a substring starting at the last location of <code>chr</code></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#a5eb9e0e1f26cf7fbecc038cd90e8b258" title="Returns a substring starting at the specified location. ">sstrsubs()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a5eb9e0e1f26cf7fbecc038cd90e8b258"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5eb9e0e1f26cf7fbecc038cd90e8b258">&#9670;&nbsp;</a></span>sstrsubs()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> sstrsubs </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>start</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns a substring starting at the specified location. </p>
+<p><b>Attention:</b> the new string references the same memory area as the input string and is <b>NOT</b> required to be <code>NULL</code>-terminated. Use <a class="el" href="string_8h.html#accbfd2b459a028d7af9fb7df6f977d80" title="Creates a duplicate of the specified string. ">sstrdup()</a> to get a copy.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>input string </td></tr>
+    <tr><td class="paramname">start</td><td>start location of the substring </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a substring of <code>string</code> starting at <code>start</code></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#a78925c91af54f23cebd20ff99ef4331a" title="Returns a substring with the given length starting at the specified location. ">sstrsubsl()</a> </dd>
+<dd>
+<a class="el" href="string_8h.html#af80898a0b75955eb2579298c3ae2c481" title="Returns a substring starting at the location of the first occurrence of the specified character...">sstrchr()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a78925c91af54f23cebd20ff99ef4331a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a78925c91af54f23cebd20ff99ef4331a">&#9670;&nbsp;</a></span>sstrsubsl()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> sstrsubsl </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>start</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>length</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Returns a substring with the given length starting at the specified location. </p>
+<p><b>Attention:</b> the new string references the same memory area as the input string and is <b>NOT</b> required to be <code>NULL</code>-terminated. Use <a class="el" href="string_8h.html#accbfd2b459a028d7af9fb7df6f977d80" title="Creates a duplicate of the specified string. ">sstrdup()</a> to get a copy.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>input string </td></tr>
+    <tr><td class="paramname">start</td><td>start location of the substring </td></tr>
+    <tr><td class="paramname">length</td><td>the maximum length of the substring </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a substring of <code>string</code> starting at <code>start</code> with a maximum length of <code>length</code></dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="string_8h.html#a5eb9e0e1f26cf7fbecc038cd90e8b258" title="Returns a substring starting at the specified location. ">sstrsubs()</a> </dd>
+<dd>
+<a class="el" href="string_8h.html#af80898a0b75955eb2579298c3ae2c481" title="Returns a substring starting at the location of the first occurrence of the specified character...">sstrchr()</a> </dd></dl>
+
+</div>
+</div>
+<a id="ae2d6da564d3fce51f2e0cac580fdbc56"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae2d6da564d3fce51f2e0cac580fdbc56">&#9670;&nbsp;</a></span>sstrtrim()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> sstrtrim </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td>
+          <td class="paramname"><em>string</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Omits leading and trailing spaces. </p>
+<p>This function returns a new <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> containing a trimmed version of the specified string.</p>
+<p><b>Note:</b> the new <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> references the same memory, thus you <b>MUST NOT</b> pass the <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0" title="A pointer to the string (not necessarily NULL-terminated) ">sstr_t.ptr</a> of the return value to <code>free()</code>. It is also highly recommended to avoid assignments like <code>mystr = sstrtrim(mystr);</code> as you lose the reference to the source string. Assignments of this type are only permitted, if the <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0" title="A pointer to the string (not necessarily NULL-terminated) ">sstr_t.ptr</a> of the source string does not need to be freed or if another reference to the source string exists.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">string</td><td>the string that shall be trimmed </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a new <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> containing the trimmed string </dd></dl>
+
+</div>
+</div>
+<a id="a69d5e3eeec783cc43314df71248768f5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a69d5e3eeec783cc43314df71248768f5">&#9670;&nbsp;</a></span>ucx_sc2sc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structscstr__t.html">scstr_t</a> ucx_sc2sc </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structscstr__t.html">scstr_t</a>&#160;</td>
+          <td class="paramname"><em>str</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>One of two type adjustment functions that return an <a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a>. </p>
+<p>Used <b>internally</b> to convert a UCX string to an immutable UCX string. This variant is used, when the string is already immutable and no operation needs to be performed.</p>
+<p><b>Do not use this function manually.</b></p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">str</td><td>some <a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a> </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the argument itself </dd></dl>
+
+</div>
+</div>
+<a id="aedeb5d7bddda54116101a8d68af8c56d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aedeb5d7bddda54116101a8d68af8c56d">&#9670;&nbsp;</a></span>ucx_ss2c_s()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structscstr__t.html">scstr_t</a> ucx_ss2c_s </td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Converts a UCX string to an immutable UCX string (<a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a>). </p>
+<p>This <b>internal</b> function (ab)uses the C standard an expects one single argument which is then implicitly converted to <a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a> without a warning.</p>
+<p><b>Do not use this function manually.</b></p>
+<dl class="section return"><dt>Returns</dt><dd>the an immutable version of the provided string </dd></dl>
+
+</div>
+</div>
+<a id="a9ce5ad1b2aa2dbeba204d452c2e64359"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9ce5ad1b2aa2dbeba204d452c2e64359">&#9670;&nbsp;</a></span>ucx_ss2sc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structscstr__t.html">scstr_t</a> ucx_ss2sc </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td>
+          <td class="paramname"><em>str</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>One of two type adjustment functions that return an <a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a>. </p>
+<p>Used <b>internally</b> to convert a UCX string to an immutable UCX string.</p>
+<p><b>Do not use this function manually.</b></p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">str</td><td>some <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>an immutable (<a class="el" href="structscstr__t.html" title="The UCX string structure for immutable (constant) strings. ">scstr_t</a>) version of the provided string. </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/string_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,124 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/string.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">string.h</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a href="string_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment"> * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"> * Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment"> * modification, are permitted provided that the following conditions are met:</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> *   1. Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> *   2. Redistributions in binary form must reproduce the above copyright</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer in the</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment"> *      documentation and/or other materials provided with the distribution.</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment"> * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment"> * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment"> * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"> * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment"> * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment"> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment"> * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE</span></div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> * POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;<span class="preprocessor">#ifndef UCX_STRING_H</span></div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;<span class="preprocessor">#define UCX_STRING_H</span></div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ucx_8h.html">ucx.h</a>&quot;</span></div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="allocator_8h.html">allocator.h</a>&quot;</span></div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;<span class="preprocessor">#include &lt;stddef.h&gt;</span></div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;<span class="comment"> * Use this macro to disable the shortcuts if you experience macro collision.</span></div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;<span class="preprocessor">#ifndef UCX_NO_SSTR_SHORTCUTS</span></div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;</div><div class="line"><a name="l00063"></a><span class="lineno"><a class="line" href="string_8h.html#a9037956cca97a4e84b642f17f3d10378">   63</a></span>&#160;<span class="preprocessor">#define ST(s) { s, sizeof(s)-1 }</span></div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;</div><div class="line"><a name="l00066"></a><span class="lineno"><a class="line" href="string_8h.html#a8fa17c8cf4c36df48f4108c36da8573e">   66</a></span>&#160;<span class="preprocessor">#define S(s) sstrn(s, sizeof(s)-1)</span></div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;</div><div class="line"><a name="l00069"></a><span class="lineno"><a class="line" href="string_8h.html#a7d261dd0bc358c957a368bc058c1ce53">   69</a></span>&#160;<span class="preprocessor">#define SC(s) scstrn(s, sizeof(s)-1)</span></div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* UCX_NO_SSTR_SHORTCUTS */</span><span class="preprocessor"></span></div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;</div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;<span class="comment"> * Use this macro to disable the format macros.</span></div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;<span class="preprocessor">#ifndef UCX_NO_SSTR_FORMAT_MACROS</span></div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;</div><div class="line"><a name="l00077"></a><span class="lineno"><a class="line" href="string_8h.html#a23ed51e87385886bb65e8cd19c839362">   77</a></span>&#160;<span class="preprocessor">#define SFMT(s) (int) (s).length, (s).ptr</span></div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;</div><div class="line"><a name="l00080"></a><span class="lineno"><a class="line" href="string_8h.html#a7d5bc48708405a28b23667e32dfcecae">   80</a></span>&#160;<span class="preprocessor">#define PRIsstr &quot;.*s&quot;</span></div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* UCX_NO_SSTR_FORMAT_MACROS */</span><span class="preprocessor"></span></div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;</div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;  </div><div class="line"><a name="l00090"></a><span class="lineno"><a class="line" href="structsstr__t.html">   90</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span>{</div><div class="line"><a name="l00093"></a><span class="lineno"><a class="line" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0">   93</a></span>&#160;    <span class="keywordtype">char</span> *<a class="code" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0">ptr</a>;</div><div class="line"><a name="l00095"></a><span class="lineno"><a class="line" href="structsstr__t.html#a5cf571708cdff92e45f08458f2b98229">   95</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="structsstr__t.html#a5cf571708cdff92e45f08458f2b98229">length</a>;</div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;} <a class="code" href="structsstr__t.html">sstr_t</a>;</div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;</div><div class="line"><a name="l00101"></a><span class="lineno"><a class="line" href="structscstr__t.html">  101</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span>{</div><div class="line"><a name="l00104"></a><span class="lineno"><a class="line" href="structscstr__t.html#a305fd48934b474a9bf4a40869030e391">  104</a></span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structscstr__t.html#a305fd48934b474a9bf4a40869030e391">ptr</a>;</div><div class="line"><a name="l00106"></a><span class="lineno"><a class="line" href="structscstr__t.html#aaa0229f64f1057b6f65adededaa5a172">  106</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="structscstr__t.html#aaa0229f64f1057b6f65adededaa5a172">length</a>;</div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;} <a class="code" href="structscstr__t.html">scstr_t</a>;</div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;}</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;</div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;</div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;<span class="keyword">inline</span> <a class="code" href="structscstr__t.html">scstr_t</a> s2scstr(<a class="code" href="structsstr__t.html">sstr_t</a> s) {</div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;    <a class="code" href="structscstr__t.html">scstr_t</a> c;</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;    c.<a class="code" href="structscstr__t.html#a305fd48934b474a9bf4a40869030e391">ptr</a> = s.<a class="code" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0">ptr</a>;</div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;    c.<a class="code" href="structscstr__t.html#aaa0229f64f1057b6f65adededaa5a172">length</a> = s.<a class="code" href="structsstr__t.html#a5cf571708cdff92e45f08458f2b98229">length</a>;</div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;    <span class="keywordflow">return</span> c;</div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;}</div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;</div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;<span class="keyword">inline</span> <a class="code" href="structscstr__t.html">scstr_t</a> s2scstr(<a class="code" href="structscstr__t.html">scstr_t</a> str) {</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;    <span class="keywordflow">return</span> str;</div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;}</div><div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;<span class="preprocessor">#define SCSTR(s) s2scstr(s)</span></div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;</div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;<a class="code" href="structscstr__t.html">scstr_t</a> <a class="code" href="string_8h.html#a69d5e3eeec783cc43314df71248768f5">ucx_sc2sc</a>(<a class="code" href="structscstr__t.html">scstr_t</a> str);</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;</div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;<a class="code" href="structscstr__t.html">scstr_t</a> <a class="code" href="string_8h.html#a9ce5ad1b2aa2dbeba204d452c2e64359">ucx_ss2sc</a>(<a class="code" href="structsstr__t.html">sstr_t</a> str);</div><div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;</div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;<span class="preprocessor">#if __STDC_VERSION__ &gt;= 201112L</span></div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;</div><div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;<span class="preprocessor">#define SCSTR(str) _Generic(str, sstr_t: ucx_ss2sc, scstr_t: ucx_sc2sc)(str)</span></div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;</div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;<span class="preprocessor">#elif defined(__GNUC__) || defined(__clang__)</span></div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;</div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;<span class="preprocessor">#define SCSTR(str) __builtin_choose_expr( \</span></div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;<span class="preprocessor">        __builtin_types_compatible_p(typeof(str), sstr_t), \</span></div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;<span class="preprocessor">        ucx_ss2sc, \</span></div><div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;<span class="preprocessor">        ucx_sc2sc)(str)</span></div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;</div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;<span class="preprocessor">#elif defined(__sun)</span></div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;</div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;<span class="preprocessor">#define SCSTR(str) ({typeof(str) ucx_tmp_var_str = str; \</span></div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;<span class="preprocessor">    scstr_t ucx_tmp_var_c; \</span></div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;<span class="preprocessor">    ucx_tmp_var_c.ptr = ucx_tmp_var_str.ptr;\</span></div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;<span class="preprocessor">    ucx_tmp_var_c.length = ucx_tmp_var_str.length;\</span></div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;<span class="preprocessor">    ucx_tmp_var_c; })</span></div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;<span class="preprocessor">#else </span><span class="comment">/* no generics and no builtins */</span><span class="preprocessor"></span></div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;</div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;<a class="code" href="structscstr__t.html">scstr_t</a> <a class="code" href="string_8h.html#aedeb5d7bddda54116101a8d68af8c56d">ucx_ss2c_s</a>();</div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;</div><div class="line"><a name="l00233"></a><span class="lineno"><a class="line" href="string_8h.html#ad4293350a9b39a23a6546bd0fef2aeed">  233</a></span>&#160;<span class="preprocessor">#define SCSTR(str) ucx_ss2c_s(str)</span></div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* C11 feature test */</span><span class="preprocessor"></span></div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;</div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* C++ */</span><span class="preprocessor"></span></div><div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;</div><div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;</div><div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;</div><div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;<a class="code" href="structsstr__t.html">sstr_t</a> <a class="code" href="string_8h.html#a539eb7059251a051ee5d179526a23e9a">sstr</a>(<span class="keywordtype">char</span> *cstring);</div><div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;</div><div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;<a class="code" href="structsstr__t.html">sstr_t</a> <a class="code" href="string_8h.html#a2744c38ac44abf3e01fa059056dcf36c">sstrn</a>(<span class="keywordtype">char</span> *cstring, <span class="keywordtype">size_t</span> length);</div><div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;</div><div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;<a class="code" href="structscstr__t.html">scstr_t</a> <a class="code" href="string_8h.html#a2b1d6f1eca1c1549f37107b9c026c5a6">scstr</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *cstring);</div><div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;</div><div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;</div><div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;<a class="code" href="structscstr__t.html">scstr_t</a> <a class="code" href="string_8h.html#ae594f6e222ea394cef6a26c0dfad000d">scstrn</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *cstring, <span class="keywordtype">size_t</span> length);</div><div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;</div><div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;<span class="keywordtype">size_t</span> <a class="code" href="string_8h.html#ac1b000030d6d197eec48c15a182055d5">scstrnlen</a>(<span class="keywordtype">size_t</span> count, ...);</div><div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;</div><div class="line"><a name="l00329"></a><span class="lineno"><a class="line" href="string_8h.html#a33fa945acc5ac2ce962e5ef13cf1638c">  329</a></span>&#160;<span class="preprocessor">#define sstrnlen(count, ...) scstrnlen(count, __VA_ARGS__)</span></div><div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;</div><div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;<a class="code" href="structsstr__t.html">sstr_t</a> <a class="code" href="string_8h.html#a7376842c19e954b49215da81ef76ac0c">scstrcat</a>(<span class="keywordtype">size_t</span> count, <a class="code" href="structscstr__t.html">scstr_t</a> s1, ...);</div><div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;</div><div class="line"><a name="l00361"></a><span class="lineno"><a class="line" href="string_8h.html#a6af8a4c347c7fdb5980d4c4803be2759">  361</a></span>&#160;<span class="preprocessor">#define sstrcat(count, s1, ...) scstrcat(count, SCSTR(s1), __VA_ARGS__)</span></div><div class="line"><a name="l00362"></a><span class="lineno">  362</span>&#160;</div><div class="line"><a name="l00380"></a><span class="lineno">  380</span>&#160;<a class="code" href="structsstr__t.html">sstr_t</a> <a class="code" href="string_8h.html#abacce4cbd6f70fcb6453904ef08b02e9">scstrcat_a</a>(<a class="code" href="structUcxAllocator.html">UcxAllocator</a> *alloc, <span class="keywordtype">size_t</span> count, <a class="code" href="structscstr__t.html">scstr_t</a> s1, ...);</div><div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;</div><div class="line"><a name="l00399"></a><span class="lineno"><a class="line" href="string_8h.html#a6068d460f9bc05962666a917d26568b3">  399</a></span>&#160;<span class="preprocessor">#define sstrcat_a(alloc, count, s1, ...) \</span></div><div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;<span class="preprocessor">    scstrcat_a(alloc, count, SCSTR(s1), __VA_ARGS__)</span></div><div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;</div><div class="line"><a name="l00416"></a><span class="lineno">  416</span>&#160;<a class="code" href="structsstr__t.html">sstr_t</a> <a class="code" href="string_8h.html#a5eb9e0e1f26cf7fbecc038cd90e8b258">sstrsubs</a>(<a class="code" href="structsstr__t.html">sstr_t</a> <span class="keywordtype">string</span>, <span class="keywordtype">size_t</span> start);</div><div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;</div><div class="line"><a name="l00434"></a><span class="lineno">  434</span>&#160;<a class="code" href="structsstr__t.html">sstr_t</a> <a class="code" href="string_8h.html#a78925c91af54f23cebd20ff99ef4331a">sstrsubsl</a>(<a class="code" href="structsstr__t.html">sstr_t</a> <span class="keywordtype">string</span>, <span class="keywordtype">size_t</span> start, <span class="keywordtype">size_t</span> length);</div><div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;</div><div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;<a class="code" href="structscstr__t.html">scstr_t</a> <a class="code" href="string_8h.html#a9a6c8d8db0dda0037c3c852cce1a5060">scstrsubs</a>(<a class="code" href="structscstr__t.html">scstr_t</a> <span class="keywordtype">string</span>, <span class="keywordtype">size_t</span> start);</div><div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;</div><div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;<a class="code" href="structscstr__t.html">scstr_t</a> <a class="code" href="string_8h.html#ad50f0f67b906fad0744f46bcb51e144b">scstrsubsl</a>(<a class="code" href="structscstr__t.html">scstr_t</a> <span class="keywordtype">string</span>, <span class="keywordtype">size_t</span> start, <span class="keywordtype">size_t</span> length);</div><div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;</div><div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;<a class="code" href="structsstr__t.html">sstr_t</a> <a class="code" href="string_8h.html#af80898a0b75955eb2579298c3ae2c481">sstrchr</a>(<a class="code" href="structsstr__t.html">sstr_t</a> <span class="keywordtype">string</span>, <span class="keywordtype">int</span> chr);</div><div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;</div><div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;<a class="code" href="structsstr__t.html">sstr_t</a> <a class="code" href="string_8h.html#adae3f59957ca328e1da5285cb8b02a72">sstrrchr</a>(<a class="code" href="structsstr__t.html">sstr_t</a> <span class="keywordtype">string</span>, <span class="keywordtype">int</span> chr);</div><div class="line"><a name="l00499"></a><span class="lineno">  499</span>&#160;</div><div class="line"><a name="l00512"></a><span class="lineno">  512</span>&#160;<a class="code" href="structscstr__t.html">scstr_t</a> <a class="code" href="string_8h.html#a5836d6a7a744791c35e5c17bdc394a87">scstrchr</a>(<a class="code" href="structscstr__t.html">scstr_t</a> <span class="keywordtype">string</span>, <span class="keywordtype">int</span> chr);</div><div class="line"><a name="l00513"></a><span class="lineno">  513</span>&#160;</div><div class="line"><a name="l00526"></a><span class="lineno">  526</span>&#160;<a class="code" href="structscstr__t.html">scstr_t</a> <a class="code" href="string_8h.html#ae389835b97cd9382e7d6a6a075323376">scstrrchr</a>(<a class="code" href="structscstr__t.html">scstr_t</a> <span class="keywordtype">string</span>, <span class="keywordtype">int</span> chr);</div><div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;</div><div class="line"><a name="l00543"></a><span class="lineno">  543</span>&#160;<a class="code" href="structsstr__t.html">sstr_t</a> <a class="code" href="string_8h.html#aa4362cb36c6629f9d8484739fd827748">scstrsstr</a>(<a class="code" href="structsstr__t.html">sstr_t</a> <span class="keywordtype">string</span>, <a class="code" href="structscstr__t.html">scstr_t</a> match);</div><div class="line"><a name="l00544"></a><span class="lineno">  544</span>&#160;</div><div class="line"><a name="l00560"></a><span class="lineno"><a class="line" href="string_8h.html#a9d03be026afa9447c52bb34b9e3b895a">  560</a></span>&#160;<span class="preprocessor">#define sstrstr(string, match) scstrsstr(string, SCSTR(match))</span></div><div class="line"><a name="l00561"></a><span class="lineno">  561</span>&#160;</div><div class="line"><a name="l00577"></a><span class="lineno">  577</span>&#160;<a class="code" href="structscstr__t.html">scstr_t</a> <a class="code" href="string_8h.html#a54f256c3abe811c52d58b4ff1b23f051">scstrscstr</a>(<a class="code" href="structscstr__t.html">scstr_t</a> <span class="keywordtype">string</span>, <a class="code" href="structscstr__t.html">scstr_t</a> match);</div><div class="line"><a name="l00578"></a><span class="lineno">  578</span>&#160;</div><div class="line"><a name="l00594"></a><span class="lineno"><a class="line" href="string_8h.html#aa696932213265e10f864678686f4ccde">  594</a></span>&#160;<span class="preprocessor">#define sstrscstr(string, match) scstrscstr(string, SCSTR(match))</span></div><div class="line"><a name="l00595"></a><span class="lineno">  595</span>&#160;</div><div class="line"><a name="l00643"></a><span class="lineno">  643</span>&#160;<a class="code" href="structsstr__t.html">sstr_t</a>* <a class="code" href="string_8h.html#ae71cac352b00230848bde358f0fb05ea">scstrsplit</a>(<a class="code" href="structscstr__t.html">scstr_t</a> <span class="keywordtype">string</span>, <a class="code" href="structscstr__t.html">scstr_t</a> delim, ssize_t *count);</div><div class="line"><a name="l00644"></a><span class="lineno">  644</span>&#160;</div><div class="line"><a name="l00692"></a><span class="lineno"><a class="line" href="string_8h.html#aa929984004c3576bfafb95031aca8eb7">  692</a></span>&#160;<span class="preprocessor">#define sstrsplit(string, delim, count) \</span></div><div class="line"><a name="l00693"></a><span class="lineno">  693</span>&#160;<span class="preprocessor">    scstrsplit(SCSTR(string), SCSTR(delim), count)</span></div><div class="line"><a name="l00694"></a><span class="lineno">  694</span>&#160;</div><div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;<a class="code" href="structsstr__t.html">sstr_t</a>* <a class="code" href="string_8h.html#a52906455ae530c9cdc6812c8e6d9bdef">scstrsplit_a</a>(<a class="code" href="structUcxAllocator.html">UcxAllocator</a> *allocator, <a class="code" href="structscstr__t.html">scstr_t</a> <span class="keywordtype">string</span>, <a class="code" href="structscstr__t.html">scstr_t</a> delim,</div><div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;        ssize_t *count);</div><div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;</div><div class="line"><a name="l00736"></a><span class="lineno"><a class="line" href="string_8h.html#ac9f69fa3a17e26a3a5f9d985b5844601">  736</a></span>&#160;<span class="preprocessor">#define sstrsplit_a(allocator, string, delim, count) \</span></div><div class="line"><a name="l00737"></a><span class="lineno">  737</span>&#160;<span class="preprocessor">    scstrsplit_a(allocator, SCSTR(string), SCSTR(delim), count)</span></div><div class="line"><a name="l00738"></a><span class="lineno">  738</span>&#160;</div><div class="line"><a name="l00751"></a><span class="lineno">  751</span>&#160;<span class="keywordtype">int</span> <a class="code" href="string_8h.html#af35272a8e5408c88ed3e25a3a98f0a82">scstrcmp</a>(<a class="code" href="structscstr__t.html">scstr_t</a> s1, <a class="code" href="structscstr__t.html">scstr_t</a> s2);</div><div class="line"><a name="l00752"></a><span class="lineno">  752</span>&#160;</div><div class="line"><a name="l00765"></a><span class="lineno"><a class="line" href="string_8h.html#a7ae7156c8de57454ca38d306100b8160">  765</a></span>&#160;<span class="preprocessor">#define sstrcmp(s1, s2) scstrcmp(SCSTR(s1), SCSTR(s2))</span></div><div class="line"><a name="l00766"></a><span class="lineno">  766</span>&#160;</div><div class="line"><a name="l00780"></a><span class="lineno">  780</span>&#160;<span class="keywordtype">int</span> <a class="code" href="string_8h.html#aca8142fb823d253054e17c17cfca05e0">scstrcasecmp</a>(<a class="code" href="structscstr__t.html">scstr_t</a> s1, <a class="code" href="structscstr__t.html">scstr_t</a> s2);</div><div class="line"><a name="l00781"></a><span class="lineno">  781</span>&#160;</div><div class="line"><a name="l00795"></a><span class="lineno"><a class="line" href="string_8h.html#a81b0f6df794152c2038703d4e9d0ad59">  795</a></span>&#160;<span class="preprocessor">#define sstrcasecmp(s1, s2) scstrcasecmp(SCSTR(s1), SCSTR(s2))</span></div><div class="line"><a name="l00796"></a><span class="lineno">  796</span>&#160;</div><div class="line"><a name="l00811"></a><span class="lineno">  811</span>&#160;<a class="code" href="structsstr__t.html">sstr_t</a> <a class="code" href="string_8h.html#a97dccce03af419596dbdd592ca46a164">scstrdup</a>(<a class="code" href="structscstr__t.html">scstr_t</a> <span class="keywordtype">string</span>);</div><div class="line"><a name="l00812"></a><span class="lineno">  812</span>&#160;</div><div class="line"><a name="l00827"></a><span class="lineno"><a class="line" href="string_8h.html#accbfd2b459a028d7af9fb7df6f977d80">  827</a></span>&#160;<span class="preprocessor">#define sstrdup(string) scstrdup(SCSTR(string))</span></div><div class="line"><a name="l00828"></a><span class="lineno">  828</span>&#160;</div><div class="line"><a name="l00845"></a><span class="lineno">  845</span>&#160;<a class="code" href="structsstr__t.html">sstr_t</a> <a class="code" href="string_8h.html#a8fe58921f51eb1fde038472377e63014">scstrdup_a</a>(<a class="code" href="structUcxAllocator.html">UcxAllocator</a> *allocator, <a class="code" href="structscstr__t.html">scstr_t</a> <span class="keywordtype">string</span>);</div><div class="line"><a name="l00846"></a><span class="lineno">  846</span>&#160;</div><div class="line"><a name="l00863"></a><span class="lineno"><a class="line" href="string_8h.html#a8d098baada4ea9ad5d8b6343b5aec007">  863</a></span>&#160;<span class="preprocessor">#define sstrdup_a(allocator, string) scstrdup_a(allocator, SCSTR(string))</span></div><div class="line"><a name="l00864"></a><span class="lineno">  864</span>&#160;</div><div class="line"><a name="l00865"></a><span class="lineno">  865</span>&#160;</div><div class="line"><a name="l00883"></a><span class="lineno">  883</span>&#160;<a class="code" href="structsstr__t.html">sstr_t</a> <a class="code" href="string_8h.html#ae2d6da564d3fce51f2e0cac580fdbc56">sstrtrim</a>(<a class="code" href="structsstr__t.html">sstr_t</a> <span class="keywordtype">string</span>);</div><div class="line"><a name="l00884"></a><span class="lineno">  884</span>&#160;</div><div class="line"><a name="l00902"></a><span class="lineno">  902</span>&#160;<a class="code" href="structscstr__t.html">scstr_t</a> <a class="code" href="string_8h.html#ad374b16eb1be8b48019debad9b9f268c">scstrtrim</a>(<a class="code" href="structscstr__t.html">scstr_t</a> <span class="keywordtype">string</span>);</div><div class="line"><a name="l00903"></a><span class="lineno">  903</span>&#160;</div><div class="line"><a name="l00911"></a><span class="lineno">  911</span>&#160;<span class="keywordtype">int</span> <a class="code" href="string_8h.html#a599ddc2f88dd1df68b72eefd91347393">scstrprefix</a>(<a class="code" href="structscstr__t.html">scstr_t</a> <span class="keywordtype">string</span>, <a class="code" href="structscstr__t.html">scstr_t</a> prefix);</div><div class="line"><a name="l00912"></a><span class="lineno">  912</span>&#160;</div><div class="line"><a name="l00920"></a><span class="lineno"><a class="line" href="string_8h.html#a7d73b66256384b26927e787318fdefa2">  920</a></span>&#160;<span class="preprocessor">#define sstrprefix(string, prefix) scstrprefix(SCSTR(string), SCSTR(prefix))</span></div><div class="line"><a name="l00921"></a><span class="lineno">  921</span>&#160;</div><div class="line"><a name="l00929"></a><span class="lineno">  929</span>&#160;<span class="keywordtype">int</span> <a class="code" href="string_8h.html#a1f0ae316a2afe85d5b4655e6ece6721a">scstrsuffix</a>(<a class="code" href="structscstr__t.html">scstr_t</a> <span class="keywordtype">string</span>, <a class="code" href="structscstr__t.html">scstr_t</a> suffix);</div><div class="line"><a name="l00930"></a><span class="lineno">  930</span>&#160;</div><div class="line"><a name="l00938"></a><span class="lineno"><a class="line" href="string_8h.html#ac6a5246f26be2e8a5f34d8995b7ec14e">  938</a></span>&#160;<span class="preprocessor">#define sstrsuffix(string, suffix) scstrsuffix(SCSTR(string), SCSTR(suffix))</span></div><div class="line"><a name="l00939"></a><span class="lineno">  939</span>&#160;</div><div class="line"><a name="l00947"></a><span class="lineno">  947</span>&#160;<span class="keywordtype">int</span> <a class="code" href="string_8h.html#a3718ef4aa1e86cdb26bda2f07fb585df">scstrcaseprefix</a>(<a class="code" href="structscstr__t.html">scstr_t</a> <span class="keywordtype">string</span>, <a class="code" href="structscstr__t.html">scstr_t</a> prefix);</div><div class="line"><a name="l00948"></a><span class="lineno">  948</span>&#160;</div><div class="line"><a name="l00956"></a><span class="lineno"><a class="line" href="string_8h.html#acd3dc64e90db9b4046e14f115a815ff4">  956</a></span>&#160;<span class="preprocessor">#define sstrcaseprefix(string, prefix) \</span></div><div class="line"><a name="l00957"></a><span class="lineno">  957</span>&#160;<span class="preprocessor">  scstrcaseprefix(SCSTR(string), SCSTR(prefix))</span></div><div class="line"><a name="l00958"></a><span class="lineno">  958</span>&#160;</div><div class="line"><a name="l00966"></a><span class="lineno">  966</span>&#160;<span class="keywordtype">int</span> <a class="code" href="string_8h.html#a6edb4b85f2b9efe79db7ffe6eccd7bc3">scstrcasesuffix</a>(<a class="code" href="structscstr__t.html">scstr_t</a> <span class="keywordtype">string</span>, <a class="code" href="structscstr__t.html">scstr_t</a> suffix);</div><div class="line"><a name="l00967"></a><span class="lineno">  967</span>&#160;</div><div class="line"><a name="l00975"></a><span class="lineno"><a class="line" href="string_8h.html#a57eabd4862d531dd685bbf2feb8468bf">  975</a></span>&#160;<span class="preprocessor">#define sstrcasesuffix(string, suffix) \</span></div><div class="line"><a name="l00976"></a><span class="lineno">  976</span>&#160;<span class="preprocessor">  scstrcasesuffix(SCSTR(string), SCSTR(suffix))</span></div><div class="line"><a name="l00977"></a><span class="lineno">  977</span>&#160;</div><div class="line"><a name="l00988"></a><span class="lineno">  988</span>&#160;<a class="code" href="structsstr__t.html">sstr_t</a> <a class="code" href="string_8h.html#abccf198bea3186ff2abb080cc88dcae6">scstrlower</a>(<a class="code" href="structscstr__t.html">scstr_t</a> <span class="keywordtype">string</span>);</div><div class="line"><a name="l00989"></a><span class="lineno">  989</span>&#160;</div><div class="line"><a name="l00999"></a><span class="lineno"><a class="line" href="string_8h.html#a89343ea3e719f00ee802b557db57b769">  999</a></span>&#160;<span class="preprocessor">#define sstrlower(string) scstrlower(SCSTR(string))</span></div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160;</div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160;<a class="code" href="structsstr__t.html">sstr_t</a> <a class="code" href="string_8h.html#a3cf1e557df7ab58d03c78832c4060276">scstrlower_a</a>(<a class="code" href="structUcxAllocator.html">UcxAllocator</a> *allocator, <a class="code" href="structscstr__t.html">scstr_t</a> <span class="keywordtype">string</span>);</div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160;</div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160;</div><div class="line"><a name="l01025"></a><span class="lineno"><a class="line" href="string_8h.html#a4bb4742fe71115f493991d307cb22b23"> 1025</a></span>&#160;<span class="preprocessor">#define sstrlower_a(allocator, string) scstrlower_a(allocator, SCSTR(string))</span></div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160;</div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160;<a class="code" href="structsstr__t.html">sstr_t</a> <a class="code" href="string_8h.html#af3dd09ec9d11162fe0075f4e60f41240">scstrupper</a>(<a class="code" href="structscstr__t.html">scstr_t</a> <span class="keywordtype">string</span>);</div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160;</div><div class="line"><a name="l01048"></a><span class="lineno"><a class="line" href="string_8h.html#a084fe5a3a90d6fb6b15ecda03bb30824"> 1048</a></span>&#160;<span class="preprocessor">#define sstrupper(string) scstrupper(SCSTR(string))</span></div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160;</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160;<a class="code" href="structsstr__t.html">sstr_t</a> <a class="code" href="string_8h.html#aea94613eb74668cc05d365803d32bfad">scstrupper_a</a>(<a class="code" href="structUcxAllocator.html">UcxAllocator</a> *allocator, <a class="code" href="structscstr__t.html">scstr_t</a> <span class="keywordtype">string</span>);</div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160;</div><div class="line"><a name="l01073"></a><span class="lineno"><a class="line" href="string_8h.html#a5f0dd83c0176b812fb428004b2877a34"> 1073</a></span>&#160;<span class="preprocessor">#define sstrupper_a(allocator, string) scstrupper_a(allocator, string)</span></div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160;</div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160;}</div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160;</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160;<span class="preprocessor">#endif  </span><span class="comment">/* UCX_STRING_H */</span><span class="preprocessor"></span></div><div class="ttc" id="string_8h_html_a539eb7059251a051ee5d179526a23e9a"><div class="ttname"><a href="string_8h.html#a539eb7059251a051ee5d179526a23e9a">sstr</a></div><div class="ttdeci">sstr_t sstr(char *cstring)</div><div class="ttdoc">Creates a new sstr_t based on a C string. </div><div class="ttdef"><b>Definition:</b> string.c:43</div></div>
+<div class="ttc" id="string_8h_html_a97dccce03af419596dbdd592ca46a164"><div class="ttname"><a href="string_8h.html#a97dccce03af419596dbdd592ca46a164">scstrdup</a></div><div class="ttdeci">sstr_t scstrdup(scstr_t string)</div><div class="ttdoc">Creates a duplicate of the specified string. </div><div class="ttdef"><b>Definition:</b> string.c:520</div></div>
+<div class="ttc" id="structsstr__t_html"><div class="ttname"><a href="structsstr__t.html">sstr_t</a></div><div class="ttdoc">The UCX string structure. </div><div class="ttdef"><b>Definition:</b> string.h:90</div></div>
+<div class="ttc" id="string_8h_html_abccf198bea3186ff2abb080cc88dcae6"><div class="ttname"><a href="string_8h.html#abccf198bea3186ff2abb080cc88dcae6">scstrlower</a></div><div class="ttdeci">sstr_t scstrlower(scstr_t string)</div><div class="ttdoc">Returns a lower case version of a string. </div><div class="ttdef"><b>Definition:</b> string.c:633</div></div>
+<div class="ttc" id="string_8h_html_a78925c91af54f23cebd20ff99ef4331a"><div class="ttname"><a href="string_8h.html#a78925c91af54f23cebd20ff99ef4331a">sstrsubsl</a></div><div class="ttdeci">sstr_t sstrsubsl(sstr_t string, size_t start, size_t length)</div><div class="ttdoc">Returns a substring with the given length starting at the specified location. </div><div class="ttdef"><b>Definition:</b> string.c:201</div></div>
+<div class="ttc" id="string_8h_html_ad374b16eb1be8b48019debad9b9f268c"><div class="ttname"><a href="string_8h.html#ad374b16eb1be8b48019debad9b9f268c">scstrtrim</a></div><div class="ttdeci">scstr_t scstrtrim(scstr_t string)</div><div class="ttdoc">Omits leading and trailing spaces. </div><div class="ttdef"><b>Definition:</b> string.c:563</div></div>
+<div class="ttc" id="string_8h_html_a52906455ae530c9cdc6812c8e6d9bdef"><div class="ttname"><a href="string_8h.html#a52906455ae530c9cdc6812c8e6d9bdef">scstrsplit_a</a></div><div class="ttdeci">sstr_t * scstrsplit_a(UcxAllocator *allocator, scstr_t string, scstr_t delim, ssize_t *count)</div><div class="ttdoc">Performing scstrsplit() using a UcxAllocator. </div><div class="ttdef"><b>Definition:</b> string.c:400</div></div>
+<div class="ttc" id="ucx_8h_html"><div class="ttname"><a href="ucx_8h.html">ucx.h</a></div><div class="ttdoc">Main UCX Header providing most common definitions. </div></div>
+<div class="ttc" id="string_8h_html_ae389835b97cd9382e7d6a6a075323376"><div class="ttname"><a href="string_8h.html#ae389835b97cd9382e7d6a6a075323376">scstrrchr</a></div><div class="ttdeci">scstr_t scstrrchr(scstr_t string, int chr)</div><div class="ttdoc">Returns an immutable substring starting at the location of the last occurrence of the specified chara...</div><div class="ttdef"><b>Definition:</b> string.c:270</div></div>
+<div class="ttc" id="string_8h_html_a69d5e3eeec783cc43314df71248768f5"><div class="ttname"><a href="string_8h.html#a69d5e3eeec783cc43314df71248768f5">ucx_sc2sc</a></div><div class="ttdeci">scstr_t ucx_sc2sc(scstr_t str)</div><div class="ttdoc">One of two type adjustment functions that return an scstr_t. </div><div class="ttdef"><b>Definition:</b> string.c:666</div></div>
+<div class="ttc" id="string_8h_html_a599ddc2f88dd1df68b72eefd91347393"><div class="ttname"><a href="string_8h.html#a599ddc2f88dd1df68b72eefd91347393">scstrprefix</a></div><div class="ttdeci">int scstrprefix(scstr_t string, scstr_t prefix)</div><div class="ttdoc">Checks, if a string has a specific prefix. </div><div class="ttdef"><b>Definition:</b> string.c:570</div></div>
+<div class="ttc" id="string_8h_html_adae3f59957ca328e1da5285cb8b02a72"><div class="ttname"><a href="string_8h.html#adae3f59957ca328e1da5285cb8b02a72">sstrrchr</a></div><div class="ttdeci">sstr_t sstrrchr(sstr_t string, int chr)</div><div class="ttdoc">Returns a substring starting at the location of the last occurrence of the specified character...</div><div class="ttdef"><b>Definition:</b> string.c:254</div></div>
+<div class="ttc" id="string_8h_html_ae2d6da564d3fce51f2e0cac580fdbc56"><div class="ttname"><a href="string_8h.html#ae2d6da564d3fce51f2e0cac580fdbc56">sstrtrim</a></div><div class="ttdeci">sstr_t sstrtrim(sstr_t string)</div><div class="ttdoc">Omits leading and trailing spaces. </div><div class="ttdef"><b>Definition:</b> string.c:556</div></div>
+<div class="ttc" id="structscstr__t_html_a305fd48934b474a9bf4a40869030e391"><div class="ttname"><a href="structscstr__t.html#a305fd48934b474a9bf4a40869030e391">scstr_t::ptr</a></div><div class="ttdeci">const char * ptr</div><div class="ttdoc">A constant pointer to the immutable string (not necessarily NULL-terminated) </div><div class="ttdef"><b>Definition:</b> string.h:104</div></div>
+<div class="ttc" id="structscstr__t_html"><div class="ttname"><a href="structscstr__t.html">scstr_t</a></div><div class="ttdoc">The UCX string structure for immutable (constant) strings. </div><div class="ttdef"><b>Definition:</b> string.h:101</div></div>
+<div class="ttc" id="string_8h_html_ac1b000030d6d197eec48c15a182055d5"><div class="ttname"><a href="string_8h.html#ac1b000030d6d197eec48c15a182055d5">scstrnlen</a></div><div class="ttdeci">size_t scstrnlen(size_t count,...)</div><div class="ttdoc">Returns the accumulated length of all specified strings. </div><div class="ttdef"><b>Definition:</b> string.c:72</div></div>
+<div class="ttc" id="string_8h_html_a5eb9e0e1f26cf7fbecc038cd90e8b258"><div class="ttname"><a href="string_8h.html#a5eb9e0e1f26cf7fbecc038cd90e8b258">sstrsubs</a></div><div class="ttdeci">sstr_t sstrsubs(sstr_t string, size_t start)</div><div class="ttdoc">Returns a substring starting at the specified location. </div><div class="ttdef"><b>Definition:</b> string.c:197</div></div>
+<div class="ttc" id="string_8h_html_aca8142fb823d253054e17c17cfca05e0"><div class="ttname"><a href="string_8h.html#aca8142fb823d253054e17c17cfca05e0">scstrcasecmp</a></div><div class="ttdeci">int scstrcasecmp(scstr_t s1, scstr_t s2)</div><div class="ttdoc">Compares two UCX strings ignoring the case. </div><div class="ttdef"><b>Definition:</b> string.c:506</div></div>
+<div class="ttc" id="string_8h_html_a9ce5ad1b2aa2dbeba204d452c2e64359"><div class="ttname"><a href="string_8h.html#a9ce5ad1b2aa2dbeba204d452c2e64359">ucx_ss2sc</a></div><div class="ttdeci">scstr_t ucx_ss2sc(sstr_t str)</div><div class="ttdoc">One of two type adjustment functions that return an scstr_t. </div><div class="ttdef"><b>Definition:</b> string.c:669</div></div>
+<div class="ttc" id="string_8h_html_af35272a8e5408c88ed3e25a3a98f0a82"><div class="ttname"><a href="string_8h.html#af35272a8e5408c88ed3e25a3a98f0a82">scstrcmp</a></div><div class="ttdeci">int scstrcmp(scstr_t s1, scstr_t s2)</div><div class="ttdoc">Compares two UCX strings with standard memcmp(). </div><div class="ttdef"><b>Definition:</b> string.c:496</div></div>
+<div class="ttc" id="structsstr__t_html_af8049914efc1e67f7de3ee55ec0611b0"><div class="ttname"><a href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0">sstr_t::ptr</a></div><div class="ttdeci">char * ptr</div><div class="ttdoc">A pointer to the string (not necessarily NULL-terminated) </div><div class="ttdef"><b>Definition:</b> string.h:93</div></div>
+<div class="ttc" id="structUcxAllocator_html"><div class="ttname"><a href="structUcxAllocator.html">UcxAllocator</a></div><div class="ttdoc">UCX allocator data structure containing memory management functions. </div><div class="ttdef"><b>Definition:</b> allocator.h:88</div></div>
+<div class="ttc" id="string_8h_html_ae71cac352b00230848bde358f0fb05ea"><div class="ttname"><a href="string_8h.html#ae71cac352b00230848bde358f0fb05ea">scstrsplit</a></div><div class="ttdeci">sstr_t * scstrsplit(scstr_t string, scstr_t delim, ssize_t *count)</div><div class="ttdoc">Splits a string into parts by using a delimiter string. </div><div class="ttdef"><b>Definition:</b> string.c:396</div></div>
+<div class="ttc" id="string_8h_html_a3cf1e557df7ab58d03c78832c4060276"><div class="ttname"><a href="string_8h.html#a3cf1e557df7ab58d03c78832c4060276">scstrlower_a</a></div><div class="ttdeci">sstr_t scstrlower_a(UcxAllocator *allocator, scstr_t string)</div><div class="ttdoc">Returns a lower case version of a string. </div><div class="ttdef"><b>Definition:</b> string.c:641</div></div>
+<div class="ttc" id="structsstr__t_html_a5cf571708cdff92e45f08458f2b98229"><div class="ttname"><a href="structsstr__t.html#a5cf571708cdff92e45f08458f2b98229">sstr_t::length</a></div><div class="ttdeci">size_t length</div><div class="ttdoc">The length of the string. </div><div class="ttdef"><b>Definition:</b> string.h:95</div></div>
+<div class="ttc" id="string_8h_html_af80898a0b75955eb2579298c3ae2c481"><div class="ttname"><a href="string_8h.html#af80898a0b75955eb2579298c3ae2c481">sstrchr</a></div><div class="ttdeci">sstr_t sstrchr(sstr_t string, int chr)</div><div class="ttdoc">Returns a substring starting at the location of the first occurrence of the specified character...</div><div class="ttdef"><b>Definition:</b> string.c:246</div></div>
+<div class="ttc" id="string_8h_html_a8fe58921f51eb1fde038472377e63014"><div class="ttname"><a href="string_8h.html#a8fe58921f51eb1fde038472377e63014">scstrdup_a</a></div><div class="ttdeci">sstr_t scstrdup_a(UcxAllocator *allocator, scstr_t string)</div><div class="ttdoc">Creates a duplicate of the specified string using a UcxAllocator. </div><div class="ttdef"><b>Definition:</b> string.c:524</div></div>
+<div class="ttc" id="string_8h_html_ae594f6e222ea394cef6a26c0dfad000d"><div class="ttname"><a href="string_8h.html#ae594f6e222ea394cef6a26c0dfad000d">scstrn</a></div><div class="ttdeci">scstr_t scstrn(const char *cstring, size_t length)</div><div class="ttdoc">Creates a new scstr_t of the specified length based on a constant C string. </div><div class="ttdef"><b>Definition:</b> string.c:64</div></div>
+<div class="ttc" id="string_8h_html_aedeb5d7bddda54116101a8d68af8c56d"><div class="ttname"><a href="string_8h.html#aedeb5d7bddda54116101a8d68af8c56d">ucx_ss2c_s</a></div><div class="ttdeci">scstr_t ucx_ss2c_s()</div><div class="ttdoc">Converts a UCX string to an immutable UCX string (scstr_t). </div></div>
+<div class="ttc" id="string_8h_html_a1f0ae316a2afe85d5b4655e6ece6721a"><div class="ttname"><a href="string_8h.html#a1f0ae316a2afe85d5b4655e6ece6721a">scstrsuffix</a></div><div class="ttdeci">int scstrsuffix(scstr_t string, scstr_t suffix)</div><div class="ttdoc">Checks, if a string has a specific suffix. </div><div class="ttdef"><b>Definition:</b> string.c:585</div></div>
+<div class="ttc" id="string_8h_html_a2b1d6f1eca1c1549f37107b9c026c5a6"><div class="ttname"><a href="string_8h.html#a2b1d6f1eca1c1549f37107b9c026c5a6">scstr</a></div><div class="ttdeci">scstr_t scstr(const char *cstring)</div><div class="ttdoc">Creates a new scstr_t based on a constant C string. </div><div class="ttdef"><b>Definition:</b> string.c:57</div></div>
+<div class="ttc" id="allocator_8h_html"><div class="ttname"><a href="allocator_8h.html">allocator.h</a></div><div class="ttdoc">Allocator for custom memory management. </div></div>
+<div class="ttc" id="string_8h_html_a54f256c3abe811c52d58b4ff1b23f051"><div class="ttname"><a href="string_8h.html#a54f256c3abe811c52d58b4ff1b23f051">scstrscstr</a></div><div class="ttdeci">scstr_t scstrscstr(scstr_t string, scstr_t match)</div><div class="ttdoc">Returns an immutable substring starting at the location of the first occurrence of the specified immu...</div><div class="ttdef"><b>Definition:</b> string.c:375</div></div>
+<div class="ttc" id="string_8h_html_abacce4cbd6f70fcb6453904ef08b02e9"><div class="ttname"><a href="string_8h.html#abacce4cbd6f70fcb6453904ef08b02e9">scstrcat_a</a></div><div class="ttdeci">sstr_t scstrcat_a(UcxAllocator *alloc, size_t count, scstr_t s1,...)</div><div class="ttdoc">Concatenates two or more strings using a UcxAllocator. </div><div class="ttdef"><b>Definition:</b> string.c:167</div></div>
+<div class="ttc" id="string_8h_html_a7376842c19e954b49215da81ef76ac0c"><div class="ttname"><a href="string_8h.html#a7376842c19e954b49215da81ef76ac0c">scstrcat</a></div><div class="ttdeci">sstr_t scstrcat(size_t count, scstr_t s1,...)</div><div class="ttdoc">Concatenates two or more strings. </div><div class="ttdef"><b>Definition:</b> string.c:159</div></div>
+<div class="ttc" id="string_8h_html_aea94613eb74668cc05d365803d32bfad"><div class="ttname"><a href="string_8h.html#aea94613eb74668cc05d365803d32bfad">scstrupper_a</a></div><div class="ttdeci">sstr_t scstrupper_a(UcxAllocator *allocator, scstr_t string)</div><div class="ttdoc">Returns a upper case version of a string. </div><div class="ttdef"><b>Definition:</b> string.c:657</div></div>
+<div class="ttc" id="string_8h_html_af3dd09ec9d11162fe0075f4e60f41240"><div class="ttname"><a href="string_8h.html#af3dd09ec9d11162fe0075f4e60f41240">scstrupper</a></div><div class="ttdeci">sstr_t scstrupper(scstr_t string)</div><div class="ttdoc">Returns a upper case version of a string. </div><div class="ttdef"><b>Definition:</b> string.c:649</div></div>
+<div class="ttc" id="string_8h_html_ad50f0f67b906fad0744f46bcb51e144b"><div class="ttname"><a href="string_8h.html#ad50f0f67b906fad0744f46bcb51e144b">scstrsubsl</a></div><div class="ttdeci">scstr_t scstrsubsl(scstr_t string, size_t start, size_t length)</div><div class="ttdoc">Returns a substring of an immutable string with a maximum length starting at the specified location...</div><div class="ttdef"><b>Definition:</b> string.c:214</div></div>
+<div class="ttc" id="string_8h_html_a2744c38ac44abf3e01fa059056dcf36c"><div class="ttname"><a href="string_8h.html#a2744c38ac44abf3e01fa059056dcf36c">sstrn</a></div><div class="ttdeci">sstr_t sstrn(char *cstring, size_t length)</div><div class="ttdoc">Creates a new sstr_t of the specified length based on a C string. </div><div class="ttdef"><b>Definition:</b> string.c:50</div></div>
+<div class="ttc" id="structscstr__t_html_aaa0229f64f1057b6f65adededaa5a172"><div class="ttname"><a href="structscstr__t.html#aaa0229f64f1057b6f65adededaa5a172">scstr_t::length</a></div><div class="ttdeci">size_t length</div><div class="ttdoc">The length of the string. </div><div class="ttdef"><b>Definition:</b> string.h:106</div></div>
+<div class="ttc" id="string_8h_html_a6edb4b85f2b9efe79db7ffe6eccd7bc3"><div class="ttname"><a href="string_8h.html#a6edb4b85f2b9efe79db7ffe6eccd7bc3">scstrcasesuffix</a></div><div class="ttdeci">int scstrcasesuffix(scstr_t string, scstr_t suffix)</div><div class="ttdoc">Checks, if a string has a specific suffix, ignoring the case. </div><div class="ttdef"><b>Definition:</b> string.c:617</div></div>
+<div class="ttc" id="string_8h_html_a5836d6a7a744791c35e5c17bdc394a87"><div class="ttname"><a href="string_8h.html#a5836d6a7a744791c35e5c17bdc394a87">scstrchr</a></div><div class="ttdeci">scstr_t scstrchr(scstr_t string, int chr)</div><div class="ttdoc">Returns an immutable substring starting at the location of the first occurrence of the specified char...</div><div class="ttdef"><b>Definition:</b> string.c:262</div></div>
+<div class="ttc" id="string_8h_html_a9a6c8d8db0dda0037c3c852cce1a5060"><div class="ttname"><a href="string_8h.html#a9a6c8d8db0dda0037c3c852cce1a5060">scstrsubs</a></div><div class="ttdeci">scstr_t scstrsubs(scstr_t string, size_t start)</div><div class="ttdoc">Returns a substring of an immutable string starting at the specified location. </div><div class="ttdef"><b>Definition:</b> string.c:210</div></div>
+<div class="ttc" id="string_8h_html_aa4362cb36c6629f9d8484739fd827748"><div class="ttname"><a href="string_8h.html#aa4362cb36c6629f9d8484739fd827748">scstrsstr</a></div><div class="ttdeci">sstr_t scstrsstr(sstr_t string, scstr_t match)</div><div class="ttdoc">Returns a substring starting at the location of the first occurrence of the specified string...</div><div class="ttdef"><b>Definition:</b> string.c:357</div></div>
+<div class="ttc" id="string_8h_html_a3718ef4aa1e86cdb26bda2f07fb585df"><div class="ttname"><a href="string_8h.html#a3718ef4aa1e86cdb26bda2f07fb585df">scstrcaseprefix</a></div><div class="ttdeci">int scstrcaseprefix(scstr_t string, scstr_t prefix)</div><div class="ttdoc">Checks, if a string has a specific prefix, ignoring the case. </div><div class="ttdef"><b>Definition:</b> string.c:601</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/structUcxAVLNode.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,115 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: UcxAVLNode Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">UcxAVLNode Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>UCX AVL Node.  
+ <a href="structUcxAVLNode.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="avl_8h_source.html">avl.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ab65a31010d26a3df898e6ba534702af6"><td class="memItemLeft" align="right" valign="top"><a id="ab65a31010d26a3df898e6ba534702af6"></a>
+intptr_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxAVLNode.html#ab65a31010d26a3df898e6ba534702af6">key</a></td></tr>
+<tr class="memdesc:ab65a31010d26a3df898e6ba534702af6"><td class="mdescLeft">&#160;</td><td class="mdescRight">The key for this node. <br /></td></tr>
+<tr class="separator:ab65a31010d26a3df898e6ba534702af6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a302501b8c04c3fde668fe72249871258"><td class="memItemLeft" align="right" valign="top"><a id="a302501b8c04c3fde668fe72249871258"></a>
+void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxAVLNode.html#a302501b8c04c3fde668fe72249871258">value</a></td></tr>
+<tr class="memdesc:a302501b8c04c3fde668fe72249871258"><td class="mdescLeft">&#160;</td><td class="mdescRight">Data contained by this node. <br /></td></tr>
+<tr class="separator:a302501b8c04c3fde668fe72249871258"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af129fd32863a7c35e82c5cd9d11dc95a"><td class="memItemLeft" align="right" valign="top"><a id="af129fd32863a7c35e82c5cd9d11dc95a"></a>
+size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxAVLNode.html#af129fd32863a7c35e82c5cd9d11dc95a">height</a></td></tr>
+<tr class="memdesc:af129fd32863a7c35e82c5cd9d11dc95a"><td class="mdescLeft">&#160;</td><td class="mdescRight">The height of this (sub)-tree. <br /></td></tr>
+<tr class="separator:af129fd32863a7c35e82c5cd9d11dc95a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc4e3b4f452aa2d91cabb2135b9d42f7"><td class="memItemLeft" align="right" valign="top"><a id="afc4e3b4f452aa2d91cabb2135b9d42f7"></a>
+<a class="el" href="structUcxAVLNode.html">UcxAVLNode</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxAVLNode.html#afc4e3b4f452aa2d91cabb2135b9d42f7">parent</a></td></tr>
+<tr class="memdesc:afc4e3b4f452aa2d91cabb2135b9d42f7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parent node. <br /></td></tr>
+<tr class="separator:afc4e3b4f452aa2d91cabb2135b9d42f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad3a1c733f2c1cc81ac527f846fc24b9c"><td class="memItemLeft" align="right" valign="top"><a id="ad3a1c733f2c1cc81ac527f846fc24b9c"></a>
+<a class="el" href="structUcxAVLNode.html">UcxAVLNode</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxAVLNode.html#ad3a1c733f2c1cc81ac527f846fc24b9c">left</a></td></tr>
+<tr class="memdesc:ad3a1c733f2c1cc81ac527f846fc24b9c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Root node of left subtree. <br /></td></tr>
+<tr class="separator:ad3a1c733f2c1cc81ac527f846fc24b9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7cbaa31dba8c7a89f4f8f7905f6fd238"><td class="memItemLeft" align="right" valign="top"><a id="a7cbaa31dba8c7a89f4f8f7905f6fd238"></a>
+<a class="el" href="structUcxAVLNode.html">UcxAVLNode</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxAVLNode.html#a7cbaa31dba8c7a89f4f8f7905f6fd238">right</a></td></tr>
+<tr class="memdesc:a7cbaa31dba8c7a89f4f8f7905f6fd238"><td class="mdescLeft">&#160;</td><td class="mdescRight">Root node of right subtree. <br /></td></tr>
+<tr class="separator:a7cbaa31dba8c7a89f4f8f7905f6fd238"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>UCX AVL Node. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="avl_8h_source.html">avl.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/structUcxAVLTree.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,140 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: UcxAVLTree Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">UcxAVLTree Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>UCX AVL Tree.  
+ <a href="structUcxAVLTree.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="avl_8h_source.html">avl.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a30652776b540156ad54c7d52833e4e28"><td class="memItemLeft" align="right" valign="top"><a id="a30652776b540156ad54c7d52833e4e28"></a>
+<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxAVLTree.html#a30652776b540156ad54c7d52833e4e28">allocator</a></td></tr>
+<tr class="memdesc:a30652776b540156ad54c7d52833e4e28"><td class="mdescLeft">&#160;</td><td class="mdescRight">The <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a> that shall be used to manage the memory for node data. <br /></td></tr>
+<tr class="separator:a30652776b540156ad54c7d52833e4e28"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a393a8fc99eb2c290d3cb67170081d742"><td class="memItemLeft" align="right" valign="top"><a id="a393a8fc99eb2c290d3cb67170081d742"></a>
+<a class="el" href="structUcxAVLNode.html">UcxAVLNode</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxAVLTree.html#a393a8fc99eb2c290d3cb67170081d742">root</a></td></tr>
+<tr class="memdesc:a393a8fc99eb2c290d3cb67170081d742"><td class="mdescLeft">&#160;</td><td class="mdescRight">Root node of the tree. <br /></td></tr>
+<tr class="separator:a393a8fc99eb2c290d3cb67170081d742"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a87aff25cb726cb9eb88eb815a10d1004"><td class="memItemLeft" align="right" valign="top"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxAVLTree.html#a87aff25cb726cb9eb88eb815a10d1004">cmpfunc</a></td></tr>
+<tr class="memdesc:a87aff25cb726cb9eb88eb815a10d1004"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compare function that shall be used to compare the <a class="el" href="structUcxAVLNode.html" title="UCX AVL Node. ">UcxAVLNode</a> keys.  <a href="#a87aff25cb726cb9eb88eb815a10d1004">More...</a><br /></td></tr>
+<tr class="separator:a87aff25cb726cb9eb88eb815a10d1004"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae92a3bfad3fe33c8dcbdad85112f83fd"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxAVLTree.html#ae92a3bfad3fe33c8dcbdad85112f83fd">userdata</a></td></tr>
+<tr class="memdesc:ae92a3bfad3fe33c8dcbdad85112f83fd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Custom user data.  <a href="#ae92a3bfad3fe33c8dcbdad85112f83fd">More...</a><br /></td></tr>
+<tr class="separator:ae92a3bfad3fe33c8dcbdad85112f83fd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>UCX AVL Tree. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a87aff25cb726cb9eb88eb815a10d1004"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a87aff25cb726cb9eb88eb815a10d1004">&#9670;&nbsp;</a></span>cmpfunc</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a> UcxAVLTree::cmpfunc</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Compare function that shall be used to compare the <a class="el" href="structUcxAVLNode.html" title="UCX AVL Node. ">UcxAVLNode</a> keys. </p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="structUcxAVLNode.html#ab65a31010d26a3df898e6ba534702af6" title="The key for this node. ">UcxAVLNode.key</a> </dd></dl>
+
+</div>
+</div>
+<a id="ae92a3bfad3fe33c8dcbdad85112f83fd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae92a3bfad3fe33c8dcbdad85112f83fd">&#9670;&nbsp;</a></span>userdata</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* UcxAVLTree::userdata</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Custom user data. </p>
+<p>This data will also be provided to the cmpfunc. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="avl_8h_source.html">avl.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/structUcxAllocator.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,128 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: UcxAllocator Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">UcxAllocator Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>UCX allocator data structure containing memory management functions.  
+ <a href="structUcxAllocator.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="allocator_8h_source.html">allocator.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a1b78012998d1c28be86dc595f8f0aac9"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxAllocator.html#a1b78012998d1c28be86dc595f8f0aac9">pool</a></td></tr>
+<tr class="memdesc:a1b78012998d1c28be86dc595f8f0aac9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pointer to an area of memory or a complex memory pool.  <a href="#a1b78012998d1c28be86dc595f8f0aac9">More...</a><br /></td></tr>
+<tr class="separator:a1b78012998d1c28be86dc595f8f0aac9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a013376172be39ed54f77c4be6898845a"><td class="memItemLeft" align="right" valign="top"><a id="a013376172be39ed54f77c4be6898845a"></a>
+<a class="el" href="allocator_8h.html#a29f0f6a23a70db3b60635cd6dc384473">ucx_allocator_malloc</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxAllocator.html#a013376172be39ed54f77c4be6898845a">malloc</a></td></tr>
+<tr class="memdesc:a013376172be39ed54f77c4be6898845a"><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code><a class="el" href="structUcxAllocator.html#a013376172be39ed54f77c4be6898845a" title="The malloc() function for this allocator. ">malloc()</a></code> function for this allocator. <br /></td></tr>
+<tr class="separator:a013376172be39ed54f77c4be6898845a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab94ec1cba45cc4e7d81e1588a11cbb62"><td class="memItemLeft" align="right" valign="top"><a id="ab94ec1cba45cc4e7d81e1588a11cbb62"></a>
+<a class="el" href="allocator_8h.html#a2c0aba4221c1ac6801f03ed799f15b12">ucx_allocator_calloc</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxAllocator.html#ab94ec1cba45cc4e7d81e1588a11cbb62">calloc</a></td></tr>
+<tr class="memdesc:ab94ec1cba45cc4e7d81e1588a11cbb62"><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code><a class="el" href="structUcxAllocator.html#ab94ec1cba45cc4e7d81e1588a11cbb62" title="The calloc() function for this allocator. ">calloc()</a></code> function for this allocator. <br /></td></tr>
+<tr class="separator:ab94ec1cba45cc4e7d81e1588a11cbb62"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3550e3847f31d9e9ce3ffcb0d3440c15"><td class="memItemLeft" align="right" valign="top"><a id="a3550e3847f31d9e9ce3ffcb0d3440c15"></a>
+<a class="el" href="allocator_8h.html#a6d7cf038a806e327c5da37321d04e426">ucx_allocator_realloc</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxAllocator.html#a3550e3847f31d9e9ce3ffcb0d3440c15">realloc</a></td></tr>
+<tr class="memdesc:a3550e3847f31d9e9ce3ffcb0d3440c15"><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code><a class="el" href="structUcxAllocator.html#a3550e3847f31d9e9ce3ffcb0d3440c15" title="The realloc() function for this allocator. ">realloc()</a></code> function for this allocator. <br /></td></tr>
+<tr class="separator:a3550e3847f31d9e9ce3ffcb0d3440c15"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aecce1840378ed53f1002190f4f87026f"><td class="memItemLeft" align="right" valign="top"><a id="aecce1840378ed53f1002190f4f87026f"></a>
+<a class="el" href="allocator_8h.html#aaf2387ddaddd8ab4b267e6b00e5d6f7e">ucx_allocator_free</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxAllocator.html#aecce1840378ed53f1002190f4f87026f">free</a></td></tr>
+<tr class="memdesc:aecce1840378ed53f1002190f4f87026f"><td class="mdescLeft">&#160;</td><td class="mdescRight">The <code><a class="el" href="structUcxAllocator.html#aecce1840378ed53f1002190f4f87026f" title="The free() function for this allocator. ">free()</a></code> function for this allocator. <br /></td></tr>
+<tr class="separator:aecce1840378ed53f1002190f4f87026f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>UCX allocator data structure containing memory management functions. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a1b78012998d1c28be86dc595f8f0aac9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1b78012998d1c28be86dc595f8f0aac9">&#9670;&nbsp;</a></span>pool</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* UcxAllocator::pool</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Pointer to an area of memory or a complex memory pool. </p>
+<p>This pointer will be passed to any memory management function as first argument. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="allocator_8h_source.html">allocator.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/structUcxArray.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,111 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: UcxArray Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">UcxArray Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>UCX array type.  
+ <a href="structUcxArray.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="array_8h_source.html">array.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a7ed074887908e45bde7e1fbc67b31c18"><td class="memItemLeft" align="right" valign="top"><a id="a7ed074887908e45bde7e1fbc67b31c18"></a>
+size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxArray.html#a7ed074887908e45bde7e1fbc67b31c18">capacity</a></td></tr>
+<tr class="memdesc:a7ed074887908e45bde7e1fbc67b31c18"><td class="mdescLeft">&#160;</td><td class="mdescRight">The current capacity of the array. <br /></td></tr>
+<tr class="separator:a7ed074887908e45bde7e1fbc67b31c18"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a20c11f2c9048cda80062842b7c094e20"><td class="memItemLeft" align="right" valign="top"><a id="a20c11f2c9048cda80062842b7c094e20"></a>
+size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxArray.html#a20c11f2c9048cda80062842b7c094e20">size</a></td></tr>
+<tr class="memdesc:a20c11f2c9048cda80062842b7c094e20"><td class="mdescLeft">&#160;</td><td class="mdescRight">The actual number of elements in the array. <br /></td></tr>
+<tr class="separator:a20c11f2c9048cda80062842b7c094e20"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac4e9ecdf8a8d010644f6e44dfef8190f"><td class="memItemLeft" align="right" valign="top"><a id="ac4e9ecdf8a8d010644f6e44dfef8190f"></a>
+size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxArray.html#ac4e9ecdf8a8d010644f6e44dfef8190f">elemsize</a></td></tr>
+<tr class="memdesc:ac4e9ecdf8a8d010644f6e44dfef8190f"><td class="mdescLeft">&#160;</td><td class="mdescRight">The size of an individual element in bytes. <br /></td></tr>
+<tr class="separator:ac4e9ecdf8a8d010644f6e44dfef8190f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a04d2b03d0a45af1fab19b4216602075a"><td class="memItemLeft" align="right" valign="top"><a id="a04d2b03d0a45af1fab19b4216602075a"></a>
+void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxArray.html#a04d2b03d0a45af1fab19b4216602075a">data</a></td></tr>
+<tr class="memdesc:a04d2b03d0a45af1fab19b4216602075a"><td class="mdescLeft">&#160;</td><td class="mdescRight">A pointer to the data. <br /></td></tr>
+<tr class="separator:a04d2b03d0a45af1fab19b4216602075a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2ef31303b7548b9aa8e2b9187e295212"><td class="memItemLeft" align="right" valign="top"><a id="a2ef31303b7548b9aa8e2b9187e295212"></a>
+<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxArray.html#a2ef31303b7548b9aa8e2b9187e295212">allocator</a></td></tr>
+<tr class="memdesc:a2ef31303b7548b9aa8e2b9187e295212"><td class="mdescLeft">&#160;</td><td class="mdescRight">The allocator used for the data. <br /></td></tr>
+<tr class="separator:a2ef31303b7548b9aa8e2b9187e295212"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>UCX array type. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="array_8h_source.html">array.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/structUcxBuffer.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,193 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: UcxBuffer Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">UcxBuffer Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>UCX Buffer.  
+ <a href="structUcxBuffer.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="buffer_8h_source.html">buffer.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a1a5076e85acb84b715a53bc0f37fb721"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxBuffer.html#a1a5076e85acb84b715a53bc0f37fb721">space</a></td></tr>
+<tr class="memdesc:a1a5076e85acb84b715a53bc0f37fb721"><td class="mdescLeft">&#160;</td><td class="mdescRight">A pointer to the buffer contents.  <a href="#a1a5076e85acb84b715a53bc0f37fb721">More...</a><br /></td></tr>
+<tr class="separator:a1a5076e85acb84b715a53bc0f37fb721"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7a64288f002cf62b492e2ea49c79615c"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxBuffer.html#a7a64288f002cf62b492e2ea49c79615c">pos</a></td></tr>
+<tr class="memdesc:a7a64288f002cf62b492e2ea49c79615c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Current position of the buffer.  <a href="#a7a64288f002cf62b492e2ea49c79615c">More...</a><br /></td></tr>
+<tr class="separator:a7a64288f002cf62b492e2ea49c79615c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a385661894f3cee9c549bfe07a8b316bf"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxBuffer.html#a385661894f3cee9c549bfe07a8b316bf">capacity</a></td></tr>
+<tr class="memdesc:a385661894f3cee9c549bfe07a8b316bf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Current capacity (i.e.  <a href="#a385661894f3cee9c549bfe07a8b316bf">More...</a><br /></td></tr>
+<tr class="separator:a385661894f3cee9c549bfe07a8b316bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aec0aea8325394951d5ad4a9fbb8e1ac7"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxBuffer.html#aec0aea8325394951d5ad4a9fbb8e1ac7">size</a></td></tr>
+<tr class="memdesc:aec0aea8325394951d5ad4a9fbb8e1ac7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Current size of the buffer content.  <a href="#aec0aea8325394951d5ad4a9fbb8e1ac7">More...</a><br /></td></tr>
+<tr class="separator:aec0aea8325394951d5ad4a9fbb8e1ac7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac642e07b0a03be5aac48eb4aa5bec2f7"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxBuffer.html#ac642e07b0a03be5aac48eb4aa5bec2f7">flags</a></td></tr>
+<tr class="memdesc:ac642e07b0a03be5aac48eb4aa5bec2f7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flag register for buffer features.  <a href="#ac642e07b0a03be5aac48eb4aa5bec2f7">More...</a><br /></td></tr>
+<tr class="separator:ac642e07b0a03be5aac48eb4aa5bec2f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>UCX Buffer. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a385661894f3cee9c549bfe07a8b316bf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a385661894f3cee9c549bfe07a8b316bf">&#9670;&nbsp;</a></span>capacity</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t UcxBuffer::capacity</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Current capacity (i.e. </p>
+<p>maximum size) of the buffer. </p>
+
+</div>
+</div>
+<a id="ac642e07b0a03be5aac48eb4aa5bec2f7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac642e07b0a03be5aac48eb4aa5bec2f7">&#9670;&nbsp;</a></span>flags</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int UcxBuffer::flags</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Flag register for buffer features. </p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="buffer_8h.html#acc77c8ed7b26854f555d4a5d11e49ea2" title="No buffer features enabled (all flags cleared). ">UCX_BUFFER_DEFAULT</a> </dd>
+<dd>
+<a class="el" href="buffer_8h.html#a8bab11ad8a76719228b9ee91e2e45535" title="If this flag is enabled, the buffer will automatically free its contents. ">UCX_BUFFER_AUTOFREE</a> </dd>
+<dd>
+<a class="el" href="buffer_8h.html#a05f9565f2d04399168c3b1c152a632be" title="If this flag is enabled, the buffer will automatically extends its capacity. ">UCX_BUFFER_AUTOEXTEND</a> </dd></dl>
+
+</div>
+</div>
+<a id="a7a64288f002cf62b492e2ea49c79615c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7a64288f002cf62b492e2ea49c79615c">&#9670;&nbsp;</a></span>pos</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t UcxBuffer::pos</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Current position of the buffer. </p>
+
+</div>
+</div>
+<a id="aec0aea8325394951d5ad4a9fbb8e1ac7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aec0aea8325394951d5ad4a9fbb8e1ac7">&#9670;&nbsp;</a></span>size</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t UcxBuffer::size</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Current size of the buffer content. </p>
+
+</div>
+</div>
+<a id="a1a5076e85acb84b715a53bc0f37fb721"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1a5076e85acb84b715a53bc0f37fb721">&#9670;&nbsp;</a></span>space</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* UcxBuffer::space</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>A pointer to the buffer contents. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="buffer_8h_source.html">buffer.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/structUcxKey.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: UcxKey Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">UcxKey Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Structure to publicly denote a key of a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>.  
+ <a href="structUcxKey.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="map_8h_source.html">map.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a6176109f25b34f3fa92bcfbc8ae7a88c"><td class="memItemLeft" align="right" valign="top">const void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxKey.html#a6176109f25b34f3fa92bcfbc8ae7a88c">data</a></td></tr>
+<tr class="memdesc:a6176109f25b34f3fa92bcfbc8ae7a88c"><td class="mdescLeft">&#160;</td><td class="mdescRight">The key data.  <a href="#a6176109f25b34f3fa92bcfbc8ae7a88c">More...</a><br /></td></tr>
+<tr class="separator:a6176109f25b34f3fa92bcfbc8ae7a88c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abef01de37f355688f2ac797d2c280683"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxKey.html#abef01de37f355688f2ac797d2c280683">len</a></td></tr>
+<tr class="memdesc:abef01de37f355688f2ac797d2c280683"><td class="mdescLeft">&#160;</td><td class="mdescRight">The length of the key data.  <a href="#abef01de37f355688f2ac797d2c280683">More...</a><br /></td></tr>
+<tr class="separator:abef01de37f355688f2ac797d2c280683"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aac9d372ac34a4cbd8459e2b04e505752"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxKey.html#aac9d372ac34a4cbd8459e2b04e505752">hash</a></td></tr>
+<tr class="memdesc:aac9d372ac34a4cbd8459e2b04e505752"><td class="mdescLeft">&#160;</td><td class="mdescRight">A cache for the hash value of the key data.  <a href="#aac9d372ac34a4cbd8459e2b04e505752">More...</a><br /></td></tr>
+<tr class="separator:aac9d372ac34a4cbd8459e2b04e505752"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Structure to publicly denote a key of a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a6176109f25b34f3fa92bcfbc8ae7a88c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6176109f25b34f3fa92bcfbc8ae7a88c">&#9670;&nbsp;</a></span>data</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const void* UcxKey::data</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The key data. </p>
+
+</div>
+</div>
+<a id="aac9d372ac34a4cbd8459e2b04e505752"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aac9d372ac34a4cbd8459e2b04e505752">&#9670;&nbsp;</a></span>hash</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int UcxKey::hash</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>A cache for the hash value of the key data. </p>
+
+</div>
+</div>
+<a id="abef01de37f355688f2ac797d2c280683"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abef01de37f355688f2ac797d2c280683">&#9670;&nbsp;</a></span>len</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t UcxKey::len</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The length of the key data. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="map_8h_source.html">map.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/structUcxList.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: UcxList Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">UcxList Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>UCX list structure.  
+ <a href="structUcxList.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="list_8h_source.html">list.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a4a44905121b6fc2a088084ce578a9ea2"><td class="memItemLeft" align="right" valign="top"><a id="a4a44905121b6fc2a088084ce578a9ea2"></a>
+void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxList.html#a4a44905121b6fc2a088084ce578a9ea2">data</a></td></tr>
+<tr class="memdesc:a4a44905121b6fc2a088084ce578a9ea2"><td class="mdescLeft">&#160;</td><td class="mdescRight">List element payload. <br /></td></tr>
+<tr class="separator:a4a44905121b6fc2a088084ce578a9ea2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a82a1818f1abf765b026fa91478569a8f"><td class="memItemLeft" align="right" valign="top"><a id="a82a1818f1abf765b026fa91478569a8f"></a>
+<a class="el" href="structUcxList.html">UcxList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxList.html#a82a1818f1abf765b026fa91478569a8f">next</a></td></tr>
+<tr class="memdesc:a82a1818f1abf765b026fa91478569a8f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pointer to the next list element or <code>NULL</code>, if this is the last element. <br /></td></tr>
+<tr class="separator:a82a1818f1abf765b026fa91478569a8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0f1fddce9088b9c1414745d0b1b5c08b"><td class="memItemLeft" align="right" valign="top"><a id="a0f1fddce9088b9c1414745d0b1b5c08b"></a>
+<a class="el" href="structUcxList.html">UcxList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxList.html#a0f1fddce9088b9c1414745d0b1b5c08b">prev</a></td></tr>
+<tr class="memdesc:a0f1fddce9088b9c1414745d0b1b5c08b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pointer to the previous list element or <code>NULL</code>, if this is the first element. <br /></td></tr>
+<tr class="separator:a0f1fddce9088b9c1414745d0b1b5c08b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>UCX list structure. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="list_8h_source.html">list.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/structUcxLogger.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,213 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: UcxLogger Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">UcxLogger Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>The UCX Logger object.  
+ <a href="structUcxLogger.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="logging_8h_source.html">logging.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a33fddf4791e8d49e479ecc78bf5d1b9e"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxLogger.html#a33fddf4791e8d49e479ecc78bf5d1b9e">stream</a></td></tr>
+<tr class="memdesc:a33fddf4791e8d49e479ecc78bf5d1b9e"><td class="mdescLeft">&#160;</td><td class="mdescRight">The stream this logger writes its messages to.  <a href="#a33fddf4791e8d49e479ecc78bf5d1b9e">More...</a><br /></td></tr>
+<tr class="separator:a33fddf4791e8d49e479ecc78bf5d1b9e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ada13bba090a9dc4f8d6cd9be73c60930"><td class="memItemLeft" align="right" valign="top"><a class="el" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxLogger.html#ada13bba090a9dc4f8d6cd9be73c60930">writer</a></td></tr>
+<tr class="memdesc:ada13bba090a9dc4f8d6cd9be73c60930"><td class="mdescLeft">&#160;</td><td class="mdescRight">The write function that shall be used.  <a href="#ada13bba090a9dc4f8d6cd9be73c60930">More...</a><br /></td></tr>
+<tr class="separator:ada13bba090a9dc4f8d6cd9be73c60930"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a086f75df0f6c81ec491f25c0a4d9262b"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxLogger.html#a086f75df0f6c81ec491f25c0a4d9262b">dateformat</a></td></tr>
+<tr class="memdesc:a086f75df0f6c81ec491f25c0a4d9262b"><td class="mdescLeft">&#160;</td><td class="mdescRight">The date format for timestamp outputs including the delimiter (default: <code>"%F %T %z "</code>).  <a href="#a086f75df0f6c81ec491f25c0a4d9262b">More...</a><br /></td></tr>
+<tr class="separator:a086f75df0f6c81ec491f25c0a4d9262b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2e0ee94c25b2307096c7970280d189cd"><td class="memItemLeft" align="right" valign="top">unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxLogger.html#a2e0ee94c25b2307096c7970280d189cd">level</a></td></tr>
+<tr class="memdesc:a2e0ee94c25b2307096c7970280d189cd"><td class="mdescLeft">&#160;</td><td class="mdescRight">The level, this logger operates on.  <a href="#a2e0ee94c25b2307096c7970280d189cd">More...</a><br /></td></tr>
+<tr class="separator:a2e0ee94c25b2307096c7970280d189cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1de0db2e02dcf03366268f6943f8b97c"><td class="memItemLeft" align="right" valign="top">unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxLogger.html#a1de0db2e02dcf03366268f6943f8b97c">mask</a></td></tr>
+<tr class="memdesc:a1de0db2e02dcf03366268f6943f8b97c"><td class="mdescLeft">&#160;</td><td class="mdescRight">A configuration mask for automatic output.  <a href="#a1de0db2e02dcf03366268f6943f8b97c">More...</a><br /></td></tr>
+<tr class="separator:a1de0db2e02dcf03366268f6943f8b97c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a187129f7bc6e5064b3d92a5f1217f396"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxMap.html">UcxMap</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxLogger.html#a187129f7bc6e5064b3d92a5f1217f396">levels</a></td></tr>
+<tr class="memdesc:a187129f7bc6e5064b3d92a5f1217f396"><td class="mdescLeft">&#160;</td><td class="mdescRight">A map of valid log levels for this logger.  <a href="#a187129f7bc6e5064b3d92a5f1217f396">More...</a><br /></td></tr>
+<tr class="separator:a187129f7bc6e5064b3d92a5f1217f396"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>The UCX Logger object. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a086f75df0f6c81ec491f25c0a4d9262b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a086f75df0f6c81ec491f25c0a4d9262b">&#9670;&nbsp;</a></span>dateformat</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* UcxLogger::dateformat</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The date format for timestamp outputs including the delimiter (default: <code>"%F %T %z "</code>). </p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="logging_8h.html#a38607008268b4f776ee500fb95d2e823" title="Output flag for the timestmap. ">UCX_LOGGER_TIMESTAMP</a> </dd></dl>
+
+</div>
+</div>
+<a id="a2e0ee94c25b2307096c7970280d189cd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2e0ee94c25b2307096c7970280d189cd">&#9670;&nbsp;</a></span>level</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">unsigned int UcxLogger::level</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The level, this logger operates on. </p>
+<p>If a log command is issued, the message will only be logged, if the log level of the message is less or equal than the log level of the logger. </p>
+
+</div>
+</div>
+<a id="a187129f7bc6e5064b3d92a5f1217f396"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a187129f7bc6e5064b3d92a5f1217f396">&#9670;&nbsp;</a></span>levels</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a>* UcxLogger::levels</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>A map of valid log levels for this logger. </p>
+<p>The keys represent all valid log levels and the values provide string representations, that are used, if the UCX_LOGGER_LEVEL flag is set.</p>
+<p>The exact data types are <code>unsigned int</code> for the key and <code>const char*</code> for the value.</p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="logging_8h.html#aee18bc20e58ffb69910121512c350839" title="Output flag for the log level. ">UCX_LOGGER_LEVEL</a> </dd></dl>
+
+</div>
+</div>
+<a id="a1de0db2e02dcf03366268f6943f8b97c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1de0db2e02dcf03366268f6943f8b97c">&#9670;&nbsp;</a></span>mask</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">unsigned int UcxLogger::mask</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>A configuration mask for automatic output. </p>
+<p>For each flag that is set, the logger automatically outputs some extra information like the timestamp or the source file and line number. See the documentation for the flags for details. </p>
+
+</div>
+</div>
+<a id="a33fddf4791e8d49e479ecc78bf5d1b9e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a33fddf4791e8d49e479ecc78bf5d1b9e">&#9670;&nbsp;</a></span>stream</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* UcxLogger::stream</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The stream this logger writes its messages to. </p>
+
+</div>
+</div>
+<a id="ada13bba090a9dc4f8d6cd9be73c60930"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ada13bba090a9dc4f8d6cd9be73c60930">&#9670;&nbsp;</a></span>writer</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a> UcxLogger::writer</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The write function that shall be used. </p>
+<p>For standard file or stdout loggers this might be standard fwrite (default). </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="logging_8h_source.html">logging.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/structUcxMap.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,168 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: UcxMap Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">UcxMap Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Structure for the UCX map.  
+ <a href="structUcxMap.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="map_8h_source.html">map.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a531f3e481c1c331cf037b916192e974d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxMap.html#a531f3e481c1c331cf037b916192e974d">allocator</a></td></tr>
+<tr class="memdesc:a531f3e481c1c331cf037b916192e974d"><td class="mdescLeft">&#160;</td><td class="mdescRight">An allocator that is used for the map elements.  <a href="#a531f3e481c1c331cf037b916192e974d">More...</a><br /></td></tr>
+<tr class="separator:a531f3e481c1c331cf037b916192e974d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5792b5037c4f77ea3cb144b66c9b8790"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxMapElement.html">UcxMapElement</a> **&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxMap.html#a5792b5037c4f77ea3cb144b66c9b8790">map</a></td></tr>
+<tr class="memdesc:a5792b5037c4f77ea3cb144b66c9b8790"><td class="mdescLeft">&#160;</td><td class="mdescRight">The array of map element lists.  <a href="#a5792b5037c4f77ea3cb144b66c9b8790">More...</a><br /></td></tr>
+<tr class="separator:a5792b5037c4f77ea3cb144b66c9b8790"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe120846b26d99580a7ff1276464e838"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxMap.html#afe120846b26d99580a7ff1276464e838">size</a></td></tr>
+<tr class="memdesc:afe120846b26d99580a7ff1276464e838"><td class="mdescLeft">&#160;</td><td class="mdescRight">The size of the map is the length of the element list array.  <a href="#afe120846b26d99580a7ff1276464e838">More...</a><br /></td></tr>
+<tr class="separator:afe120846b26d99580a7ff1276464e838"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a14e9163f71f6c014dfa2103de70ae9cd"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxMap.html#a14e9163f71f6c014dfa2103de70ae9cd">count</a></td></tr>
+<tr class="memdesc:a14e9163f71f6c014dfa2103de70ae9cd"><td class="mdescLeft">&#160;</td><td class="mdescRight">The count of elements currently stored in this map.  <a href="#a14e9163f71f6c014dfa2103de70ae9cd">More...</a><br /></td></tr>
+<tr class="separator:a14e9163f71f6c014dfa2103de70ae9cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Structure for the UCX map. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a531f3e481c1c331cf037b916192e974d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a531f3e481c1c331cf037b916192e974d">&#9670;&nbsp;</a></span>allocator</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxAllocator.html">UcxAllocator</a>* UcxMap::allocator</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>An allocator that is used for the map elements. </p>
+
+</div>
+</div>
+<a id="a14e9163f71f6c014dfa2103de70ae9cd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a14e9163f71f6c014dfa2103de70ae9cd">&#9670;&nbsp;</a></span>count</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t UcxMap::count</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The count of elements currently stored in this map. </p>
+
+</div>
+</div>
+<a id="a5792b5037c4f77ea3cb144b66c9b8790"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5792b5037c4f77ea3cb144b66c9b8790">&#9670;&nbsp;</a></span>map</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxMapElement.html">UcxMapElement</a>** UcxMap::map</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The array of map element lists. </p>
+
+</div>
+</div>
+<a id="afe120846b26d99580a7ff1276464e838"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afe120846b26d99580a7ff1276464e838">&#9670;&nbsp;</a></span>size</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t UcxMap::size</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The size of the map is the length of the element list array. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="map_8h_source.html">map.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/structUcxMapElement.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: UcxMapElement Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">UcxMapElement Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Structure for an element of a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>.  
+ <a href="structUcxMapElement.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="map_8h_source.html">map.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:abbd7f3bf5beef370f702d2d5bb07733c"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxMapElement.html#abbd7f3bf5beef370f702d2d5bb07733c">data</a></td></tr>
+<tr class="memdesc:abbd7f3bf5beef370f702d2d5bb07733c"><td class="mdescLeft">&#160;</td><td class="mdescRight">The value data.  <a href="#abbd7f3bf5beef370f702d2d5bb07733c">More...</a><br /></td></tr>
+<tr class="separator:abbd7f3bf5beef370f702d2d5bb07733c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a99fe8188b0889201d70ff5f922deef51"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxMapElement.html">UcxMapElement</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxMapElement.html#a99fe8188b0889201d70ff5f922deef51">next</a></td></tr>
+<tr class="memdesc:a99fe8188b0889201d70ff5f922deef51"><td class="mdescLeft">&#160;</td><td class="mdescRight">A pointer to the next element in the current list.  <a href="#a99fe8188b0889201d70ff5f922deef51">More...</a><br /></td></tr>
+<tr class="separator:a99fe8188b0889201d70ff5f922deef51"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa446141b708e106e2c8de1303318187c"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structUcxMapKey.html">UcxMapKey</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxMapElement.html#aa446141b708e106e2c8de1303318187c">key</a></td></tr>
+<tr class="memdesc:aa446141b708e106e2c8de1303318187c"><td class="mdescLeft">&#160;</td><td class="mdescRight">The corresponding key.  <a href="#aa446141b708e106e2c8de1303318187c">More...</a><br /></td></tr>
+<tr class="separator:aa446141b708e106e2c8de1303318187c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Structure for an element of a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="abbd7f3bf5beef370f702d2d5bb07733c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abbd7f3bf5beef370f702d2d5bb07733c">&#9670;&nbsp;</a></span>data</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* UcxMapElement::data</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The value data. </p>
+
+</div>
+</div>
+<a id="aa446141b708e106e2c8de1303318187c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa446141b708e106e2c8de1303318187c">&#9670;&nbsp;</a></span>key</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">struct <a class="el" href="structUcxMapKey.html">UcxMapKey</a> UcxMapElement::key</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The corresponding key. </p>
+
+</div>
+</div>
+<a id="a99fe8188b0889201d70ff5f922deef51"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a99fe8188b0889201d70ff5f922deef51">&#9670;&nbsp;</a></span>next</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxMapElement.html">UcxMapElement</a>* UcxMapElement::next</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>A pointer to the next element in the current list. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="map_8h_source.html">map.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/structUcxMapIterator.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: UcxMapIterator Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">UcxMapIterator Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Structure for an iterator over a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>.  
+ <a href="structUcxMapIterator.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="map_8h_source.html">map.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:af88d6e22547d09fe1d665dd650dcdb95"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxMap.html">UcxMap</a> const  *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxMapIterator.html#af88d6e22547d09fe1d665dd650dcdb95">map</a></td></tr>
+<tr class="memdesc:af88d6e22547d09fe1d665dd650dcdb95"><td class="mdescLeft">&#160;</td><td class="mdescRight">The map to iterate over.  <a href="#af88d6e22547d09fe1d665dd650dcdb95">More...</a><br /></td></tr>
+<tr class="separator:af88d6e22547d09fe1d665dd650dcdb95"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af1fc40f899f37280adb5b85acf6e742f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxMapElement.html">UcxMapElement</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxMapIterator.html#af1fc40f899f37280adb5b85acf6e742f">cur</a></td></tr>
+<tr class="memdesc:af1fc40f899f37280adb5b85acf6e742f"><td class="mdescLeft">&#160;</td><td class="mdescRight">The current map element.  <a href="#af1fc40f899f37280adb5b85acf6e742f">More...</a><br /></td></tr>
+<tr class="separator:af1fc40f899f37280adb5b85acf6e742f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac2376545c8816dd6895de4995e558c65"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxMapIterator.html#ac2376545c8816dd6895de4995e558c65">index</a></td></tr>
+<tr class="memdesc:ac2376545c8816dd6895de4995e558c65"><td class="mdescLeft">&#160;</td><td class="mdescRight">The current index of the element list array.  <a href="#ac2376545c8816dd6895de4995e558c65">More...</a><br /></td></tr>
+<tr class="separator:ac2376545c8816dd6895de4995e558c65"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Structure for an iterator over a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="af1fc40f899f37280adb5b85acf6e742f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af1fc40f899f37280adb5b85acf6e742f">&#9670;&nbsp;</a></span>cur</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxMapElement.html">UcxMapElement</a>* UcxMapIterator::cur</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The current map element. </p>
+
+</div>
+</div>
+<a id="ac2376545c8816dd6895de4995e558c65"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac2376545c8816dd6895de4995e558c65">&#9670;&nbsp;</a></span>index</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t UcxMapIterator::index</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The current index of the element list array. </p>
+<p><b>Attention: </b> this is <b>NOT</b> the element index! Do <b>NOT</b> manually iterate over the map by increasing this index. Use <a class="el" href="map_8h.html#aceb8675abf44860b4bbc301bbada5b91" title="Proceeds to the next element of the map (if any). ">ucx_map_iter_next()</a>. </p><dl class="section see"><dt>See also</dt><dd><a class="el" href="structUcxMap.html#a5792b5037c4f77ea3cb144b66c9b8790" title="The array of map element lists. ">UcxMap.map</a> </dd></dl>
+
+</div>
+</div>
+<a id="af88d6e22547d09fe1d665dd650dcdb95"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af88d6e22547d09fe1d665dd650dcdb95">&#9670;&nbsp;</a></span>map</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxMap.html">UcxMap</a> const* UcxMapIterator::map</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The map to iterate over. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="map_8h_source.html">map.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/structUcxMapKey.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: UcxMapKey Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">UcxMapKey Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Internal structure for a key of a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>.  
+ <a href="structUcxMapKey.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="map_8h_source.html">map.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ab71d1841e4f538628c00f782267fb6d5"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxMapKey.html#ab71d1841e4f538628c00f782267fb6d5">data</a></td></tr>
+<tr class="memdesc:ab71d1841e4f538628c00f782267fb6d5"><td class="mdescLeft">&#160;</td><td class="mdescRight">The key data.  <a href="#ab71d1841e4f538628c00f782267fb6d5">More...</a><br /></td></tr>
+<tr class="separator:ab71d1841e4f538628c00f782267fb6d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a504d46caa45c79cd87ff8cd835654270"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxMapKey.html#a504d46caa45c79cd87ff8cd835654270">len</a></td></tr>
+<tr class="memdesc:a504d46caa45c79cd87ff8cd835654270"><td class="mdescLeft">&#160;</td><td class="mdescRight">The length of the key data.  <a href="#a504d46caa45c79cd87ff8cd835654270">More...</a><br /></td></tr>
+<tr class="separator:a504d46caa45c79cd87ff8cd835654270"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a34c1f8fec98174583944fffd30e7c913"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxMapKey.html#a34c1f8fec98174583944fffd30e7c913">hash</a></td></tr>
+<tr class="memdesc:a34c1f8fec98174583944fffd30e7c913"><td class="mdescLeft">&#160;</td><td class="mdescRight">The hash value of the key data.  <a href="#a34c1f8fec98174583944fffd30e7c913">More...</a><br /></td></tr>
+<tr class="separator:a34c1f8fec98174583944fffd30e7c913"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Internal structure for a key of a <a class="el" href="structUcxMap.html" title="Structure for the UCX map. ">UcxMap</a>. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="ab71d1841e4f538628c00f782267fb6d5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab71d1841e4f538628c00f782267fb6d5">&#9670;&nbsp;</a></span>data</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* UcxMapKey::data</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The key data. </p>
+
+</div>
+</div>
+<a id="a34c1f8fec98174583944fffd30e7c913"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a34c1f8fec98174583944fffd30e7c913">&#9670;&nbsp;</a></span>hash</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int UcxMapKey::hash</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The hash value of the key data. </p>
+
+</div>
+</div>
+<a id="a504d46caa45c79cd87ff8cd835654270"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a504d46caa45c79cd87ff8cd835654270">&#9670;&nbsp;</a></span>len</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t UcxMapKey::len</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The length of the key data. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="map_8h_source.html">map.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/structUcxMempool.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,153 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: UcxMempool Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">UcxMempool Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>UCX mempool structure.  
+ <a href="structUcxMempool.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="mempool_8h_source.html">mempool.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ac45fd1e9269399e4c434d6bdaa770d92"><td class="memItemLeft" align="right" valign="top"><a id="ac45fd1e9269399e4c434d6bdaa770d92"></a>
+<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxMempool.html#ac45fd1e9269399e4c434d6bdaa770d92">allocator</a></td></tr>
+<tr class="memdesc:ac45fd1e9269399e4c434d6bdaa770d92"><td class="mdescLeft">&#160;</td><td class="mdescRight"><a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a> based on this pool. <br /></td></tr>
+<tr class="separator:ac45fd1e9269399e4c434d6bdaa770d92"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae98c1b0150bb119ee0a8506a6f310d6e"><td class="memItemLeft" align="right" valign="top">void **&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxMempool.html#ae98c1b0150bb119ee0a8506a6f310d6e">data</a></td></tr>
+<tr class="memdesc:ae98c1b0150bb119ee0a8506a6f310d6e"><td class="mdescLeft">&#160;</td><td class="mdescRight">List of pointers to pooled memory.  <a href="#ae98c1b0150bb119ee0a8506a6f310d6e">More...</a><br /></td></tr>
+<tr class="separator:ae98c1b0150bb119ee0a8506a6f310d6e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa3a73ab231e1bc207d526f46f1c1e23a"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxMempool.html#aa3a73ab231e1bc207d526f46f1c1e23a">ndata</a></td></tr>
+<tr class="memdesc:aa3a73ab231e1bc207d526f46f1c1e23a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Count of pooled memory items.  <a href="#aa3a73ab231e1bc207d526f46f1c1e23a">More...</a><br /></td></tr>
+<tr class="separator:aa3a73ab231e1bc207d526f46f1c1e23a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a304729986f2894971d0469e71e196bf0"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxMempool.html#a304729986f2894971d0469e71e196bf0">size</a></td></tr>
+<tr class="memdesc:a304729986f2894971d0469e71e196bf0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Memory pool size.  <a href="#a304729986f2894971d0469e71e196bf0">More...</a><br /></td></tr>
+<tr class="separator:a304729986f2894971d0469e71e196bf0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>UCX mempool structure. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="ae98c1b0150bb119ee0a8506a6f310d6e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae98c1b0150bb119ee0a8506a6f310d6e">&#9670;&nbsp;</a></span>data</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void** UcxMempool::data</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>List of pointers to pooled memory. </p>
+
+</div>
+</div>
+<a id="aa3a73ab231e1bc207d526f46f1c1e23a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa3a73ab231e1bc207d526f46f1c1e23a">&#9670;&nbsp;</a></span>ndata</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t UcxMempool::ndata</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Count of pooled memory items. </p>
+
+</div>
+</div>
+<a id="a304729986f2894971d0469e71e196bf0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a304729986f2894971d0469e71e196bf0">&#9670;&nbsp;</a></span>size</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t UcxMempool::size</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Memory pool size. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="mempool_8h_source.html">mempool.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/structUcxProperties.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,313 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: UcxProperties Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">UcxProperties Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p><a class="el" href="structUcxProperties.html" title="UcxProperties object for parsing properties data. ">UcxProperties</a> object for parsing properties data.  
+ <a href="structUcxProperties.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="properties_8h_source.html">properties.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a6bb4d29686df41a0f42641ee15232bfd"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxProperties.html#a6bb4d29686df41a0f42641ee15232bfd">buffer</a></td></tr>
+<tr class="memdesc:a6bb4d29686df41a0f42641ee15232bfd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Input buffer (don't set manually).  <a href="#a6bb4d29686df41a0f42641ee15232bfd">More...</a><br /></td></tr>
+<tr class="separator:a6bb4d29686df41a0f42641ee15232bfd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4e7524434525267e29f493a25dcca6b5"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxProperties.html#a4e7524434525267e29f493a25dcca6b5">buflen</a></td></tr>
+<tr class="memdesc:a4e7524434525267e29f493a25dcca6b5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Length of the input buffer (don't set manually).  <a href="#a4e7524434525267e29f493a25dcca6b5">More...</a><br /></td></tr>
+<tr class="separator:a4e7524434525267e29f493a25dcca6b5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:addd36ac8e5e42241c0a57453633970db"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxProperties.html#addd36ac8e5e42241c0a57453633970db">pos</a></td></tr>
+<tr class="memdesc:addd36ac8e5e42241c0a57453633970db"><td class="mdescLeft">&#160;</td><td class="mdescRight">Current buffer position (don't set manually).  <a href="#addd36ac8e5e42241c0a57453633970db">More...</a><br /></td></tr>
+<tr class="separator:addd36ac8e5e42241c0a57453633970db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a68556d4260153f58dde44e4c365edce6"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxProperties.html#a68556d4260153f58dde44e4c365edce6">tmp</a></td></tr>
+<tr class="memdesc:a68556d4260153f58dde44e4c365edce6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Internal temporary buffer (don't set manually).  <a href="#a68556d4260153f58dde44e4c365edce6">More...</a><br /></td></tr>
+<tr class="separator:a68556d4260153f58dde44e4c365edce6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8a81853d5903bee2f4e1fa53fdffae6e"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxProperties.html#a8a81853d5903bee2f4e1fa53fdffae6e">tmplen</a></td></tr>
+<tr class="memdesc:a8a81853d5903bee2f4e1fa53fdffae6e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Internal temporary buffer length (don't set manually).  <a href="#a8a81853d5903bee2f4e1fa53fdffae6e">More...</a><br /></td></tr>
+<tr class="separator:a8a81853d5903bee2f4e1fa53fdffae6e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5af10131ea9f679b4ee174499f92e210"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxProperties.html#a5af10131ea9f679b4ee174499f92e210">tmpcap</a></td></tr>
+<tr class="memdesc:a5af10131ea9f679b4ee174499f92e210"><td class="mdescLeft">&#160;</td><td class="mdescRight">Internal temporary buffer capacity (don't set manually).  <a href="#a5af10131ea9f679b4ee174499f92e210">More...</a><br /></td></tr>
+<tr class="separator:a5af10131ea9f679b4ee174499f92e210"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a34f71a6ab6dcb6892e3b4eb802e75bff"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxProperties.html#a34f71a6ab6dcb6892e3b4eb802e75bff">error</a></td></tr>
+<tr class="memdesc:a34f71a6ab6dcb6892e3b4eb802e75bff"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parser error code.  <a href="#a34f71a6ab6dcb6892e3b4eb802e75bff">More...</a><br /></td></tr>
+<tr class="separator:a34f71a6ab6dcb6892e3b4eb802e75bff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af6adb3f69616cf9d2bb5ea7b4d837ca5"><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxProperties.html#af6adb3f69616cf9d2bb5ea7b4d837ca5">delimiter</a></td></tr>
+<tr class="memdesc:af6adb3f69616cf9d2bb5ea7b4d837ca5"><td class="mdescLeft">&#160;</td><td class="mdescRight">The delimiter that shall be used.  <a href="#af6adb3f69616cf9d2bb5ea7b4d837ca5">More...</a><br /></td></tr>
+<tr class="separator:af6adb3f69616cf9d2bb5ea7b4d837ca5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afaa2e6a289fa6949b7b01df35fa5def8"><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxProperties.html#afaa2e6a289fa6949b7b01df35fa5def8">comment1</a></td></tr>
+<tr class="memdesc:afaa2e6a289fa6949b7b01df35fa5def8"><td class="mdescLeft">&#160;</td><td class="mdescRight">The first comment character.  <a href="#afaa2e6a289fa6949b7b01df35fa5def8">More...</a><br /></td></tr>
+<tr class="separator:afaa2e6a289fa6949b7b01df35fa5def8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ea7ecb414ca8bc7bef62cdd19cc6363"><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxProperties.html#a9ea7ecb414ca8bc7bef62cdd19cc6363">comment2</a></td></tr>
+<tr class="memdesc:a9ea7ecb414ca8bc7bef62cdd19cc6363"><td class="mdescLeft">&#160;</td><td class="mdescRight">The second comment character.  <a href="#a9ea7ecb414ca8bc7bef62cdd19cc6363">More...</a><br /></td></tr>
+<tr class="separator:a9ea7ecb414ca8bc7bef62cdd19cc6363"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5f3e561e32bac03e36a191a6940cca92"><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxProperties.html#a5f3e561e32bac03e36a191a6940cca92">comment3</a></td></tr>
+<tr class="memdesc:a5f3e561e32bac03e36a191a6940cca92"><td class="mdescLeft">&#160;</td><td class="mdescRight">The third comment character.  <a href="#a5f3e561e32bac03e36a191a6940cca92">More...</a><br /></td></tr>
+<tr class="separator:a5f3e561e32bac03e36a191a6940cca92"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p><a class="el" href="structUcxProperties.html" title="UcxProperties object for parsing properties data. ">UcxProperties</a> object for parsing properties data. </p>
+<p>Most of the fields are for internal use only. You may configure the properties parser, e.g. by changing the used delimiter or specifying up to three different characters that shall introduce comments. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a6bb4d29686df41a0f42641ee15232bfd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6bb4d29686df41a0f42641ee15232bfd">&#9670;&nbsp;</a></span>buffer</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* UcxProperties::buffer</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Input buffer (don't set manually). </p>
+<p>Automatically set by calls to <a class="el" href="properties_8h.html#aaf8de121764a4d22c763ff2ab41f3a4d" title="Sets the input buffer for the properties parser. ">ucx_properties_fill()</a>. </p>
+
+</div>
+</div>
+<a id="a4e7524434525267e29f493a25dcca6b5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4e7524434525267e29f493a25dcca6b5">&#9670;&nbsp;</a></span>buflen</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t UcxProperties::buflen</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Length of the input buffer (don't set manually). </p>
+<p>Automatically set by calls to <a class="el" href="properties_8h.html#aaf8de121764a4d22c763ff2ab41f3a4d" title="Sets the input buffer for the properties parser. ">ucx_properties_fill()</a>. </p>
+
+</div>
+</div>
+<a id="afaa2e6a289fa6949b7b01df35fa5def8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afaa2e6a289fa6949b7b01df35fa5def8">&#9670;&nbsp;</a></span>comment1</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char UcxProperties::comment1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The first comment character. </p>
+<p>This is '#' by default. </p>
+
+</div>
+</div>
+<a id="a9ea7ecb414ca8bc7bef62cdd19cc6363"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9ea7ecb414ca8bc7bef62cdd19cc6363">&#9670;&nbsp;</a></span>comment2</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char UcxProperties::comment2</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The second comment character. </p>
+<p>This is not set by default. </p>
+
+</div>
+</div>
+<a id="a5f3e561e32bac03e36a191a6940cca92"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5f3e561e32bac03e36a191a6940cca92">&#9670;&nbsp;</a></span>comment3</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char UcxProperties::comment3</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The third comment character. </p>
+<p>This is not set by default. </p>
+
+</div>
+</div>
+<a id="af6adb3f69616cf9d2bb5ea7b4d837ca5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af6adb3f69616cf9d2bb5ea7b4d837ca5">&#9670;&nbsp;</a></span>delimiter</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char UcxProperties::delimiter</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The delimiter that shall be used. </p>
+<p>This is '=' by default. </p>
+
+</div>
+</div>
+<a id="a34f71a6ab6dcb6892e3b4eb802e75bff"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a34f71a6ab6dcb6892e3b4eb802e75bff">&#9670;&nbsp;</a></span>error</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int UcxProperties::error</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Parser error code. </p>
+<p>This is always 0 on success and a nonzero value on syntax errors. The value is set by <a class="el" href="properties_8h.html#a7e03bc573d45d48c538cd721e810d33c" title="Retrieves the next key/value-pair. ">ucx_properties_next()</a>. </p>
+
+</div>
+</div>
+<a id="addd36ac8e5e42241c0a57453633970db"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#addd36ac8e5e42241c0a57453633970db">&#9670;&nbsp;</a></span>pos</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t UcxProperties::pos</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Current buffer position (don't set manually). </p>
+<p>Used by <a class="el" href="properties_8h.html#a7e03bc573d45d48c538cd721e810d33c" title="Retrieves the next key/value-pair. ">ucx_properties_next()</a>. </p>
+
+</div>
+</div>
+<a id="a68556d4260153f58dde44e4c365edce6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a68556d4260153f58dde44e4c365edce6">&#9670;&nbsp;</a></span>tmp</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char* UcxProperties::tmp</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Internal temporary buffer (don't set manually). </p>
+<p>Used by <a class="el" href="properties_8h.html#a7e03bc573d45d48c538cd721e810d33c" title="Retrieves the next key/value-pair. ">ucx_properties_next()</a>. </p>
+
+</div>
+</div>
+<a id="a5af10131ea9f679b4ee174499f92e210"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5af10131ea9f679b4ee174499f92e210">&#9670;&nbsp;</a></span>tmpcap</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t UcxProperties::tmpcap</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Internal temporary buffer capacity (don't set manually). </p>
+<p>Used by <a class="el" href="properties_8h.html#a7e03bc573d45d48c538cd721e810d33c" title="Retrieves the next key/value-pair. ">ucx_properties_next()</a>. </p>
+
+</div>
+</div>
+<a id="a8a81853d5903bee2f4e1fa53fdffae6e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8a81853d5903bee2f4e1fa53fdffae6e">&#9670;&nbsp;</a></span>tmplen</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t UcxProperties::tmplen</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Internal temporary buffer length (don't set manually). </p>
+<p>Used by <a class="el" href="properties_8h.html#a7e03bc573d45d48c538cd721e810d33c" title="Retrieves the next key/value-pair. ">ucx_properties_next()</a>. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="properties_8h_source.html">properties.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/structUcxStack.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: UcxStack Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">UcxStack Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>UCX stack structure.  
+ <a href="structUcxStack.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="stack_8h_source.html">stack.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a33cda4f6890ac56ab31701598bc1ae10"><td class="memItemLeft" align="right" valign="top"><a id="a33cda4f6890ac56ab31701598bc1ae10"></a>
+<a class="el" href="structUcxAllocator.html">UcxAllocator</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxStack.html#a33cda4f6890ac56ab31701598bc1ae10">allocator</a></td></tr>
+<tr class="memdesc:a33cda4f6890ac56ab31701598bc1ae10"><td class="mdescLeft">&#160;</td><td class="mdescRight"><a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a> based on this stack. <br /></td></tr>
+<tr class="separator:a33cda4f6890ac56ab31701598bc1ae10"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4df86b1917bfc3bbf760220870638143"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxStack.html#a4df86b1917bfc3bbf760220870638143">size</a></td></tr>
+<tr class="memdesc:a4df86b1917bfc3bbf760220870638143"><td class="mdescLeft">&#160;</td><td class="mdescRight">Stack size.  <a href="#a4df86b1917bfc3bbf760220870638143">More...</a><br /></td></tr>
+<tr class="separator:a4df86b1917bfc3bbf760220870638143"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af64d528744bf3a47fec87d2e45d2992f"><td class="memItemLeft" align="right" valign="top"><a id="af64d528744bf3a47fec87d2e45d2992f"></a>
+char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxStack.html#af64d528744bf3a47fec87d2e45d2992f">space</a></td></tr>
+<tr class="memdesc:af64d528744bf3a47fec87d2e45d2992f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pointer to the bottom of the stack. <br /></td></tr>
+<tr class="separator:af64d528744bf3a47fec87d2e45d2992f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af0ff6f58edce469f17683013b86ade27"><td class="memItemLeft" align="right" valign="top"><a id="af0ff6f58edce469f17683013b86ade27"></a>
+char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxStack.html#af0ff6f58edce469f17683013b86ade27">top</a></td></tr>
+<tr class="memdesc:af0ff6f58edce469f17683013b86ade27"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pointer to the top of the stack. <br /></td></tr>
+<tr class="separator:af0ff6f58edce469f17683013b86ade27"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>UCX stack structure. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="a4df86b1917bfc3bbf760220870638143"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4df86b1917bfc3bbf760220870638143">&#9670;&nbsp;</a></span>size</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t UcxStack::size</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Stack size. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="stack_8h_source.html">stack.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/structUcxTestList.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,130 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: UcxTestList Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">UcxTestList Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Structure for the internal list of test cases.  
+ <a href="structUcxTestList.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="test_8h_source.html">test.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a6022faa52e772b073141ca0a2f5a56c9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="test_8h.html#ae906817354c010b83c2784260cce7a1c">UcxTest</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxTestList.html#a6022faa52e772b073141ca0a2f5a56c9">test</a></td></tr>
+<tr class="memdesc:a6022faa52e772b073141ca0a2f5a56c9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Test case.  <a href="#a6022faa52e772b073141ca0a2f5a56c9">More...</a><br /></td></tr>
+<tr class="separator:a6022faa52e772b073141ca0a2f5a56c9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeebb80ff75d9f6f82ab6dc2641a3c74e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxTestList.html">UcxTestList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxTestList.html#aeebb80ff75d9f6f82ab6dc2641a3c74e">next</a></td></tr>
+<tr class="memdesc:aeebb80ff75d9f6f82ab6dc2641a3c74e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pointer to the next list element.  <a href="#aeebb80ff75d9f6f82ab6dc2641a3c74e">More...</a><br /></td></tr>
+<tr class="separator:aeebb80ff75d9f6f82ab6dc2641a3c74e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Structure for the internal list of test cases. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="aeebb80ff75d9f6f82ab6dc2641a3c74e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aeebb80ff75d9f6f82ab6dc2641a3c74e">&#9670;&nbsp;</a></span>next</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxTestList.html">UcxTestList</a>* UcxTestList::next</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Pointer to the next list element. </p>
+
+</div>
+</div>
+<a id="a6022faa52e772b073141ca0a2f5a56c9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6022faa52e772b073141ca0a2f5a56c9">&#9670;&nbsp;</a></span>test</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="test_8h.html#ae906817354c010b83c2784260cce7a1c">UcxTest</a> UcxTestList::test</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Test case. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="test_8h_source.html">test.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/structUcxTestSuite.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: UcxTestSuite Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">UcxTestSuite Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>A test suite containing multiple test cases.  
+ <a href="structUcxTestSuite.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="test_8h_source.html">test.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a6cefa870a3c2e38d6ee682e38643dbbb"><td class="memItemLeft" align="right" valign="top">unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxTestSuite.html#a6cefa870a3c2e38d6ee682e38643dbbb">success</a></td></tr>
+<tr class="memdesc:a6cefa870a3c2e38d6ee682e38643dbbb"><td class="mdescLeft">&#160;</td><td class="mdescRight">The number of successful tests after the suite has been run.  <a href="#a6cefa870a3c2e38d6ee682e38643dbbb">More...</a><br /></td></tr>
+<tr class="separator:a6cefa870a3c2e38d6ee682e38643dbbb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abfd240541d1e956e49cde0ac36286951"><td class="memItemLeft" align="right" valign="top">unsigned int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxTestSuite.html#abfd240541d1e956e49cde0ac36286951">failure</a></td></tr>
+<tr class="memdesc:abfd240541d1e956e49cde0ac36286951"><td class="mdescLeft">&#160;</td><td class="mdescRight">The number of failed tests after the suite has been run.  <a href="#abfd240541d1e956e49cde0ac36286951">More...</a><br /></td></tr>
+<tr class="separator:abfd240541d1e956e49cde0ac36286951"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a630677a70ebc2c3296704cda3196492b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxTestList.html">UcxTestList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxTestSuite.html#a630677a70ebc2c3296704cda3196492b">tests</a></td></tr>
+<tr class="memdesc:a630677a70ebc2c3296704cda3196492b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Internal list of test cases.  <a href="#a630677a70ebc2c3296704cda3196492b">More...</a><br /></td></tr>
+<tr class="separator:a630677a70ebc2c3296704cda3196492b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A test suite containing multiple test cases. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="abfd240541d1e956e49cde0ac36286951"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abfd240541d1e956e49cde0ac36286951">&#9670;&nbsp;</a></span>failure</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">unsigned int UcxTestSuite::failure</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The number of failed tests after the suite has been run. </p>
+
+</div>
+</div>
+<a id="a6cefa870a3c2e38d6ee682e38643dbbb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6cefa870a3c2e38d6ee682e38643dbbb">&#9670;&nbsp;</a></span>success</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">unsigned int UcxTestSuite::success</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The number of successful tests after the suite has been run. </p>
+
+</div>
+</div>
+<a id="a630677a70ebc2c3296704cda3196492b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a630677a70ebc2c3296704cda3196492b">&#9670;&nbsp;</a></span>tests</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxTestList.html">UcxTestList</a>* UcxTestSuite::tests</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Internal list of test cases. </p>
+<p>Use <a class="el" href="test_8h.html#a8dfabc42f183d3a4d79379a5d17bf67d" title="Registers a test function with the specified test suite. ">ucx_test_register()</a> to add tests to this list. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="test_8h_source.html">test.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/structscstr__t.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: scstr_t Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">scstr_t Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>The UCX string structure for immutable (constant) strings.  
+ <a href="structscstr__t.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="string_8h_source.html">string.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a305fd48934b474a9bf4a40869030e391"><td class="memItemLeft" align="right" valign="top"><a id="a305fd48934b474a9bf4a40869030e391"></a>
+const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structscstr__t.html#a305fd48934b474a9bf4a40869030e391">ptr</a></td></tr>
+<tr class="memdesc:a305fd48934b474a9bf4a40869030e391"><td class="mdescLeft">&#160;</td><td class="mdescRight">A constant pointer to the immutable string (<b>not necessarily <code>NULL</code>-terminated</b>) <br /></td></tr>
+<tr class="separator:a305fd48934b474a9bf4a40869030e391"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaa0229f64f1057b6f65adededaa5a172"><td class="memItemLeft" align="right" valign="top"><a id="aaa0229f64f1057b6f65adededaa5a172"></a>
+size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structscstr__t.html#aaa0229f64f1057b6f65adededaa5a172">length</a></td></tr>
+<tr class="memdesc:aaa0229f64f1057b6f65adededaa5a172"><td class="mdescLeft">&#160;</td><td class="mdescRight">The length of the string. <br /></td></tr>
+<tr class="separator:aaa0229f64f1057b6f65adededaa5a172"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>The UCX string structure for immutable (constant) strings. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="string_8h_source.html">string.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/structsstr__t.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: sstr_t Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">sstr_t Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>The UCX string structure.  
+ <a href="structsstr__t.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="string_8h_source.html">string.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:af8049914efc1e67f7de3ee55ec0611b0"><td class="memItemLeft" align="right" valign="top"><a id="af8049914efc1e67f7de3ee55ec0611b0"></a>
+char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0">ptr</a></td></tr>
+<tr class="memdesc:af8049914efc1e67f7de3ee55ec0611b0"><td class="mdescLeft">&#160;</td><td class="mdescRight">A pointer to the string (<b>not necessarily <code>NULL</code>-terminated</b>) <br /></td></tr>
+<tr class="separator:af8049914efc1e67f7de3ee55ec0611b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5cf571708cdff92e45f08458f2b98229"><td class="memItemLeft" align="right" valign="top"><a id="a5cf571708cdff92e45f08458f2b98229"></a>
+size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structsstr__t.html#a5cf571708cdff92e45f08458f2b98229">length</a></td></tr>
+<tr class="memdesc:a5cf571708cdff92e45f08458f2b98229"><td class="mdescLeft">&#160;</td><td class="mdescRight">The length of the string. <br /></td></tr>
+<tr class="separator:a5cf571708cdff92e45f08458f2b98229"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>The UCX string structure. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="string_8h_source.html">string.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/structucx__memchunk.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,129 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: ucx_memchunk Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">ucx_memchunk Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Capsule for destructible memory chunks.  
+ <a href="structucx__memchunk.html#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ac7b5e3fda47b917d6fb2a1d7ea28447b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structucx__memchunk.html#ac7b5e3fda47b917d6fb2a1d7ea28447b">destructor</a></td></tr>
+<tr class="memdesc:ac7b5e3fda47b917d6fb2a1d7ea28447b"><td class="mdescLeft">&#160;</td><td class="mdescRight">The destructor for the memory chunk.  <a href="#ac7b5e3fda47b917d6fb2a1d7ea28447b">More...</a><br /></td></tr>
+<tr class="separator:ac7b5e3fda47b917d6fb2a1d7ea28447b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab86550503e5f019bfa61a1e91f1c40da"><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structucx__memchunk.html#ab86550503e5f019bfa61a1e91f1c40da">c</a></td></tr>
+<tr class="memdesc:ab86550503e5f019bfa61a1e91f1c40da"><td class="mdescLeft">&#160;</td><td class="mdescRight">First byte of the memory chunk.  <a href="#ab86550503e5f019bfa61a1e91f1c40da">More...</a><br /></td></tr>
+<tr class="separator:ab86550503e5f019bfa61a1e91f1c40da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Capsule for destructible memory chunks. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="ab86550503e5f019bfa61a1e91f1c40da"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab86550503e5f019bfa61a1e91f1c40da">&#9670;&nbsp;</a></span>c</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">char ucx_memchunk::c</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>First byte of the memory chunk. </p>
+<p>Note, that the address <code>&amp;c</code> is also the address of the whole memory chunk. </p>
+
+</div>
+</div>
+<a id="ac7b5e3fda47b917d6fb2a1d7ea28447b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac7b5e3fda47b917d6fb2a1d7ea28447b">&#9670;&nbsp;</a></span>destructor</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a> ucx_memchunk::destructor</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The destructor for the memory chunk. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/home/mike/workspace/c/ucx/src/mempool.c</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/structucx__regdestr.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,128 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: ucx_regdestr Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">ucx_regdestr Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Capsule for data and its destructor.  
+ <a href="structucx__regdestr.html#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:acea2a3bb66909aa800a931ac8b0cce56"><td class="memItemLeft" align="right" valign="top"><a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structucx__regdestr.html#acea2a3bb66909aa800a931ac8b0cce56">destructor</a></td></tr>
+<tr class="memdesc:acea2a3bb66909aa800a931ac8b0cce56"><td class="mdescLeft">&#160;</td><td class="mdescRight">The destructor for the data.  <a href="#acea2a3bb66909aa800a931ac8b0cce56">More...</a><br /></td></tr>
+<tr class="separator:acea2a3bb66909aa800a931ac8b0cce56"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aac0e9ec8df4aab08728b4f8292b5f5e7"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structucx__regdestr.html#aac0e9ec8df4aab08728b4f8292b5f5e7">ptr</a></td></tr>
+<tr class="memdesc:aac0e9ec8df4aab08728b4f8292b5f5e7"><td class="mdescLeft">&#160;</td><td class="mdescRight">A pointer to the data.  <a href="#aac0e9ec8df4aab08728b4f8292b5f5e7">More...</a><br /></td></tr>
+<tr class="separator:aac0e9ec8df4aab08728b4f8292b5f5e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Capsule for data and its destructor. </p>
+</div><h2 class="groupheader">Field Documentation</h2>
+<a id="acea2a3bb66909aa800a931ac8b0cce56"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acea2a3bb66909aa800a931ac8b0cce56">&#9670;&nbsp;</a></span>destructor</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a> ucx_regdestr::destructor</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>The destructor for the data. </p>
+
+</div>
+</div>
+<a id="aac0e9ec8df4aab08728b4f8292b5f5e7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aac0e9ec8df4aab08728b4f8292b5f5e7">&#9670;&nbsp;</a></span>ptr</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* ucx_regdestr::ptr</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>A pointer to the data. </p>
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/home/mike/workspace/c/ucx/src/mempool.c</li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/structucx__stack__metadata.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: ucx_stack_metadata Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#pub-attribs">Data Fields</a>  </div>
+  <div class="headertitle">
+<div class="title">ucx_stack_metadata Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Metadata for each UCX stack element.  
+ <a href="structucx__stack__metadata.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="stack_8h_source.html">stack.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:ad46d2e8e5b0acf05f2def41d451c5579"><td class="memItemLeft" align="right" valign="top"><a id="ad46d2e8e5b0acf05f2def41d451c5579"></a>
+char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structucx__stack__metadata.html#ad46d2e8e5b0acf05f2def41d451c5579">prev</a></td></tr>
+<tr class="memdesc:ad46d2e8e5b0acf05f2def41d451c5579"><td class="mdescLeft">&#160;</td><td class="mdescRight">Location of the previous element (<code>NULL</code> if this is the first) <br /></td></tr>
+<tr class="separator:ad46d2e8e5b0acf05f2def41d451c5579"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae2a2848b721cfa44a7e963484c5e4b28"><td class="memItemLeft" align="right" valign="top"><a id="ae2a2848b721cfa44a7e963484c5e4b28"></a>
+size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structucx__stack__metadata.html#ae2a2848b721cfa44a7e963484c5e4b28">size</a></td></tr>
+<tr class="memdesc:ae2a2848b721cfa44a7e963484c5e4b28"><td class="mdescLeft">&#160;</td><td class="mdescRight">Size of this element. <br /></td></tr>
+<tr class="separator:ae2a2848b721cfa44a7e963484c5e4b28"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Metadata for each UCX stack element. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/home/mike/workspace/c/ucx/src/ucx/<a class="el" href="stack_8h_source.html">stack.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
Binary file docs/api-2.1/sync_off.png has changed
Binary file docs/api-2.1/sync_on.png has changed
Binary file docs/api-2.1/tab_a.png has changed
Binary file docs/api-2.1/tab_b.png has changed
Binary file docs/api-2.1/tab_h.png has changed
Binary file docs/api-2.1/tab_s.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/tabs.css	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,1 @@
+.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:transparent}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283A5D transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/test_8h.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,547 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/test.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#define-members">Macros</a> &#124;
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">test.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>UCX Test Framework.  
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
+<code>#include &lt;stdio.h&gt;</code><br />
+<code>#include &lt;<a class="el" href="string_8h_source.html">string.h</a>&gt;</code><br />
+<code>#include &lt;setjmp.h&gt;</code><br />
+</div>
+<p><a href="test_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxTestList.html">UcxTestList</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Structure for the internal list of test cases.  <a href="structUcxTestList.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structUcxTestSuite.html">UcxTestSuite</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">A test suite containing multiple test cases.  <a href="structUcxTestSuite.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a828bb1dfda1afd67ca795075903d227d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="test_8h.html#a828bb1dfda1afd67ca795075903d227d">__FUNCTION__</a>&#160;&#160;&#160;__func__</td></tr>
+<tr class="memdesc:a828bb1dfda1afd67ca795075903d227d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Alias for the <code>__func__</code> preprocessor macro.  <a href="#a828bb1dfda1afd67ca795075903d227d">More...</a><br /></td></tr>
+<tr class="separator:a828bb1dfda1afd67ca795075903d227d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a66cfb29c329fc9eaef071f2449836659"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="test_8h.html#a66cfb29c329fc9eaef071f2449836659">UCX_TEST</a>(name)&#160;&#160;&#160;void name(<a class="el" href="structUcxTestSuite.html">UcxTestSuite</a>* _suite_,FILE *_output_)</td></tr>
+<tr class="memdesc:a66cfb29c329fc9eaef071f2449836659"><td class="mdescLeft">&#160;</td><td class="mdescRight">Macro for a <a class="el" href="test_8h.html#ae906817354c010b83c2784260cce7a1c" title="Pointer to a test function. ">UcxTest</a> function header.  <a href="#a66cfb29c329fc9eaef071f2449836659">More...</a><br /></td></tr>
+<tr class="separator:a66cfb29c329fc9eaef071f2449836659"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0547b8d4f3bcdb0633fdd8925e8aa5d4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="test_8h.html#a0547b8d4f3bcdb0633fdd8925e8aa5d4">UCX_TEST_BEGIN</a></td></tr>
+<tr class="memdesc:a0547b8d4f3bcdb0633fdd8925e8aa5d4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Marks the begin of a test.  <a href="#a0547b8d4f3bcdb0633fdd8925e8aa5d4">More...</a><br /></td></tr>
+<tr class="separator:a0547b8d4f3bcdb0633fdd8925e8aa5d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a08f477cd12fc3fe741a92493e5df58a9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="test_8h.html#a08f477cd12fc3fe741a92493e5df58a9">UCX_TEST_ASSERT</a>(condition,  message)</td></tr>
+<tr class="memdesc:a08f477cd12fc3fe741a92493e5df58a9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks a test assertion.  <a href="#a08f477cd12fc3fe741a92493e5df58a9">More...</a><br /></td></tr>
+<tr class="separator:a08f477cd12fc3fe741a92493e5df58a9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae073cf5ead22cb27d662da048e16f44a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="test_8h.html#ae073cf5ead22cb27d662da048e16f44a">UCX_TEST_SUBROUTINE</a>(name, ...)</td></tr>
+<tr class="memdesc:ae073cf5ead22cb27d662da048e16f44a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Macro for a test subroutine function header.  <a href="#ae073cf5ead22cb27d662da048e16f44a">More...</a><br /></td></tr>
+<tr class="separator:ae073cf5ead22cb27d662da048e16f44a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0efbab91c54f5237a2ab207f48cf0e51"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="test_8h.html#a0efbab91c54f5237a2ab207f48cf0e51">UCX_TEST_CALL_SUBROUTINE</a>(name, ...)&#160;&#160;&#160;name(_suite_,_output_,_env_,__VA_ARGS__);</td></tr>
+<tr class="memdesc:a0efbab91c54f5237a2ab207f48cf0e51"><td class="mdescLeft">&#160;</td><td class="mdescRight">Macro for calling a test subroutine.  <a href="#a0efbab91c54f5237a2ab207f48cf0e51">More...</a><br /></td></tr>
+<tr class="separator:a0efbab91c54f5237a2ab207f48cf0e51"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a86e64857c04f0447f8b16fb9c2b3b639"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="test_8h.html#a86e64857c04f0447f8b16fb9c2b3b639">UCX_TEST_END</a>&#160;&#160;&#160;fwrite(&quot;success.\n&quot;, 1, 9, _output_); _suite_-&gt;success++;}</td></tr>
+<tr class="memdesc:a86e64857c04f0447f8b16fb9c2b3b639"><td class="mdescLeft">&#160;</td><td class="mdescRight">Marks the end of a test.  <a href="#a86e64857c04f0447f8b16fb9c2b3b639">More...</a><br /></td></tr>
+<tr class="separator:a86e64857c04f0447f8b16fb9c2b3b639"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:a52115d1d0f1c4a565ed6ef7c1bfd0363"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structUcxTestSuite.html">UcxTestSuite</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="test_8h.html#a52115d1d0f1c4a565ed6ef7c1bfd0363">UcxTestSuite</a></td></tr>
+<tr class="memdesc:a52115d1d0f1c4a565ed6ef7c1bfd0363"><td class="mdescLeft">&#160;</td><td class="mdescRight">Type for the <a class="el" href="structUcxTestSuite.html" title="A test suite containing multiple test cases. ">UcxTestSuite</a>.  <a href="#a52115d1d0f1c4a565ed6ef7c1bfd0363">More...</a><br /></td></tr>
+<tr class="separator:a52115d1d0f1c4a565ed6ef7c1bfd0363"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae906817354c010b83c2784260cce7a1c"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="test_8h.html#ae906817354c010b83c2784260cce7a1c">UcxTest</a>) (<a class="el" href="structUcxTestSuite.html">UcxTestSuite</a> *, FILE *)</td></tr>
+<tr class="memdesc:ae906817354c010b83c2784260cce7a1c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pointer to a test function.  <a href="#ae906817354c010b83c2784260cce7a1c">More...</a><br /></td></tr>
+<tr class="separator:ae906817354c010b83c2784260cce7a1c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8048c50ae73ea690b776edfd63bd6a5d"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structUcxTestList.html">UcxTestList</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="test_8h.html#a8048c50ae73ea690b776edfd63bd6a5d">UcxTestList</a></td></tr>
+<tr class="memdesc:a8048c50ae73ea690b776edfd63bd6a5d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Type for the internal list of test cases.  <a href="#a8048c50ae73ea690b776edfd63bd6a5d">More...</a><br /></td></tr>
+<tr class="separator:a8048c50ae73ea690b776edfd63bd6a5d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a531f0df90363e0befbe900878f65f09e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structUcxTestSuite.html">UcxTestSuite</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="test_8h.html#a531f0df90363e0befbe900878f65f09e">ucx_test_suite_new</a> ()</td></tr>
+<tr class="memdesc:a531f0df90363e0befbe900878f65f09e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates a new test suite.  <a href="#a531f0df90363e0befbe900878f65f09e">More...</a><br /></td></tr>
+<tr class="separator:a531f0df90363e0befbe900878f65f09e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4a6ac61a6f72722273f8eaa7a343edde"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="test_8h.html#a4a6ac61a6f72722273f8eaa7a343edde">ucx_test_suite_free</a> (<a class="el" href="structUcxTestSuite.html">UcxTestSuite</a> *suite)</td></tr>
+<tr class="memdesc:a4a6ac61a6f72722273f8eaa7a343edde"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys a test suite.  <a href="#a4a6ac61a6f72722273f8eaa7a343edde">More...</a><br /></td></tr>
+<tr class="separator:a4a6ac61a6f72722273f8eaa7a343edde"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8dfabc42f183d3a4d79379a5d17bf67d"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="test_8h.html#a8dfabc42f183d3a4d79379a5d17bf67d">ucx_test_register</a> (<a class="el" href="structUcxTestSuite.html">UcxTestSuite</a> *suite, <a class="el" href="test_8h.html#ae906817354c010b83c2784260cce7a1c">UcxTest</a> test)</td></tr>
+<tr class="memdesc:a8dfabc42f183d3a4d79379a5d17bf67d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Registers a test function with the specified test suite.  <a href="#a8dfabc42f183d3a4d79379a5d17bf67d">More...</a><br /></td></tr>
+<tr class="separator:a8dfabc42f183d3a4d79379a5d17bf67d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3721458deeecb43aa322428f007714c3"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="test_8h.html#a3721458deeecb43aa322428f007714c3">ucx_test_run</a> (<a class="el" href="structUcxTestSuite.html">UcxTestSuite</a> *suite, FILE *outstream)</td></tr>
+<tr class="memdesc:a3721458deeecb43aa322428f007714c3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Runs a test suite and writes the test log to the specified stream.  <a href="#a3721458deeecb43aa322428f007714c3">More...</a><br /></td></tr>
+<tr class="separator:a3721458deeecb43aa322428f007714c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>UCX Test Framework. </p>
+<p>Usage of this test framework:</p>
+<p>**** IN HEADER FILE: ****</p>
+<pre>
+<a class="el" href="test_8h.html#a66cfb29c329fc9eaef071f2449836659" title="Macro for a UcxTest function header. ">UCX_TEST(function_name)</a>;
+<a class="el" href="test_8h.html#ae073cf5ead22cb27d662da048e16f44a" title="Macro for a test subroutine function header. ">UCX_TEST_SUBROUTINE(subroutine_name, paramlist)</a>; // optional
+</pre><p>**** IN SOURCE FILE: **** </p><pre>
+<a class="el" href="test_8h.html#ae073cf5ead22cb27d662da048e16f44a" title="Macro for a test subroutine function header. ">UCX_TEST_SUBROUTINE(subroutine_name, paramlist)</a> {
+  // tests with <a class="el" href="test_8h.html#a08f477cd12fc3fe741a92493e5df58a9" title="Checks a test assertion. ">UCX_TEST_ASSERT()</a>
+}</pre><pre><a class="el" href="test_8h.html#a66cfb29c329fc9eaef071f2449836659" title="Macro for a UcxTest function header. ">UCX_TEST(function_name)</a> {
+  // memory allocation and other stuff here
+  <a class="el" href="test_8h.html#a0547b8d4f3bcdb0633fdd8925e8aa5d4" title="Marks the begin of a test. ">UCX_TEST_BEGIN</a>
+  // tests with <a class="el" href="test_8h.html#a08f477cd12fc3fe741a92493e5df58a9" title="Checks a test assertion. ">UCX_TEST_ASSERT()</a> and/or
+  // calls with <a class="el" href="test_8h.html#a0efbab91c54f5237a2ab207f48cf0e51" title="Macro for calling a test subroutine. ">UCX_TEST_CALL_SUBROUTINE()</a> here
+  <a class="el" href="test_8h.html#a86e64857c04f0447f8b16fb9c2b3b639" title="Marks the end of a test. ">UCX_TEST_END</a>
+  // cleanup of memory here
+}
+</pre><p><b>Note:</b> if a test fails, a longjump is performed back to the <a class="el" href="test_8h.html#a0547b8d4f3bcdb0633fdd8925e8aa5d4" title="Marks the begin of a test. ">UCX_TEST_BEGIN</a> macro!</p>
+<p><b>Attention:</b> Do not call own functions within a test, that use <a class="el" href="test_8h.html#a08f477cd12fc3fe741a92493e5df58a9" title="Checks a test assertion. ">UCX_TEST_ASSERT()</a> macros and are not defined by using <a class="el" href="test_8h.html#ae073cf5ead22cb27d662da048e16f44a" title="Macro for a test subroutine function header. ">UCX_TEST_SUBROUTINE()</a>.</p>
+<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
+<dd>
+Olaf Wintermann </dd></dl>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a828bb1dfda1afd67ca795075903d227d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a828bb1dfda1afd67ca795075903d227d">&#9670;&nbsp;</a></span>__FUNCTION__</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define __FUNCTION__&#160;&#160;&#160;__func__</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Alias for the <code>__func__</code> preprocessor macro. </p>
+<p>Some compilers use <code>__func__</code> and others use <b>FUNCTION</b>. We use <b>FUNCTION</b> so we define it for those compilers which use <code>__func__</code>. </p>
+
+</div>
+</div>
+<a id="a66cfb29c329fc9eaef071f2449836659"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a66cfb29c329fc9eaef071f2449836659">&#9670;&nbsp;</a></span>UCX_TEST</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UCX_TEST</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">name</td><td>)</td>
+          <td>&#160;&#160;&#160;void name(<a class="el" href="structUcxTestSuite.html">UcxTestSuite</a>* _suite_,FILE *_output_)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Macro for a <a class="el" href="test_8h.html#ae906817354c010b83c2784260cce7a1c" title="Pointer to a test function. ">UcxTest</a> function header. </p>
+<p>Use this macro to declare and/or define a <a class="el" href="test_8h.html#ae906817354c010b83c2784260cce7a1c" title="Pointer to a test function. ">UcxTest</a> function.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">name</td><td>the name of the test function </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a08f477cd12fc3fe741a92493e5df58a9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a08f477cd12fc3fe741a92493e5df58a9">&#9670;&nbsp;</a></span>UCX_TEST_ASSERT</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UCX_TEST_ASSERT</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">condition, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">message&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line"><span class="keywordflow">if</span> (!(condition)) { \</div><div class="line">        fwrite(message<span class="stringliteral">&quot;.\n&quot;</span>, 1, 2+strlen(message), _output_); \</div><div class="line">        _suite_-&gt;failure++; \</div><div class="line">        longjmp(_env_, 1);\</div><div class="line">    }</div></div><!-- fragment -->
+<p>Checks a test assertion. </p>
+<p>If the assertion is correct, the test carries on. If the assertion is not correct, the specified message (terminated by a dot and a line break) is written to the test suites output stream. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">condition</td><td>the condition to check </td></tr>
+    <tr><td class="paramname">message</td><td>the message that shall be printed out on failure </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a0547b8d4f3bcdb0633fdd8925e8aa5d4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0547b8d4f3bcdb0633fdd8925e8aa5d4">&#9670;&nbsp;</a></span>UCX_TEST_BEGIN</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UCX_TEST_BEGIN</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line">fwrite(<span class="stringliteral">&quot;Running &quot;</span>, 1, 8, _output_);\</div><div class="line">        fwrite(<a class="code" href="test_8h.html#a828bb1dfda1afd67ca795075903d227d">__FUNCTION__</a>, 1, strlen(<a class="code" href="test_8h.html#a828bb1dfda1afd67ca795075903d227d">__FUNCTION__</a>), _output_);\</div><div class="line">        fwrite(<span class="stringliteral">&quot;... &quot;</span>, 1, 4, _output_);\</div><div class="line">        jmp_buf _env_; \</div><div class="line">        if (!setjmp(_env_)) {</div><div class="ttc" id="test_8h_html_a828bb1dfda1afd67ca795075903d227d"><div class="ttname"><a href="test_8h.html#a828bb1dfda1afd67ca795075903d227d">__FUNCTION__</a></div><div class="ttdeci">#define __FUNCTION__</div><div class="ttdoc">Alias for the __func__ preprocessor macro. </div><div class="ttdef"><b>Definition:</b> test.h:91</div></div>
+</div><!-- fragment -->
+<p>Marks the begin of a test. </p>
+<p><b>Note:</b> Any <a class="el" href="test_8h.html#a08f477cd12fc3fe741a92493e5df58a9" title="Checks a test assertion. ">UCX_TEST_ASSERT()</a> calls must be performed <b>after</b> <a class="el" href="test_8h.html#a0547b8d4f3bcdb0633fdd8925e8aa5d4" title="Marks the begin of a test. ">UCX_TEST_BEGIN</a>.</p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="test_8h.html#a86e64857c04f0447f8b16fb9c2b3b639" title="Marks the end of a test. ">UCX_TEST_END</a> </dd></dl>
+
+</div>
+</div>
+<a id="a0efbab91c54f5237a2ab207f48cf0e51"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0efbab91c54f5237a2ab207f48cf0e51">&#9670;&nbsp;</a></span>UCX_TEST_CALL_SUBROUTINE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UCX_TEST_CALL_SUBROUTINE</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">name, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><em>...</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;name(_suite_,_output_,_env_,__VA_ARGS__);</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Macro for calling a test subroutine. </p>
+<p>Subroutines declared with <a class="el" href="test_8h.html#ae073cf5ead22cb27d662da048e16f44a" title="Macro for a test subroutine function header. ">UCX_TEST_SUBROUTINE()</a> can be called by using this macro.</p>
+<p><b>Note:</b> You may <b>only</b> call subroutines within a <a class="el" href="test_8h.html#a0547b8d4f3bcdb0633fdd8925e8aa5d4" title="Marks the begin of a test. ">UCX_TEST_BEGIN</a>- <a class="el" href="test_8h.html#a86e64857c04f0447f8b16fb9c2b3b639" title="Marks the end of a test. ">UCX_TEST_END</a>-block.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">name</td><td>the name of the subroutine </td></tr>
+    <tr><td class="paramname">...</td><td>the argument list</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="test_8h.html#ae073cf5ead22cb27d662da048e16f44a" title="Macro for a test subroutine function header. ">UCX_TEST_SUBROUTINE()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a86e64857c04f0447f8b16fb9c2b3b639"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a86e64857c04f0447f8b16fb9c2b3b639">&#9670;&nbsp;</a></span>UCX_TEST_END</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UCX_TEST_END&#160;&#160;&#160;fwrite(&quot;success.\n&quot;, 1, 9, _output_); _suite_-&gt;success++;}</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Marks the end of a test. </p>
+<p><b>Note:</b> Any <a class="el" href="test_8h.html#a08f477cd12fc3fe741a92493e5df58a9" title="Checks a test assertion. ">UCX_TEST_ASSERT()</a> calls must be performed <b>before</b> <a class="el" href="test_8h.html#a86e64857c04f0447f8b16fb9c2b3b639" title="Marks the end of a test. ">UCX_TEST_END</a>.</p>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="test_8h.html#a0547b8d4f3bcdb0633fdd8925e8aa5d4" title="Marks the begin of a test. ">UCX_TEST_BEGIN</a> </dd></dl>
+
+</div>
+</div>
+<a id="ae073cf5ead22cb27d662da048e16f44a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae073cf5ead22cb27d662da048e16f44a">&#9670;&nbsp;</a></span>UCX_TEST_SUBROUTINE</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UCX_TEST_SUBROUTINE</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">name, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><em>...</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line"><span class="keywordtype">void</span> name(<a class="code" href="structUcxTestSuite.html">UcxTestSuite</a>* _suite_,\</div><div class="line">        FILE *_output_, jmp_buf _env_, __VA_ARGS__)</div><div class="ttc" id="structUcxTestSuite_html"><div class="ttname"><a href="structUcxTestSuite.html">UcxTestSuite</a></div><div class="ttdoc">A test suite containing multiple test cases. </div><div class="ttdef"><b>Definition:</b> test.h:116</div></div>
+</div><!-- fragment -->
+<p>Macro for a test subroutine function header. </p>
+<p>Use this to declare and/or define a subroutine that can be called by using <a class="el" href="test_8h.html#a0efbab91c54f5237a2ab207f48cf0e51" title="Macro for calling a test subroutine. ">UCX_TEST_CALL_SUBROUTINE()</a>.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">name</td><td>the name of the subroutine </td></tr>
+    <tr><td class="paramname">...</td><td>the parameter list</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="test_8h.html#a0efbab91c54f5237a2ab207f48cf0e51" title="Macro for calling a test subroutine. ">UCX_TEST_CALL_SUBROUTINE()</a> </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="ae906817354c010b83c2784260cce7a1c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae906817354c010b83c2784260cce7a1c">&#9670;&nbsp;</a></span>UcxTest</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(* UcxTest) (<a class="el" href="structUcxTestSuite.html">UcxTestSuite</a> *, FILE *)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Pointer to a test function. </p>
+
+</div>
+</div>
+<a id="a8048c50ae73ea690b776edfd63bd6a5d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8048c50ae73ea690b776edfd63bd6a5d">&#9670;&nbsp;</a></span>UcxTestList</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structUcxTestList.html">UcxTestList</a> <a class="el" href="structUcxTestList.html">UcxTestList</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Type for the internal list of test cases. </p>
+
+</div>
+</div>
+<a id="a52115d1d0f1c4a565ed6ef7c1bfd0363"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a52115d1d0f1c4a565ed6ef7c1bfd0363">&#9670;&nbsp;</a></span>UcxTestSuite</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="structUcxTestSuite.html">UcxTestSuite</a> <a class="el" href="structUcxTestSuite.html">UcxTestSuite</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Type for the <a class="el" href="structUcxTestSuite.html" title="A test suite containing multiple test cases. ">UcxTestSuite</a>. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a8dfabc42f183d3a4d79379a5d17bf67d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8dfabc42f183d3a4d79379a5d17bf67d">&#9670;&nbsp;</a></span>ucx_test_register()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_test_register </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxTestSuite.html">UcxTestSuite</a> *&#160;</td>
+          <td class="paramname"><em>suite</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="test_8h.html#ae906817354c010b83c2784260cce7a1c">UcxTest</a>&#160;</td>
+          <td class="paramname"><em>test</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Registers a test function with the specified test suite. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">suite</td><td>the suite, the test function shall be added to </td></tr>
+    <tr><td class="paramname">test</td><td>the test function to register </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><code>EXIT_SUCCESS</code> on success or <code>EXIT_FAILURE</code> on failure </dd></dl>
+
+</div>
+</div>
+<a id="a3721458deeecb43aa322428f007714c3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3721458deeecb43aa322428f007714c3">&#9670;&nbsp;</a></span>ucx_test_run()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_test_run </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxTestSuite.html">UcxTestSuite</a> *&#160;</td>
+          <td class="paramname"><em>suite</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">FILE *&#160;</td>
+          <td class="paramname"><em>outstream</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Runs a test suite and writes the test log to the specified stream. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">suite</td><td>the test suite to run </td></tr>
+    <tr><td class="paramname">outstream</td><td>the stream the log shall be written to </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a4a6ac61a6f72722273f8eaa7a343edde"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4a6ac61a6f72722273f8eaa7a343edde">&#9670;&nbsp;</a></span>ucx_test_suite_free()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void ucx_test_suite_free </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxTestSuite.html">UcxTestSuite</a> *&#160;</td>
+          <td class="paramname"><em>suite</em></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Destroys a test suite. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">suite</td><td>the test suite to destroy </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a id="a531f0df90363e0befbe900878f65f09e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a531f0df90363e0befbe900878f65f09e">&#9670;&nbsp;</a></span>ucx_test_suite_new()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structUcxTestSuite.html">UcxTestSuite</a>* ucx_test_suite_new </td>
+          <td>(</td>
+          <td class="paramname"></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Creates a new test suite. </p>
+<dl class="section return"><dt>Returns</dt><dd>a new test suite </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/test_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,93 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/test.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">test.h</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a href="test_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment"> * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"> * Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment"> * modification, are permitted provided that the following conditions are met:</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> *   1. Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> *   2. Redistributions in binary form must reproduce the above copyright</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer in the</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment"> *      documentation and/or other materials provided with the distribution.</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment"> * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment"> * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment"> * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"> * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment"> * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment"> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment"> * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE</span></div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> * POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160; </div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;<span class="preprocessor">#ifndef UCX_TEST_H</span></div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;<span class="preprocessor">#define UCX_TEST_H</span></div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ucx_8h.html">ucx.h</a>&quot;</span></div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;<span class="preprocessor">#include &lt;stdio.h&gt;</span></div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="string_8h.html">string.h</a>&gt;</span></div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;<span class="preprocessor">#include &lt;setjmp.h&gt;</span></div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;</div><div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;</div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;<span class="preprocessor">#ifndef __FUNCTION__</span></div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;</div><div class="line"><a name="l00091"></a><span class="lineno"><a class="line" href="test_8h.html#a828bb1dfda1afd67ca795075903d227d">   91</a></span>&#160;<span class="preprocessor">#define __FUNCTION__ __func__</span></div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;</div><div class="line"><a name="l00095"></a><span class="lineno"><a class="line" href="test_8h.html#a52115d1d0f1c4a565ed6ef7c1bfd0363">   95</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structUcxTestSuite.html">UcxTestSuite</a> <a class="code" href="structUcxTestSuite.html">UcxTestSuite</a>;</div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;</div><div class="line"><a name="l00098"></a><span class="lineno"><a class="line" href="test_8h.html#ae906817354c010b83c2784260cce7a1c">   98</a></span>&#160;<span class="keyword">typedef</span> void(*<a class="code" href="test_8h.html#ae906817354c010b83c2784260cce7a1c">UcxTest</a>)(<a class="code" href="structUcxTestSuite.html">UcxTestSuite</a>*,FILE*);</div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;</div><div class="line"><a name="l00101"></a><span class="lineno"><a class="line" href="test_8h.html#a8048c50ae73ea690b776edfd63bd6a5d">  101</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structUcxTestList.html">UcxTestList</a> <a class="code" href="structUcxTestList.html">UcxTestList</a>;</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;</div><div class="line"><a name="l00104"></a><span class="lineno"><a class="line" href="structUcxTestList.html">  104</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structUcxTestList.html">UcxTestList</a> {</div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;    </div><div class="line"><a name="l00107"></a><span class="lineno"><a class="line" href="structUcxTestList.html#a6022faa52e772b073141ca0a2f5a56c9">  107</a></span>&#160;    <a class="code" href="test_8h.html#ae906817354c010b83c2784260cce7a1c">UcxTest</a> <a class="code" href="structUcxTestList.html#a6022faa52e772b073141ca0a2f5a56c9">test</a>;</div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;    </div><div class="line"><a name="l00110"></a><span class="lineno"><a class="line" href="structUcxTestList.html#aeebb80ff75d9f6f82ab6dc2641a3c74e">  110</a></span>&#160;    <a class="code" href="structUcxTestList.html">UcxTestList</a> *<a class="code" href="structUcxTestList.html#aeebb80ff75d9f6f82ab6dc2641a3c74e">next</a>;</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;};</div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;</div><div class="line"><a name="l00116"></a><span class="lineno"><a class="line" href="structUcxTestSuite.html">  116</a></span>&#160;<span class="keyword">struct </span>UcxTestSuite {</div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;    </div><div class="line"><a name="l00119"></a><span class="lineno"><a class="line" href="structUcxTestSuite.html#a6cefa870a3c2e38d6ee682e38643dbbb">  119</a></span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structUcxTestSuite.html#a6cefa870a3c2e38d6ee682e38643dbbb">success</a>;</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;    </div><div class="line"><a name="l00122"></a><span class="lineno"><a class="line" href="structUcxTestSuite.html#abfd240541d1e956e49cde0ac36286951">  122</a></span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structUcxTestSuite.html#abfd240541d1e956e49cde0ac36286951">failure</a>;</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;    </div><div class="line"><a name="l00128"></a><span class="lineno"><a class="line" href="structUcxTestSuite.html#a630677a70ebc2c3296704cda3196492b">  128</a></span>&#160;    <a class="code" href="structUcxTestList.html">UcxTestList</a> *<a class="code" href="structUcxTestSuite.html#a630677a70ebc2c3296704cda3196492b">tests</a>;</div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;};</div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;</div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;UcxTestSuite* <a class="code" href="test_8h.html#a531f0df90363e0befbe900878f65f09e">ucx_test_suite_new</a>();</div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;<span class="keywordtype">void</span> <a class="code" href="test_8h.html#a4a6ac61a6f72722273f8eaa7a343edde">ucx_test_suite_free</a>(UcxTestSuite* suite);</div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;<span class="keywordtype">int</span> <a class="code" href="test_8h.html#a8dfabc42f183d3a4d79379a5d17bf67d">ucx_test_register</a>(UcxTestSuite* suite, <a class="code" href="test_8h.html#ae906817354c010b83c2784260cce7a1c">UcxTest</a> <a class="code" href="structUcxTestList.html#a6022faa52e772b073141ca0a2f5a56c9">test</a>);</div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;</div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;<span class="keywordtype">void</span> <a class="code" href="test_8h.html#a3721458deeecb43aa322428f007714c3">ucx_test_run</a>(UcxTestSuite* suite, FILE* outstream);</div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;</div><div class="line"><a name="l00167"></a><span class="lineno"><a class="line" href="test_8h.html#a66cfb29c329fc9eaef071f2449836659">  167</a></span>&#160;<span class="preprocessor">#define UCX_TEST(name) void name(UcxTestSuite* _suite_,FILE *_output_)</span></div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;</div><div class="line"><a name="l00176"></a><span class="lineno"><a class="line" href="test_8h.html#a0547b8d4f3bcdb0633fdd8925e8aa5d4">  176</a></span>&#160;<span class="preprocessor">#define UCX_TEST_BEGIN fwrite(&quot;Running &quot;, 1, 8, _output_);\</span></div><div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;<span class="preprocessor">        fwrite(__FUNCTION__, 1, strlen(__FUNCTION__), _output_);\</span></div><div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;<span class="preprocessor">        fwrite(&quot;... &quot;, 1, 4, _output_);\</span></div><div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;<span class="preprocessor">        jmp_buf _env_; \</span></div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;<span class="preprocessor">        if (!setjmp(_env_)) {</span></div><div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;</div><div class="line"><a name="l00190"></a><span class="lineno"><a class="line" href="test_8h.html#a08f477cd12fc3fe741a92493e5df58a9">  190</a></span>&#160;<span class="preprocessor">#define UCX_TEST_ASSERT(condition,message) if (!(condition)) { \</span></div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;<span class="preprocessor">        fwrite(message&quot;.\n&quot;, 1, 2+strlen(message), _output_); \</span></div><div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;<span class="preprocessor">        _suite_-&gt;failure++; \</span></div><div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;<span class="preprocessor">        longjmp(_env_, 1);\</span></div><div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;<span class="preprocessor">    }</span></div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;</div><div class="line"><a name="l00207"></a><span class="lineno"><a class="line" href="test_8h.html#ae073cf5ead22cb27d662da048e16f44a">  207</a></span>&#160;<span class="preprocessor">#define UCX_TEST_SUBROUTINE(name,...) void name(UcxTestSuite* _suite_,\</span></div><div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;<span class="preprocessor">        FILE *_output_, jmp_buf _env_, __VA_ARGS__)</span></div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;</div><div class="line"><a name="l00224"></a><span class="lineno"><a class="line" href="test_8h.html#a0efbab91c54f5237a2ab207f48cf0e51">  224</a></span>&#160;<span class="preprocessor">#define UCX_TEST_CALL_SUBROUTINE(name,...) \</span></div><div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;<span class="preprocessor">        name(_suite_,_output_,_env_,__VA_ARGS__);</span></div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;</div><div class="line"><a name="l00234"></a><span class="lineno"><a class="line" href="test_8h.html#a86e64857c04f0447f8b16fb9c2b3b639">  234</a></span>&#160;<span class="preprocessor">#define UCX_TEST_END fwrite(&quot;success.\n&quot;, 1, 9, _output_); _suite_-&gt;success++;}</span></div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;</div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;}</div><div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;</div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;<span class="preprocessor">#endif  </span><span class="comment">/* UCX_TEST_H */</span><span class="preprocessor"></span></div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;</div><div class="ttc" id="structUcxTestSuite_html_a6cefa870a3c2e38d6ee682e38643dbbb"><div class="ttname"><a href="structUcxTestSuite.html#a6cefa870a3c2e38d6ee682e38643dbbb">UcxTestSuite::success</a></div><div class="ttdeci">unsigned int success</div><div class="ttdoc">The number of successful tests after the suite has been run. </div><div class="ttdef"><b>Definition:</b> test.h:119</div></div>
+<div class="ttc" id="string_8h_html"><div class="ttname"><a href="string_8h.html">string.h</a></div><div class="ttdoc">Bounded string implementation. </div></div>
+<div class="ttc" id="ucx_8h_html"><div class="ttname"><a href="ucx_8h.html">ucx.h</a></div><div class="ttdoc">Main UCX Header providing most common definitions. </div></div>
+<div class="ttc" id="structUcxTestList_html_a6022faa52e772b073141ca0a2f5a56c9"><div class="ttname"><a href="structUcxTestList.html#a6022faa52e772b073141ca0a2f5a56c9">UcxTestList::test</a></div><div class="ttdeci">UcxTest test</div><div class="ttdoc">Test case. </div><div class="ttdef"><b>Definition:</b> test.h:107</div></div>
+<div class="ttc" id="test_8h_html_a8dfabc42f183d3a4d79379a5d17bf67d"><div class="ttname"><a href="test_8h.html#a8dfabc42f183d3a4d79379a5d17bf67d">ucx_test_register</a></div><div class="ttdeci">int ucx_test_register(UcxTestSuite *suite, UcxTest test)</div><div class="ttdoc">Registers a test function with the specified test suite. </div><div class="ttdef"><b>Definition:</b> test.c:52</div></div>
+<div class="ttc" id="test_8h_html_a3721458deeecb43aa322428f007714c3"><div class="ttname"><a href="test_8h.html#a3721458deeecb43aa322428f007714c3">ucx_test_run</a></div><div class="ttdeci">void ucx_test_run(UcxTestSuite *suite, FILE *outstream)</div><div class="ttdoc">Runs a test suite and writes the test log to the specified stream. </div><div class="ttdef"><b>Definition:</b> test.c:82</div></div>
+<div class="ttc" id="structUcxTestList_html"><div class="ttname"><a href="structUcxTestList.html">UcxTestList</a></div><div class="ttdoc">Structure for the internal list of test cases. </div><div class="ttdef"><b>Definition:</b> test.h:104</div></div>
+<div class="ttc" id="test_8h_html_a531f0df90363e0befbe900878f65f09e"><div class="ttname"><a href="test_8h.html#a531f0df90363e0befbe900878f65f09e">ucx_test_suite_new</a></div><div class="ttdeci">UcxTestSuite * ucx_test_suite_new()</div><div class="ttdoc">Creates a new test suite. </div><div class="ttdef"><b>Definition:</b> test.c:31</div></div>
+<div class="ttc" id="structUcxTestSuite_html_a630677a70ebc2c3296704cda3196492b"><div class="ttname"><a href="structUcxTestSuite.html#a630677a70ebc2c3296704cda3196492b">UcxTestSuite::tests</a></div><div class="ttdeci">UcxTestList * tests</div><div class="ttdoc">Internal list of test cases. </div><div class="ttdef"><b>Definition:</b> test.h:128</div></div>
+<div class="ttc" id="test_8h_html_ae906817354c010b83c2784260cce7a1c"><div class="ttname"><a href="test_8h.html#ae906817354c010b83c2784260cce7a1c">UcxTest</a></div><div class="ttdeci">void(* UcxTest)(UcxTestSuite *, FILE *)</div><div class="ttdoc">Pointer to a test function. </div><div class="ttdef"><b>Definition:</b> test.h:98</div></div>
+<div class="ttc" id="test_8h_html_a4a6ac61a6f72722273f8eaa7a343edde"><div class="ttname"><a href="test_8h.html#a4a6ac61a6f72722273f8eaa7a343edde">ucx_test_suite_free</a></div><div class="ttdeci">void ucx_test_suite_free(UcxTestSuite *suite)</div><div class="ttdoc">Destroys a test suite. </div><div class="ttdef"><b>Definition:</b> test.c:42</div></div>
+<div class="ttc" id="structUcxTestSuite_html_abfd240541d1e956e49cde0ac36286951"><div class="ttname"><a href="structUcxTestSuite.html#abfd240541d1e956e49cde0ac36286951">UcxTestSuite::failure</a></div><div class="ttdeci">unsigned int failure</div><div class="ttdoc">The number of failed tests after the suite has been run. </div><div class="ttdef"><b>Definition:</b> test.h:122</div></div>
+<div class="ttc" id="structUcxTestList_html_aeebb80ff75d9f6f82ab6dc2641a3c74e"><div class="ttname"><a href="structUcxTestList.html#aeebb80ff75d9f6f82ab6dc2641a3c74e">UcxTestList::next</a></div><div class="ttdeci">UcxTestList * next</div><div class="ttdoc">Pointer to the next list element. </div><div class="ttdef"><b>Definition:</b> test.h:110</div></div>
+<div class="ttc" id="structUcxTestSuite_html"><div class="ttname"><a href="structUcxTestSuite.html">UcxTestSuite</a></div><div class="ttdoc">A test suite containing multiple test cases. </div><div class="ttdef"><b>Definition:</b> test.h:116</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
Binary file docs/api-2.1/uaplogo.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/ucx_8h.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,388 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/ucx.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">ucx.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Main UCX Header providing most common definitions.  
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &lt;stdlib.h&gt;</code><br />
+<code>#include &lt;stdint.h&gt;</code><br />
+<code>#include &lt;sys/types.h&gt;</code><br />
+</div>
+<p><a href="ucx_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:aa57e5dd22d42387d748cc16777df1383"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ucx_8h.html#aa57e5dd22d42387d748cc16777df1383">UCX_VERSION_MAJOR</a>&#160;&#160;&#160;2</td></tr>
+<tr class="memdesc:aa57e5dd22d42387d748cc16777df1383"><td class="mdescLeft">&#160;</td><td class="mdescRight">Major UCX version as integer constant.  <a href="#aa57e5dd22d42387d748cc16777df1383">More...</a><br /></td></tr>
+<tr class="separator:aa57e5dd22d42387d748cc16777df1383"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ac10d6353e23d4615a87fc737c65eb0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ucx_8h.html#a9ac10d6353e23d4615a87fc737c65eb0">UCX_VERSION_MINOR</a>&#160;&#160;&#160;1</td></tr>
+<tr class="memdesc:a9ac10d6353e23d4615a87fc737c65eb0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Minor UCX version as integer constant.  <a href="#a9ac10d6353e23d4615a87fc737c65eb0">More...</a><br /></td></tr>
+<tr class="separator:a9ac10d6353e23d4615a87fc737c65eb0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af12001920ca2fc1405615684e4dea284"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ucx_8h.html#af12001920ca2fc1405615684e4dea284">UCX_VERSION</a>&#160;&#160;&#160;(((<a class="el" href="ucx_8h.html#aa57e5dd22d42387d748cc16777df1383">UCX_VERSION_MAJOR</a>)&lt;&lt;16)|<a class="el" href="ucx_8h.html#a9ac10d6353e23d4615a87fc737c65eb0">UCX_VERSION_MINOR</a>)</td></tr>
+<tr class="memdesc:af12001920ca2fc1405615684e4dea284"><td class="mdescLeft">&#160;</td><td class="mdescRight">Version constant which ensures to increase monotonically.  <a href="#af12001920ca2fc1405615684e4dea284">More...</a><br /></td></tr>
+<tr class="separator:af12001920ca2fc1405615684e4dea284"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0b5ed6c1a0b15356f4f948acfd32a4cc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ucx_8h.html#a0b5ed6c1a0b15356f4f948acfd32a4cc">ucx_szmul</a>(a,  b,  result)&#160;&#160;&#160;<a class="el" href="ucx_8h.html#a6637171cc0ec097b297f731a3036dd3b">ucx_szmul_impl</a>(a, b, result)</td></tr>
+<tr class="memdesc:a0b5ed6c1a0b15356f4f948acfd32a4cc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performs a multiplication of size_t values and checks for overflow.  <a href="#a0b5ed6c1a0b15356f4f948acfd32a4cc">More...</a><br /></td></tr>
+<tr class="separator:a0b5ed6c1a0b15356f4f948acfd32a4cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:ad2b370c2809914c8b7fedab163c266b3"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a>) (void *)</td></tr>
+<tr class="memdesc:ad2b370c2809914c8b7fedab163c266b3"><td class="mdescLeft">&#160;</td><td class="mdescRight">A function pointer to a destructor function.  <a href="#ad2b370c2809914c8b7fedab163c266b3">More...</a><br /></td></tr>
+<tr class="separator:ad2b370c2809914c8b7fedab163c266b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe5e2d5dbf34778e0e97852051570791"><td class="memItemLeft" align="right" valign="top">typedef int(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>) (const void *, const void *, void *)</td></tr>
+<tr class="memdesc:afe5e2d5dbf34778e0e97852051570791"><td class="mdescLeft">&#160;</td><td class="mdescRight">Function pointer to a compare function.  <a href="#afe5e2d5dbf34778e0e97852051570791">More...</a><br /></td></tr>
+<tr class="separator:afe5e2d5dbf34778e0e97852051570791"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0bc5bf89e556c1d45d10863d52728ac9"><td class="memItemLeft" align="right" valign="top">typedef intmax_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ucx_8h.html#a0bc5bf89e556c1d45d10863d52728ac9">distance_func</a>) (const void *, const void *, void *)</td></tr>
+<tr class="memdesc:a0bc5bf89e556c1d45d10863d52728ac9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Function pointer to a distance function.  <a href="#a0bc5bf89e556c1d45d10863d52728ac9">More...</a><br /></td></tr>
+<tr class="separator:a0bc5bf89e556c1d45d10863d52728ac9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aab917a5fe0965673c73e8ebd0a1fc967"><td class="memItemLeft" align="right" valign="top">typedef void *(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">copy_func</a>) (const void *, void *)</td></tr>
+<tr class="memdesc:aab917a5fe0965673c73e8ebd0a1fc967"><td class="mdescLeft">&#160;</td><td class="mdescRight">Function pointer to a copy function.  <a href="#aab917a5fe0965673c73e8ebd0a1fc967">More...</a><br /></td></tr>
+<tr class="separator:aab917a5fe0965673c73e8ebd0a1fc967"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a989b3f0fa4d307d278378fde435641ed"><td class="memItemLeft" align="right" valign="top">typedef size_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a>) (const void *, size_t, size_t, void *)</td></tr>
+<tr class="memdesc:a989b3f0fa4d307d278378fde435641ed"><td class="mdescLeft">&#160;</td><td class="mdescRight">Function pointer to a write function.  <a href="#a989b3f0fa4d307d278378fde435641ed">More...</a><br /></td></tr>
+<tr class="separator:a989b3f0fa4d307d278378fde435641ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6a67e255e460acb58f802067b3ff5fd5"><td class="memItemLeft" align="right" valign="top">typedef size_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ucx_8h.html#a6a67e255e460acb58f802067b3ff5fd5">read_func</a>) (void *, size_t, size_t, void *)</td></tr>
+<tr class="memdesc:a6a67e255e460acb58f802067b3ff5fd5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Function pointer to a read function.  <a href="#a6a67e255e460acb58f802067b3ff5fd5">More...</a><br /></td></tr>
+<tr class="separator:a6a67e255e460acb58f802067b3ff5fd5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a6637171cc0ec097b297f731a3036dd3b"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ucx_8h.html#a6637171cc0ec097b297f731a3036dd3b">ucx_szmul_impl</a> (size_t a, size_t b, size_t *result)</td></tr>
+<tr class="memdesc:a6637171cc0ec097b297f731a3036dd3b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performs a multiplication of size_t values and checks for overflow.  <a href="#a6637171cc0ec097b297f731a3036dd3b">More...</a><br /></td></tr>
+<tr class="separator:a6637171cc0ec097b297f731a3036dd3b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Main UCX Header providing most common definitions. </p>
+<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
+<dd>
+Olaf Wintermann </dd></dl>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a0b5ed6c1a0b15356f4f948acfd32a4cc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0b5ed6c1a0b15356f4f948acfd32a4cc">&#9670;&nbsp;</a></span>ucx_szmul</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_szmul</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">a, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">b, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">result&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td>&#160;&#160;&#160;<a class="el" href="ucx_8h.html#a6637171cc0ec097b297f731a3036dd3b">ucx_szmul_impl</a>(a, b, result)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Performs a multiplication of size_t values and checks for overflow. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">a</td><td>first operand </td></tr>
+    <tr><td class="paramname">b</td><td>second operand </td></tr>
+    <tr><td class="paramname">result</td><td>a pointer to a size_t, where the result should be stored </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>zero, if no overflow occurred and the result is correct, non-zero otherwise </dd></dl>
+
+</div>
+</div>
+<a id="af12001920ca2fc1405615684e4dea284"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af12001920ca2fc1405615684e4dea284">&#9670;&nbsp;</a></span>UCX_VERSION</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UCX_VERSION&#160;&#160;&#160;(((<a class="el" href="ucx_8h.html#aa57e5dd22d42387d748cc16777df1383">UCX_VERSION_MAJOR</a>)&lt;&lt;16)|<a class="el" href="ucx_8h.html#a9ac10d6353e23d4615a87fc737c65eb0">UCX_VERSION_MINOR</a>)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Version constant which ensures to increase monotonically. </p>
+
+</div>
+</div>
+<a id="aa57e5dd22d42387d748cc16777df1383"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa57e5dd22d42387d748cc16777df1383">&#9670;&nbsp;</a></span>UCX_VERSION_MAJOR</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UCX_VERSION_MAJOR&#160;&#160;&#160;2</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Major UCX version as integer constant. </p>
+
+</div>
+</div>
+<a id="a9ac10d6353e23d4615a87fc737c65eb0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9ac10d6353e23d4615a87fc737c65eb0">&#9670;&nbsp;</a></span>UCX_VERSION_MINOR</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define UCX_VERSION_MINOR&#160;&#160;&#160;1</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Minor UCX version as integer constant. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="afe5e2d5dbf34778e0e97852051570791"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afe5e2d5dbf34778e0e97852051570791">&#9670;&nbsp;</a></span>cmp_func</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef int(* cmp_func) (const void *, const void *, void *)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Function pointer to a compare function. </p>
+<p>The compare function shall take three arguments: the two values that shall be compared and optional additional data. The function shall then return -1 if the first argument is less than the second argument, 1 if the first argument is greater than the second argument and 0 if both arguments are equal. If the third argument is <code>NULL</code>, it shall be ignored. </p>
+
+</div>
+</div>
+<a id="aab917a5fe0965673c73e8ebd0a1fc967"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aab917a5fe0965673c73e8ebd0a1fc967">&#9670;&nbsp;</a></span>copy_func</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void*(* copy_func) (const void *, void *)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Function pointer to a copy function. </p>
+<p>The copy function shall create a copy of the first argument and may use additional data provided by the second argument. If the second argument is <code>NULL</code>, it shall be ignored.</p>
+<p><b>Attention:</b> if pointers returned by functions of this type may be passed to <code>free()</code> depends on the implementation of the respective <code>copy_func</code>. </p>
+
+</div>
+</div>
+<a id="a0bc5bf89e556c1d45d10863d52728ac9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0bc5bf89e556c1d45d10863d52728ac9">&#9670;&nbsp;</a></span>distance_func</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef intmax_t(* distance_func) (const void *, const void *, void *)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Function pointer to a distance function. </p>
+<p>The distance function shall take three arguments: the two values for which the distance shall be computed and optional additional data. The function shall then return the signed distance as integer value. </p>
+
+</div>
+</div>
+<a id="a6a67e255e460acb58f802067b3ff5fd5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6a67e255e460acb58f802067b3ff5fd5">&#9670;&nbsp;</a></span>read_func</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef size_t(* read_func) (void *, size_t, size_t, void *)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Function pointer to a read function. </p>
+<p>The signature of the read function shall be compatible to the signature of standard <code>fread</code>, though it may use arbitrary data types for source and destination.</p>
+<p>The arguments shall contain (in ascending order): a pointer to the destination, the length of one element, the element count and a pointer to the source. </p>
+
+</div>
+</div>
+<a id="ad2b370c2809914c8b7fedab163c266b3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad2b370c2809914c8b7fedab163c266b3">&#9670;&nbsp;</a></span>ucx_destructor</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef void(* ucx_destructor) (void *)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>A function pointer to a destructor function. </p>
+<dl class="section see"><dt>See also</dt><dd>ucx_mempool_setdestr() </dd>
+<dd>
+ucx_mempool_regdestr() </dd></dl>
+
+</div>
+</div>
+<a id="a989b3f0fa4d307d278378fde435641ed"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a989b3f0fa4d307d278378fde435641ed">&#9670;&nbsp;</a></span>write_func</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef size_t(* write_func) (const void *, size_t, size_t, void *)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Function pointer to a write function. </p>
+<p>The signature of the write function shall be compatible to the signature of standard <code>fwrite</code>, though it may use arbitrary data types for source and destination.</p>
+<p>The arguments shall contain (in ascending order): a pointer to the source, the length of one element, the element count and a pointer to the destination. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a6637171cc0ec097b297f731a3036dd3b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6637171cc0ec097b297f731a3036dd3b">&#9670;&nbsp;</a></span>ucx_szmul_impl()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_szmul_impl </td>
+          <td>(</td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>a</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>b</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t *&#160;</td>
+          <td class="paramname"><em>result</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Performs a multiplication of size_t values and checks for overflow. </p>
+<p>This is a custom implementation in case there is no compiler builtin available.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">a</td><td>first operand </td></tr>
+    <tr><td class="paramname">b</td><td>second operand </td></tr>
+    <tr><td class="paramname">result</td><td>a pointer to a size_t where the result should be stored </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>zero, if no overflow occurred and the result is correct, non-zero otherwise </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/ucx_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,85 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/ucx.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">ucx.h</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a href="ucx_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment"> * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"> * Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment"> * modification, are permitted provided that the following conditions are met:</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> *   1. Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> *   2. Redistributions in binary form must reproduce the above copyright</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer in the</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment"> *      documentation and/or other materials provided with the distribution.</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment"> * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment"> * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment"> * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"> * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment"> * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment"> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment"> * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE</span></div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> * POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;<span class="preprocessor">#ifndef UCX_H</span></div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;<span class="preprocessor">#define UCX_H</span></div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;</div><div class="line"><a name="l00040"></a><span class="lineno"><a class="line" href="ucx_8h.html#aa57e5dd22d42387d748cc16777df1383">   40</a></span>&#160;<span class="preprocessor">#define UCX_VERSION_MAJOR   2</span></div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;</div><div class="line"><a name="l00043"></a><span class="lineno"><a class="line" href="ucx_8h.html#a9ac10d6353e23d4615a87fc737c65eb0">   43</a></span>&#160;<span class="preprocessor">#define UCX_VERSION_MINOR   1</span></div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;</div><div class="line"><a name="l00046"></a><span class="lineno"><a class="line" href="ucx_8h.html#af12001920ca2fc1405615684e4dea284">   46</a></span>&#160;<span class="preprocessor">#define UCX_VERSION (((UCX_VERSION_MAJOR)&lt;&lt;16)|UCX_VERSION_MINOR)</span></div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;</div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;<span class="preprocessor">#include &lt;stdlib.h&gt;</span></div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;<span class="preprocessor">#include &lt;stdint.h&gt;</span></div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;<span class="preprocessor">#ifdef _WIN32</span></div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;<span class="preprocessor">#if !(defined __ssize_t_defined || defined _SSIZE_T_)</span></div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;<span class="preprocessor">#include &lt;BaseTsd.h&gt;</span></div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;<span class="keyword">typedef</span> SSIZE_T ssize_t;</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;<span class="preprocessor">#define __ssize_t_defined</span></div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;<span class="preprocessor">#define _SSIZE_T_</span></div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* __ssize_t_defined and _SSIZE_T */</span><span class="preprocessor"></span></div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;<span class="preprocessor">#else </span><span class="comment">/* !_WIN32 */</span><span class="preprocessor"></span></div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;<span class="preprocessor">#include &lt;sys/types.h&gt;</span></div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* _WIN32 */</span><span class="preprocessor"></span></div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;</div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;    </div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;</div><div class="line"><a name="l00072"></a><span class="lineno"><a class="line" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">   72</a></span>&#160;<span class="keyword">typedef</span> void(*<a class="code" href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a>)(<span class="keywordtype">void</span>*);</div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;</div><div class="line"><a name="l00084"></a><span class="lineno"><a class="line" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">   84</a></span>&#160;<span class="keyword">typedef</span> int(*<a class="code" href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a>)(<span class="keyword">const</span> <span class="keywordtype">void</span>*,<span class="keyword">const</span> <span class="keywordtype">void</span>*,<span class="keywordtype">void</span>*);</div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;</div><div class="line"><a name="l00093"></a><span class="lineno"><a class="line" href="ucx_8h.html#a0bc5bf89e556c1d45d10863d52728ac9">   93</a></span>&#160;<span class="keyword">typedef</span> intmax_t(*<a class="code" href="ucx_8h.html#a0bc5bf89e556c1d45d10863d52728ac9">distance_func</a>)(<span class="keyword">const</span> <span class="keywordtype">void</span>*,<span class="keyword">const</span> <span class="keywordtype">void</span>*,<span class="keywordtype">void</span>*);</div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;</div><div class="line"><a name="l00106"></a><span class="lineno"><a class="line" href="ucx_8h.html#aab917a5fe0965673c73e8ebd0a1fc967">  106</a></span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">void</span>*(*copy_func)(<span class="keyword">const</span> <span class="keywordtype">void</span>*,<span class="keywordtype">void</span>*);</div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;</div><div class="line"><a name="l00119"></a><span class="lineno"><a class="line" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">  119</a></span>&#160;<span class="keyword">typedef</span> size_t(*<a class="code" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a>)(<span class="keyword">const</span> <span class="keywordtype">void</span>*, size_t, size_t, <span class="keywordtype">void</span>*);</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;</div><div class="line"><a name="l00132"></a><span class="lineno"><a class="line" href="ucx_8h.html#a6a67e255e460acb58f802067b3ff5fd5">  132</a></span>&#160;<span class="keyword">typedef</span> size_t(*<a class="code" href="ucx_8h.html#a6a67e255e460acb58f802067b3ff5fd5">read_func</a>)(<span class="keywordtype">void</span>*, size_t, size_t, <span class="keywordtype">void</span>*);</div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;</div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;</div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;</div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;<span class="preprocessor">#if __GNUC__ &gt;= 5 || defined(__clang__)</span></div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;<span class="preprocessor">#define UCX_MUL_BUILTIN</span></div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;</div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;<span class="preprocessor">#if __WORDSIZE == 32</span></div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;</div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;<span class="preprocessor">#define ucx_szmul(a, b, result) __builtin_umul_overflow(a, b, result)</span></div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;<span class="preprocessor">#else </span><span class="comment">/* __WORDSIZE != 32 */</span><span class="preprocessor"></span></div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;<span class="preprocessor">#define ucx_szmul(a, b, result) __builtin_umull_overflow(a, b, result)</span></div><div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* __WORDSIZE */</span><span class="preprocessor"></span></div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;<span class="preprocessor">#else </span><span class="comment">/* no GNUC or clang bultin */</span><span class="preprocessor"></span></div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;</div><div class="line"><a name="l00181"></a><span class="lineno"><a class="line" href="ucx_8h.html#a0b5ed6c1a0b15356f4f948acfd32a4cc">  181</a></span>&#160;<span class="preprocessor">#define ucx_szmul(a, b, result) ucx_szmul_impl(a, b, result)</span></div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;</div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;<span class="keywordtype">int</span> <a class="code" href="ucx_8h.html#a6637171cc0ec097b297f731a3036dd3b">ucx_szmul_impl</a>(<span class="keywordtype">size_t</span> a, <span class="keywordtype">size_t</span> b, <span class="keywordtype">size_t</span> *result);</div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;</div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;</div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;<span class="preprocessor">#ifdef  __cplusplus</span></div><div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;}</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;<span class="preprocessor">#endif  </span><span class="comment">/* UCX_H */</span><span class="preprocessor"></span></div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;</div><div class="ttc" id="ucx_8h_html_afe5e2d5dbf34778e0e97852051570791"><div class="ttname"><a href="ucx_8h.html#afe5e2d5dbf34778e0e97852051570791">cmp_func</a></div><div class="ttdeci">int(* cmp_func)(const void *, const void *, void *)</div><div class="ttdoc">Function pointer to a compare function. </div><div class="ttdef"><b>Definition:</b> ucx.h:84</div></div>
+<div class="ttc" id="ucx_8h_html_a6a67e255e460acb58f802067b3ff5fd5"><div class="ttname"><a href="ucx_8h.html#a6a67e255e460acb58f802067b3ff5fd5">read_func</a></div><div class="ttdeci">size_t(* read_func)(void *, size_t, size_t, void *)</div><div class="ttdoc">Function pointer to a read function. </div><div class="ttdef"><b>Definition:</b> ucx.h:132</div></div>
+<div class="ttc" id="ucx_8h_html_a0bc5bf89e556c1d45d10863d52728ac9"><div class="ttname"><a href="ucx_8h.html#a0bc5bf89e556c1d45d10863d52728ac9">distance_func</a></div><div class="ttdeci">intmax_t(* distance_func)(const void *, const void *, void *)</div><div class="ttdoc">Function pointer to a distance function. </div><div class="ttdef"><b>Definition:</b> ucx.h:93</div></div>
+<div class="ttc" id="ucx_8h_html_a6637171cc0ec097b297f731a3036dd3b"><div class="ttname"><a href="ucx_8h.html#a6637171cc0ec097b297f731a3036dd3b">ucx_szmul_impl</a></div><div class="ttdeci">int ucx_szmul_impl(size_t a, size_t b, size_t *result)</div><div class="ttdoc">Performs a multiplication of size_t values and checks for overflow. </div><div class="ttdef"><b>Definition:</b> ucx.c:48</div></div>
+<div class="ttc" id="ucx_8h_html_a989b3f0fa4d307d278378fde435641ed"><div class="ttname"><a href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a></div><div class="ttdeci">size_t(* write_func)(const void *, size_t, size_t, void *)</div><div class="ttdoc">Function pointer to a write function. </div><div class="ttdef"><b>Definition:</b> ucx.h:119</div></div>
+<div class="ttc" id="ucx_8h_html_ad2b370c2809914c8b7fedab163c266b3"><div class="ttname"><a href="ucx_8h.html#ad2b370c2809914c8b7fedab163c266b3">ucx_destructor</a></div><div class="ttdeci">void(* ucx_destructor)(void *)</div><div class="ttdoc">A function pointer to a destructor function. </div><div class="ttdef"><b>Definition:</b> ucx.h:72</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/utils_8h.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,2233 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/utils.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">utils.h File Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Compare, copy and printf functions.  
+<a href="#details">More...</a></p>
+<div class="textblock"><code>#include &quot;<a class="el" href="ucx_8h_source.html">ucx.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="string_8h_source.html">string.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="allocator_8h_source.html">allocator.h</a>&quot;</code><br />
+<code>#include &lt;inttypes.h&gt;</code><br />
+<code>#include &lt;stdarg.h&gt;</code><br />
+</div>
+<p><a href="utils_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a23efd74fa5f701d4cf26ccbfd138a439"><td class="memItemLeft" align="right" valign="top"><a id="a23efd74fa5f701d4cf26ccbfd138a439"></a>
+#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a23efd74fa5f701d4cf26ccbfd138a439">UCX_STREAM_COPY_BUFSIZE</a>&#160;&#160;&#160;4096</td></tr>
+<tr class="memdesc:a23efd74fa5f701d4cf26ccbfd138a439"><td class="mdescLeft">&#160;</td><td class="mdescRight">Default buffer size for <a class="el" href="utils_8h.html#a41ca1344f781c0d3bf7a414a6e811392" title="Shorthand for an unbounded ucx_stream_bncopy call using a default buffer. ">ucx_stream_copy()</a> and <a class="el" href="utils_8h.html#add13f39a8af440b4f7e6f74339eaada2" title="Shorthand for ucx_stream_bncopy using a default copy buffer. ">ucx_stream_ncopy()</a>. <br /></td></tr>
+<tr class="separator:a23efd74fa5f701d4cf26ccbfd138a439"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a41ca1344f781c0d3bf7a414a6e811392"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a41ca1344f781c0d3bf7a414a6e811392">ucx_stream_copy</a>(src,  dest,  rfnc,  wfnc)</td></tr>
+<tr class="memdesc:a41ca1344f781c0d3bf7a414a6e811392"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shorthand for an unbounded ucx_stream_bncopy call using a default buffer.  <a href="#a41ca1344f781c0d3bf7a414a6e811392">More...</a><br /></td></tr>
+<tr class="separator:a41ca1344f781c0d3bf7a414a6e811392"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:add13f39a8af440b4f7e6f74339eaada2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#add13f39a8af440b4f7e6f74339eaada2">ucx_stream_ncopy</a>(src,  dest,  rfnc,  wfnc,  n)</td></tr>
+<tr class="memdesc:add13f39a8af440b4f7e6f74339eaada2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shorthand for ucx_stream_bncopy using a default copy buffer.  <a href="#add13f39a8af440b4f7e6f74339eaada2">More...</a><br /></td></tr>
+<tr class="separator:add13f39a8af440b4f7e6f74339eaada2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6003a1750a66234169bd1f8cc84b297b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a6003a1750a66234169bd1f8cc84b297b">ucx_stream_bcopy</a>(src,  dest,  rfnc,  wfnc,  buf,  bufsize)</td></tr>
+<tr class="memdesc:a6003a1750a66234169bd1f8cc84b297b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shorthand for an unbounded ucx_stream_bncopy call using the specified buffer.  <a href="#a6003a1750a66234169bd1f8cc84b297b">More...</a><br /></td></tr>
+<tr class="separator:a6003a1750a66234169bd1f8cc84b297b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af9f333b66ecd639c347c7235f4992e2e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#af9f333b66ecd639c347c7235f4992e2e">ucx_sprintf</a>(...)&#160;&#160;&#160;<a class="el" href="utils_8h.html#a9f9cf0e89ffdc256ecb35429907f51f5">ucx_asprintf</a>(<a class="el" href="allocator_8h.html#a98d2f1b341118b7a0e341fda5d8b2ebf">ucx_default_allocator</a>(), __VA_ARGS__)</td></tr>
+<tr class="memdesc:af9f333b66ecd639c347c7235f4992e2e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Shortcut for <a class="el" href="utils_8h.html#a9f9cf0e89ffdc256ecb35429907f51f5" title="A printf() like function which allocates space for a sstr_t the result is written to...">ucx_asprintf()</a> with default allocator.  <a href="#af9f333b66ecd639c347c7235f4992e2e">More...</a><br /></td></tr>
+<tr class="separator:af9f333b66ecd639c347c7235f4992e2e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9d7d65a420f026fcb6982803d5120519"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a9d7d65a420f026fcb6982803d5120519">ucx_bprintf</a>(buffer, ...)</td></tr>
+<tr class="memdesc:a9d7d65a420f026fcb6982803d5120519"><td class="mdescLeft">&#160;</td><td class="mdescRight">A <code>printf()</code> like function which writes the output to a <a class="el" href="structUcxBuffer.html" title="UCX Buffer. ">UcxBuffer</a>.  <a href="#a9d7d65a420f026fcb6982803d5120519">More...</a><br /></td></tr>
+<tr class="separator:a9d7d65a420f026fcb6982803d5120519"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:adeb6e8d0a53a829207cfa0a979d01fff"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#adeb6e8d0a53a829207cfa0a979d01fff">ucx_strcpy</a> (const void *s, void *data)</td></tr>
+<tr class="memdesc:adeb6e8d0a53a829207cfa0a979d01fff"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copies a string.  <a href="#adeb6e8d0a53a829207cfa0a979d01fff">More...</a><br /></td></tr>
+<tr class="separator:adeb6e8d0a53a829207cfa0a979d01fff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab2e184e6a744941aab6b8058116baf30"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#ab2e184e6a744941aab6b8058116baf30">ucx_memcpy</a> (const void *m, void *n)</td></tr>
+<tr class="memdesc:ab2e184e6a744941aab6b8058116baf30"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copies a memory area.  <a href="#ab2e184e6a744941aab6b8058116baf30">More...</a><br /></td></tr>
+<tr class="separator:ab2e184e6a744941aab6b8058116baf30"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a114ee7f7da62656ffd35e2dc23394201"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a114ee7f7da62656ffd35e2dc23394201">ucx_stream_bncopy</a> (void *src, void *dest, <a class="el" href="ucx_8h.html#a6a67e255e460acb58f802067b3ff5fd5">read_func</a> rfnc, <a class="el" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a> wfnc, char *buf, size_t bufsize, size_t n)</td></tr>
+<tr class="memdesc:a114ee7f7da62656ffd35e2dc23394201"><td class="mdescLeft">&#160;</td><td class="mdescRight">Reads data from a stream and writes it to another stream.  <a href="#a114ee7f7da62656ffd35e2dc23394201">More...</a><br /></td></tr>
+<tr class="separator:a114ee7f7da62656ffd35e2dc23394201"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa6a37b9d172b6a5b2803d152f9e1b258"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#aa6a37b9d172b6a5b2803d152f9e1b258">ucx_cmp_str</a> (const void *s1, const void *s2, void *data)</td></tr>
+<tr class="memdesc:aa6a37b9d172b6a5b2803d152f9e1b258"><td class="mdescLeft">&#160;</td><td class="mdescRight">Wraps the strcmp function.  <a href="#aa6a37b9d172b6a5b2803d152f9e1b258">More...</a><br /></td></tr>
+<tr class="separator:aa6a37b9d172b6a5b2803d152f9e1b258"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac6b354a878f551a3a5b20a167db3f308"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#ac6b354a878f551a3a5b20a167db3f308">ucx_cmp_strn</a> (const void *s1, const void *s2, void *n)</td></tr>
+<tr class="memdesc:ac6b354a878f551a3a5b20a167db3f308"><td class="mdescLeft">&#160;</td><td class="mdescRight">Wraps the strncmp function.  <a href="#ac6b354a878f551a3a5b20a167db3f308">More...</a><br /></td></tr>
+<tr class="separator:ac6b354a878f551a3a5b20a167db3f308"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adee0739589166d272f8cb7c23aabf8ba"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#adee0739589166d272f8cb7c23aabf8ba">ucx_cmp_sstr</a> (const void *s1, const void *s2, void *data)</td></tr>
+<tr class="memdesc:adee0739589166d272f8cb7c23aabf8ba"><td class="mdescLeft">&#160;</td><td class="mdescRight">Wraps the sstrcmp function.  <a href="#adee0739589166d272f8cb7c23aabf8ba">More...</a><br /></td></tr>
+<tr class="separator:adee0739589166d272f8cb7c23aabf8ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8ce7e11e6b3deafe89a32a091fde7f16"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a8ce7e11e6b3deafe89a32a091fde7f16">ucx_cmp_int</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:a8ce7e11e6b3deafe89a32a091fde7f16"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two integers of type int.  <a href="#a8ce7e11e6b3deafe89a32a091fde7f16">More...</a><br /></td></tr>
+<tr class="separator:a8ce7e11e6b3deafe89a32a091fde7f16"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeb57a2b9a6aaa0460c7a6bec29accf2c"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#aeb57a2b9a6aaa0460c7a6bec29accf2c">ucx_cmp_longint</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:aeb57a2b9a6aaa0460c7a6bec29accf2c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two integers of type long int.  <a href="#aeb57a2b9a6aaa0460c7a6bec29accf2c">More...</a><br /></td></tr>
+<tr class="separator:aeb57a2b9a6aaa0460c7a6bec29accf2c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a366b57def20f86a41eaedf575eea5375"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a366b57def20f86a41eaedf575eea5375">ucx_cmp_longlong</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:a366b57def20f86a41eaedf575eea5375"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two integers of type long long.  <a href="#a366b57def20f86a41eaedf575eea5375">More...</a><br /></td></tr>
+<tr class="separator:a366b57def20f86a41eaedf575eea5375"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa29e6e559946375e34113e34e0b0bd0d"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#aa29e6e559946375e34113e34e0b0bd0d">ucx_cmp_int16</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:aa29e6e559946375e34113e34e0b0bd0d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two integers of type int16_t.  <a href="#aa29e6e559946375e34113e34e0b0bd0d">More...</a><br /></td></tr>
+<tr class="separator:aa29e6e559946375e34113e34e0b0bd0d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a858b2ac443fb202643b71f6a7e9218dd"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a858b2ac443fb202643b71f6a7e9218dd">ucx_cmp_int32</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:a858b2ac443fb202643b71f6a7e9218dd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two integers of type int32_t.  <a href="#a858b2ac443fb202643b71f6a7e9218dd">More...</a><br /></td></tr>
+<tr class="separator:a858b2ac443fb202643b71f6a7e9218dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a54701aea6a89fed1402dfb0bf56bc7f6"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a54701aea6a89fed1402dfb0bf56bc7f6">ucx_cmp_int64</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:a54701aea6a89fed1402dfb0bf56bc7f6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two integers of type int64_t.  <a href="#a54701aea6a89fed1402dfb0bf56bc7f6">More...</a><br /></td></tr>
+<tr class="separator:a54701aea6a89fed1402dfb0bf56bc7f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abd83a5da91c3dd026a6931bd80c12f1e"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#abd83a5da91c3dd026a6931bd80c12f1e">ucx_cmp_uint</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:abd83a5da91c3dd026a6931bd80c12f1e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two integers of type unsigned int.  <a href="#abd83a5da91c3dd026a6931bd80c12f1e">More...</a><br /></td></tr>
+<tr class="separator:abd83a5da91c3dd026a6931bd80c12f1e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3f3cbae2594d6f722bae29acb0408a24"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a3f3cbae2594d6f722bae29acb0408a24">ucx_cmp_ulongint</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:a3f3cbae2594d6f722bae29acb0408a24"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two integers of type unsigned long int.  <a href="#a3f3cbae2594d6f722bae29acb0408a24">More...</a><br /></td></tr>
+<tr class="separator:a3f3cbae2594d6f722bae29acb0408a24"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6acfc359421f21f9a042a654ff7faac5"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a6acfc359421f21f9a042a654ff7faac5">ucx_cmp_ulonglong</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:a6acfc359421f21f9a042a654ff7faac5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two integers of type unsigned long long.  <a href="#a6acfc359421f21f9a042a654ff7faac5">More...</a><br /></td></tr>
+<tr class="separator:a6acfc359421f21f9a042a654ff7faac5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acde5366437e886a459b7468f7a9e11f0"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#acde5366437e886a459b7468f7a9e11f0">ucx_cmp_uint16</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:acde5366437e886a459b7468f7a9e11f0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two integers of type uint16_t.  <a href="#acde5366437e886a459b7468f7a9e11f0">More...</a><br /></td></tr>
+<tr class="separator:acde5366437e886a459b7468f7a9e11f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5879d1722330355914d8c9146fa549d3"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a5879d1722330355914d8c9146fa549d3">ucx_cmp_uint32</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:a5879d1722330355914d8c9146fa549d3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two integers of type uint32_t.  <a href="#a5879d1722330355914d8c9146fa549d3">More...</a><br /></td></tr>
+<tr class="separator:a5879d1722330355914d8c9146fa549d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1572a78b5b42f7151a5b2a5a7283d62d"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a1572a78b5b42f7151a5b2a5a7283d62d">ucx_cmp_uint64</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:a1572a78b5b42f7151a5b2a5a7283d62d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two integers of type uint64_t.  <a href="#a1572a78b5b42f7151a5b2a5a7283d62d">More...</a><br /></td></tr>
+<tr class="separator:a1572a78b5b42f7151a5b2a5a7283d62d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ab6753739d56c09cdf6079fdcabf7c6"><td class="memItemLeft" align="right" valign="top">intmax_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a4ab6753739d56c09cdf6079fdcabf7c6">ucx_dist_int</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:a4ab6753739d56c09cdf6079fdcabf7c6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Distance function for integers of type int.  <a href="#a4ab6753739d56c09cdf6079fdcabf7c6">More...</a><br /></td></tr>
+<tr class="separator:a4ab6753739d56c09cdf6079fdcabf7c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a43e73d288b1553a0078bf4c98dd341f5"><td class="memItemLeft" align="right" valign="top">intmax_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a43e73d288b1553a0078bf4c98dd341f5">ucx_dist_longint</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:a43e73d288b1553a0078bf4c98dd341f5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Distance function for integers of type long int.  <a href="#a43e73d288b1553a0078bf4c98dd341f5">More...</a><br /></td></tr>
+<tr class="separator:a43e73d288b1553a0078bf4c98dd341f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a306778414a2427951ea263be92368627"><td class="memItemLeft" align="right" valign="top">intmax_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a306778414a2427951ea263be92368627">ucx_dist_longlong</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:a306778414a2427951ea263be92368627"><td class="mdescLeft">&#160;</td><td class="mdescRight">Distance function for integers of type long long.  <a href="#a306778414a2427951ea263be92368627">More...</a><br /></td></tr>
+<tr class="separator:a306778414a2427951ea263be92368627"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a81fb8434b70ca11bf2c14abfa21d16a9"><td class="memItemLeft" align="right" valign="top">intmax_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a81fb8434b70ca11bf2c14abfa21d16a9">ucx_dist_int16</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:a81fb8434b70ca11bf2c14abfa21d16a9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Distance function for integers of type int16_t.  <a href="#a81fb8434b70ca11bf2c14abfa21d16a9">More...</a><br /></td></tr>
+<tr class="separator:a81fb8434b70ca11bf2c14abfa21d16a9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab4a659cc46096f0490c1dafa57726476"><td class="memItemLeft" align="right" valign="top">intmax_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#ab4a659cc46096f0490c1dafa57726476">ucx_dist_int32</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:ab4a659cc46096f0490c1dafa57726476"><td class="mdescLeft">&#160;</td><td class="mdescRight">Distance function for integers of type int32_t.  <a href="#ab4a659cc46096f0490c1dafa57726476">More...</a><br /></td></tr>
+<tr class="separator:ab4a659cc46096f0490c1dafa57726476"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a54e7d06585bad3a899befc4e9c13853f"><td class="memItemLeft" align="right" valign="top">intmax_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a54e7d06585bad3a899befc4e9c13853f">ucx_dist_int64</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:a54e7d06585bad3a899befc4e9c13853f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Distance function for integers of type int64_t.  <a href="#a54e7d06585bad3a899befc4e9c13853f">More...</a><br /></td></tr>
+<tr class="separator:a54e7d06585bad3a899befc4e9c13853f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a37b7d471ca1679992afc11a0deda45f4"><td class="memItemLeft" align="right" valign="top">intmax_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a37b7d471ca1679992afc11a0deda45f4">ucx_dist_uint</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:a37b7d471ca1679992afc11a0deda45f4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Distance function for integers of type unsigned int.  <a href="#a37b7d471ca1679992afc11a0deda45f4">More...</a><br /></td></tr>
+<tr class="separator:a37b7d471ca1679992afc11a0deda45f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abb13476228d0c16bfaba08469adbae2d"><td class="memItemLeft" align="right" valign="top">intmax_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#abb13476228d0c16bfaba08469adbae2d">ucx_dist_ulongint</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:abb13476228d0c16bfaba08469adbae2d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Distance function for integers of type unsigned long int.  <a href="#abb13476228d0c16bfaba08469adbae2d">More...</a><br /></td></tr>
+<tr class="separator:abb13476228d0c16bfaba08469adbae2d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a59a5859272cb4b43cbdd58208c41e32b"><td class="memItemLeft" align="right" valign="top">intmax_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a59a5859272cb4b43cbdd58208c41e32b">ucx_dist_ulonglong</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:a59a5859272cb4b43cbdd58208c41e32b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Distance function for integers of type unsigned long long.  <a href="#a59a5859272cb4b43cbdd58208c41e32b">More...</a><br /></td></tr>
+<tr class="separator:a59a5859272cb4b43cbdd58208c41e32b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a66e00a0703cbcde050ec922578e2f080"><td class="memItemLeft" align="right" valign="top">intmax_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a66e00a0703cbcde050ec922578e2f080">ucx_dist_uint16</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:a66e00a0703cbcde050ec922578e2f080"><td class="mdescLeft">&#160;</td><td class="mdescRight">Distance function for integers of type uint16_t.  <a href="#a66e00a0703cbcde050ec922578e2f080">More...</a><br /></td></tr>
+<tr class="separator:a66e00a0703cbcde050ec922578e2f080"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:add2b5c5507caba59d894b84e056b079b"><td class="memItemLeft" align="right" valign="top">intmax_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#add2b5c5507caba59d894b84e056b079b">ucx_dist_uint32</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:add2b5c5507caba59d894b84e056b079b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Distance function for integers of type uint32_t.  <a href="#add2b5c5507caba59d894b84e056b079b">More...</a><br /></td></tr>
+<tr class="separator:add2b5c5507caba59d894b84e056b079b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3ba75e2e0b2479eef2b22fb219b42da7"><td class="memItemLeft" align="right" valign="top">intmax_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a3ba75e2e0b2479eef2b22fb219b42da7">ucx_dist_uint64</a> (const void *i1, const void *i2, void *data)</td></tr>
+<tr class="memdesc:a3ba75e2e0b2479eef2b22fb219b42da7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Distance function for integers of type uint64_t.  <a href="#a3ba75e2e0b2479eef2b22fb219b42da7">More...</a><br /></td></tr>
+<tr class="separator:a3ba75e2e0b2479eef2b22fb219b42da7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad1196b561bcdad76c393885819769a97"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#ad1196b561bcdad76c393885819769a97">ucx_cmp_float</a> (const void *f1, const void *f2, void *data)</td></tr>
+<tr class="memdesc:ad1196b561bcdad76c393885819769a97"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two real numbers of type float.  <a href="#ad1196b561bcdad76c393885819769a97">More...</a><br /></td></tr>
+<tr class="separator:ad1196b561bcdad76c393885819769a97"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab804b7c27d0bfcd7bf3a3583140825b6"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#ab804b7c27d0bfcd7bf3a3583140825b6">ucx_cmp_double</a> (const void *d1, const void *d2, void *data)</td></tr>
+<tr class="memdesc:ab804b7c27d0bfcd7bf3a3583140825b6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two real numbers of type double.  <a href="#ab804b7c27d0bfcd7bf3a3583140825b6">More...</a><br /></td></tr>
+<tr class="separator:ab804b7c27d0bfcd7bf3a3583140825b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa174d539de3ea59be4f9640f17ce53d8"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#aa174d539de3ea59be4f9640f17ce53d8">ucx_cmp_ptr</a> (const void *ptr1, const void *ptr2, void *data)</td></tr>
+<tr class="memdesc:aa174d539de3ea59be4f9640f17ce53d8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two pointers.  <a href="#aa174d539de3ea59be4f9640f17ce53d8">More...</a><br /></td></tr>
+<tr class="separator:aa174d539de3ea59be4f9640f17ce53d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aff7d2bcded71196831a8c0664333f8e7"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#aff7d2bcded71196831a8c0664333f8e7">ucx_cmp_mem</a> (const void *ptr1, const void *ptr2, void *n)</td></tr>
+<tr class="memdesc:aff7d2bcded71196831a8c0664333f8e7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compares two memory areas.  <a href="#aff7d2bcded71196831a8c0664333f8e7">More...</a><br /></td></tr>
+<tr class="separator:aff7d2bcded71196831a8c0664333f8e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa0bec80e1c67f769ff5e112a7d4ce72a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#aa0bec80e1c67f769ff5e112a7d4ce72a">ucx_fprintf</a> (void *stream, <a class="el" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a> wfc, const char *fmt,...)</td></tr>
+<tr class="memdesc:aa0bec80e1c67f769ff5e112a7d4ce72a"><td class="mdescLeft">&#160;</td><td class="mdescRight">A <code>printf()</code> like function which writes the output to a stream by using a <a class="el" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed" title="Function pointer to a write function. ">write_func()</a>.  <a href="#aa0bec80e1c67f769ff5e112a7d4ce72a">More...</a><br /></td></tr>
+<tr class="separator:aa0bec80e1c67f769ff5e112a7d4ce72a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4907967beb92c3ae351dd239abbb6927"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a4907967beb92c3ae351dd239abbb6927">ucx_vfprintf</a> (void *stream, <a class="el" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a> wfc, const char *fmt, va_list ap)</td></tr>
+<tr class="memdesc:a4907967beb92c3ae351dd239abbb6927"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>va_list</code> version of <a class="el" href="utils_8h.html#aa0bec80e1c67f769ff5e112a7d4ce72a" title="A printf() like function which writes the output to a stream by using a write_func(). ">ucx_fprintf()</a>.  <a href="#a4907967beb92c3ae351dd239abbb6927">More...</a><br /></td></tr>
+<tr class="separator:a4907967beb92c3ae351dd239abbb6927"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9f9cf0e89ffdc256ecb35429907f51f5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a9f9cf0e89ffdc256ecb35429907f51f5">ucx_asprintf</a> (<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *allocator, const char *fmt,...)</td></tr>
+<tr class="memdesc:a9f9cf0e89ffdc256ecb35429907f51f5"><td class="mdescLeft">&#160;</td><td class="mdescRight">A <code>printf()</code> like function which allocates space for a <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> the result is written to.  <a href="#a9f9cf0e89ffdc256ecb35429907f51f5">More...</a><br /></td></tr>
+<tr class="separator:a9f9cf0e89ffdc256ecb35429907f51f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3ea1dfb856c741f3e8ec6bfdc9ad427e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structsstr__t.html">sstr_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="utils_8h.html#a3ea1dfb856c741f3e8ec6bfdc9ad427e">ucx_vasprintf</a> (<a class="el" href="structUcxAllocator.html">UcxAllocator</a> *allocator, const char *fmt, va_list ap)</td></tr>
+<tr class="memdesc:a3ea1dfb856c741f3e8ec6bfdc9ad427e"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>va_list</code> version of <a class="el" href="utils_8h.html#a9f9cf0e89ffdc256ecb35429907f51f5" title="A printf() like function which allocates space for a sstr_t the result is written to...">ucx_asprintf()</a>.  <a href="#a3ea1dfb856c741f3e8ec6bfdc9ad427e">More...</a><br /></td></tr>
+<tr class="separator:a3ea1dfb856c741f3e8ec6bfdc9ad427e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Compare, copy and printf functions. </p>
+<dl class="section author"><dt>Author</dt><dd>Mike Becker </dd>
+<dd>
+Olaf Wintermann </dd></dl>
+</div><h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a9d7d65a420f026fcb6982803d5120519"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9d7d65a420f026fcb6982803d5120519">&#9670;&nbsp;</a></span>ucx_bprintf</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_bprintf</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">buffer, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><em>...</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line"><a class="code" href="utils_8h.html#aa0bec80e1c67f769ff5e112a7d4ce72a">ucx_fprintf</a>((<a class="code" href="structUcxBuffer.html">UcxBuffer</a>*)buffer, \</div><div class="line">        (<a class="code" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a>)<a class="code" href="buffer_8h.html#af8aacc7401814392b58c1b7b81bffc05">ucx_buffer_write</a>, __VA_ARGS__)</div><div class="ttc" id="buffer_8h_html_af8aacc7401814392b58c1b7b81bffc05"><div class="ttname"><a href="buffer_8h.html#af8aacc7401814392b58c1b7b81bffc05">ucx_buffer_write</a></div><div class="ttdeci">size_t ucx_buffer_write(const void *ptr, size_t size, size_t nitems, UcxBuffer *buffer)</div><div class="ttdoc">Writes data to a UcxBuffer. </div><div class="ttdef"><b>Definition:</b> buffer.c:152</div></div>
+<div class="ttc" id="structUcxBuffer_html"><div class="ttname"><a href="structUcxBuffer.html">UcxBuffer</a></div><div class="ttdoc">UCX Buffer. </div><div class="ttdef"><b>Definition:</b> buffer.h:73</div></div>
+<div class="ttc" id="utils_8h_html_aa0bec80e1c67f769ff5e112a7d4ce72a"><div class="ttname"><a href="utils_8h.html#aa0bec80e1c67f769ff5e112a7d4ce72a">ucx_fprintf</a></div><div class="ttdeci">int ucx_fprintf(void *stream, write_func wfc, const char *fmt,...)</div><div class="ttdoc">A printf() like function which writes the output to a stream by using a write_func(). </div><div class="ttdef"><b>Definition:</b> utils.c:343</div></div>
+<div class="ttc" id="ucx_8h_html_a989b3f0fa4d307d278378fde435641ed"><div class="ttname"><a href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a></div><div class="ttdeci">size_t(* write_func)(const void *, size_t, size_t, void *)</div><div class="ttdoc">Function pointer to a write function. </div><div class="ttdef"><b>Definition:</b> ucx.h:119</div></div>
+</div><!-- fragment -->
+<p>A <code>printf()</code> like function which writes the output to a <a class="el" href="structUcxBuffer.html" title="UCX Buffer. ">UcxBuffer</a>. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">buffer</td><td>the buffer the data is written to </td></tr>
+    <tr><td class="paramname">...</td><td>format string and additional arguments </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the total number of bytes written </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="utils_8h.html#aa0bec80e1c67f769ff5e112a7d4ce72a" title="A printf() like function which writes the output to a stream by using a write_func(). ">ucx_fprintf()</a> </dd></dl>
+
+</div>
+</div>
+<a id="af9f333b66ecd639c347c7235f4992e2e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af9f333b66ecd639c347c7235f4992e2e">&#9670;&nbsp;</a></span>ucx_sprintf</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_sprintf</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><em>...</em></td><td>)</td>
+          <td>&#160;&#160;&#160;<a class="el" href="utils_8h.html#a9f9cf0e89ffdc256ecb35429907f51f5">ucx_asprintf</a>(<a class="el" href="allocator_8h.html#a98d2f1b341118b7a0e341fda5d8b2ebf">ucx_default_allocator</a>(), __VA_ARGS__)</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Shortcut for <a class="el" href="utils_8h.html#a9f9cf0e89ffdc256ecb35429907f51f5" title="A printf() like function which allocates space for a sstr_t the result is written to...">ucx_asprintf()</a> with default allocator. </p>
+
+</div>
+</div>
+<a id="a6003a1750a66234169bd1f8cc84b297b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6003a1750a66234169bd1f8cc84b297b">&#9670;&nbsp;</a></span>ucx_stream_bcopy</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_stream_bcopy</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">rfnc, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">wfnc, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">buf, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">bufsize&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line"><a class="code" href="utils_8h.html#a114ee7f7da62656ffd35e2dc23394201">ucx_stream_bncopy</a>(\</div><div class="line">        src, dest, (<a class="code" href="ucx_8h.html#a6a67e255e460acb58f802067b3ff5fd5">read_func</a>)rfnc, (<a class="code" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a>)wfnc, \</div><div class="line">        buf, bufsize, (<span class="keywordtype">size_t</span>)-1)</div><div class="ttc" id="utils_8h_html_a114ee7f7da62656ffd35e2dc23394201"><div class="ttname"><a href="utils_8h.html#a114ee7f7da62656ffd35e2dc23394201">ucx_stream_bncopy</a></div><div class="ttdeci">size_t ucx_stream_bncopy(void *src, void *dest, read_func rfnc, write_func wfnc, char *buf, size_t bufsize, size_t n)</div><div class="ttdoc">Reads data from a stream and writes it to another stream. </div><div class="ttdef"><b>Definition:</b> utils.c:52</div></div>
+<div class="ttc" id="ucx_8h_html_a6a67e255e460acb58f802067b3ff5fd5"><div class="ttname"><a href="ucx_8h.html#a6a67e255e460acb58f802067b3ff5fd5">read_func</a></div><div class="ttdeci">size_t(* read_func)(void *, size_t, size_t, void *)</div><div class="ttdoc">Function pointer to a read function. </div><div class="ttdef"><b>Definition:</b> ucx.h:132</div></div>
+<div class="ttc" id="ucx_8h_html_a989b3f0fa4d307d278378fde435641ed"><div class="ttname"><a href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a></div><div class="ttdeci">size_t(* write_func)(const void *, size_t, size_t, void *)</div><div class="ttdoc">Function pointer to a write function. </div><div class="ttdef"><b>Definition:</b> ucx.h:119</div></div>
+</div><!-- fragment -->
+<p>Shorthand for an unbounded ucx_stream_bncopy call using the specified buffer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">src</td><td>the source stream </td></tr>
+    <tr><td class="paramname">dest</td><td>the destination stream </td></tr>
+    <tr><td class="paramname">rfnc</td><td>the read function </td></tr>
+    <tr><td class="paramname">wfnc</td><td>the write function </td></tr>
+    <tr><td class="paramname">buf</td><td>a pointer to the copy buffer or <code>NULL</code> if a buffer shall be implicitly created on the heap </td></tr>
+    <tr><td class="paramname">bufsize</td><td>the size of the copy buffer - if <code>NULL</code> was provided for <code>buf</code>, this is the size of the buffer that shall be implicitly created </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>total number of bytes copied </dd></dl>
+
+</div>
+</div>
+<a id="a41ca1344f781c0d3bf7a414a6e811392"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a41ca1344f781c0d3bf7a414a6e811392">&#9670;&nbsp;</a></span>ucx_stream_copy</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_stream_copy</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">rfnc, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">wfnc&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line"><a class="code" href="utils_8h.html#a114ee7f7da62656ffd35e2dc23394201">ucx_stream_bncopy</a>(\</div><div class="line">        src, dest, (<a class="code" href="ucx_8h.html#a6a67e255e460acb58f802067b3ff5fd5">read_func</a>)rfnc, (<a class="code" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a>)wfnc, \</div><div class="line">        NULL, <a class="code" href="utils_8h.html#a23efd74fa5f701d4cf26ccbfd138a439">UCX_STREAM_COPY_BUFSIZE</a>, (<span class="keywordtype">size_t</span>)-1)</div><div class="ttc" id="utils_8h_html_a114ee7f7da62656ffd35e2dc23394201"><div class="ttname"><a href="utils_8h.html#a114ee7f7da62656ffd35e2dc23394201">ucx_stream_bncopy</a></div><div class="ttdeci">size_t ucx_stream_bncopy(void *src, void *dest, read_func rfnc, write_func wfnc, char *buf, size_t bufsize, size_t n)</div><div class="ttdoc">Reads data from a stream and writes it to another stream. </div><div class="ttdef"><b>Definition:</b> utils.c:52</div></div>
+<div class="ttc" id="utils_8h_html_a23efd74fa5f701d4cf26ccbfd138a439"><div class="ttname"><a href="utils_8h.html#a23efd74fa5f701d4cf26ccbfd138a439">UCX_STREAM_COPY_BUFSIZE</a></div><div class="ttdeci">#define UCX_STREAM_COPY_BUFSIZE</div><div class="ttdoc">Default buffer size for ucx_stream_copy() and ucx_stream_ncopy(). </div><div class="ttdef"><b>Definition:</b> utils.h:55</div></div>
+<div class="ttc" id="ucx_8h_html_a6a67e255e460acb58f802067b3ff5fd5"><div class="ttname"><a href="ucx_8h.html#a6a67e255e460acb58f802067b3ff5fd5">read_func</a></div><div class="ttdeci">size_t(* read_func)(void *, size_t, size_t, void *)</div><div class="ttdoc">Function pointer to a read function. </div><div class="ttdef"><b>Definition:</b> ucx.h:132</div></div>
+<div class="ttc" id="ucx_8h_html_a989b3f0fa4d307d278378fde435641ed"><div class="ttname"><a href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a></div><div class="ttdeci">size_t(* write_func)(const void *, size_t, size_t, void *)</div><div class="ttdoc">Function pointer to a write function. </div><div class="ttdef"><b>Definition:</b> ucx.h:119</div></div>
+</div><!-- fragment -->
+<p>Shorthand for an unbounded ucx_stream_bncopy call using a default buffer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">src</td><td>the source stream </td></tr>
+    <tr><td class="paramname">dest</td><td>the destination stream </td></tr>
+    <tr><td class="paramname">rfnc</td><td>the read function </td></tr>
+    <tr><td class="paramname">wfnc</td><td>the write function </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>total number of bytes copied</dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="utils_8h.html#a23efd74fa5f701d4cf26ccbfd138a439" title="Default buffer size for ucx_stream_copy() and ucx_stream_ncopy(). ">UCX_STREAM_COPY_BUFSIZE</a> </dd></dl>
+
+</div>
+</div>
+<a id="add13f39a8af440b4f7e6f74339eaada2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#add13f39a8af440b4f7e6f74339eaada2">&#9670;&nbsp;</a></span>ucx_stream_ncopy</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define ucx_stream_ncopy</td>
+          <td>(</td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">src, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">dest, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">rfnc, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">wfnc, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname">n&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+<b>Value:</b><div class="fragment"><div class="line"><a class="code" href="utils_8h.html#a114ee7f7da62656ffd35e2dc23394201">ucx_stream_bncopy</a>(\</div><div class="line">        src, dest, (<a class="code" href="ucx_8h.html#a6a67e255e460acb58f802067b3ff5fd5">read_func</a>)rfnc, (<a class="code" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a>)wfnc, \</div><div class="line">        NULL, <a class="code" href="utils_8h.html#a23efd74fa5f701d4cf26ccbfd138a439">UCX_STREAM_COPY_BUFSIZE</a>, n)</div><div class="ttc" id="utils_8h_html_a114ee7f7da62656ffd35e2dc23394201"><div class="ttname"><a href="utils_8h.html#a114ee7f7da62656ffd35e2dc23394201">ucx_stream_bncopy</a></div><div class="ttdeci">size_t ucx_stream_bncopy(void *src, void *dest, read_func rfnc, write_func wfnc, char *buf, size_t bufsize, size_t n)</div><div class="ttdoc">Reads data from a stream and writes it to another stream. </div><div class="ttdef"><b>Definition:</b> utils.c:52</div></div>
+<div class="ttc" id="utils_8h_html_a23efd74fa5f701d4cf26ccbfd138a439"><div class="ttname"><a href="utils_8h.html#a23efd74fa5f701d4cf26ccbfd138a439">UCX_STREAM_COPY_BUFSIZE</a></div><div class="ttdeci">#define UCX_STREAM_COPY_BUFSIZE</div><div class="ttdoc">Default buffer size for ucx_stream_copy() and ucx_stream_ncopy(). </div><div class="ttdef"><b>Definition:</b> utils.h:55</div></div>
+<div class="ttc" id="ucx_8h_html_a6a67e255e460acb58f802067b3ff5fd5"><div class="ttname"><a href="ucx_8h.html#a6a67e255e460acb58f802067b3ff5fd5">read_func</a></div><div class="ttdeci">size_t(* read_func)(void *, size_t, size_t, void *)</div><div class="ttdoc">Function pointer to a read function. </div><div class="ttdef"><b>Definition:</b> ucx.h:132</div></div>
+<div class="ttc" id="ucx_8h_html_a989b3f0fa4d307d278378fde435641ed"><div class="ttname"><a href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a></div><div class="ttdeci">size_t(* write_func)(const void *, size_t, size_t, void *)</div><div class="ttdoc">Function pointer to a write function. </div><div class="ttdef"><b>Definition:</b> ucx.h:119</div></div>
+</div><!-- fragment -->
+<p>Shorthand for ucx_stream_bncopy using a default copy buffer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">src</td><td>the source stream </td></tr>
+    <tr><td class="paramname">dest</td><td>the destination stream </td></tr>
+    <tr><td class="paramname">rfnc</td><td>the read function </td></tr>
+    <tr><td class="paramname">wfnc</td><td>the write function </td></tr>
+    <tr><td class="paramname">n</td><td>maximum number of bytes that shall be copied </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>total number of bytes copied </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a9f9cf0e89ffdc256ecb35429907f51f5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9f9cf0e89ffdc256ecb35429907f51f5">&#9670;&nbsp;</a></span>ucx_asprintf()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> ucx_asprintf </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>fmt</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><em>...</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>A <code>printf()</code> like function which allocates space for a <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> the result is written to. </p>
+<p><b>Attention</b>: The <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> data is allocated with the allocators <a class="el" href="allocator_8h.html#a29f0f6a23a70db3b60635cd6dc384473" title="A function pointer to the allocators malloc() function. ">ucx_allocator_malloc()</a> function. So it is implementation dependent, if the returned <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0" title="A pointer to the string (not necessarily NULL-terminated) ">sstr_t.ptr</a> pointer must be passed to the allocators <a class="el" href="allocator_8h.html#aaf2387ddaddd8ab4b267e6b00e5d6f7e" title="A function pointer to the allocators free() function. ">ucx_allocator_free()</a> function manually.</p>
+<p><b>Note</b>: The <a class="el" href="structsstr__t.html#af8049914efc1e67f7de3ee55ec0611b0" title="A pointer to the string (not necessarily NULL-terminated) ">sstr_t.ptr</a> of the return value will <em>always</em> be <code>NULL</code>-terminated.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>the <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a> used for allocating the result <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> </td></tr>
+    <tr><td class="paramname">fmt</td><td>format string </td></tr>
+    <tr><td class="paramname">...</td><td>additional arguments </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> containing the formatted string </dd></dl>
+
+</div>
+</div>
+<a id="ab804b7c27d0bfcd7bf3a3583140825b6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab804b7c27d0bfcd7bf3a3583140825b6">&#9670;&nbsp;</a></span>ucx_cmp_double()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_cmp_double </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>d1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>d2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Compares two real numbers of type double. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">d1</td><td>pointer to double one </td></tr>
+    <tr><td class="paramname">d2</td><td>pointer to double two </td></tr>
+    <tr><td class="paramname">data</td><td>if provided: a pointer to precision (default: 1e-14) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>-1, if *d1 is less than *d2, 0 if both are equal, 1 if *d1 is greater than *d2 </dd></dl>
+
+</div>
+</div>
+<a id="ad1196b561bcdad76c393885819769a97"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad1196b561bcdad76c393885819769a97">&#9670;&nbsp;</a></span>ucx_cmp_float()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_cmp_float </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>f1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>f2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Compares two real numbers of type float. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">f1</td><td>pointer to float one </td></tr>
+    <tr><td class="paramname">f2</td><td>pointer to float two </td></tr>
+    <tr><td class="paramname">data</td><td>if provided: a pointer to precision (default: 1e-6f) </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>-1, if *f1 is less than *f2, 0 if both are equal, 1 if *f1 is greater than *f2 </dd></dl>
+
+</div>
+</div>
+<a id="a8ce7e11e6b3deafe89a32a091fde7f16"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8ce7e11e6b3deafe89a32a091fde7f16">&#9670;&nbsp;</a></span>ucx_cmp_int()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_cmp_int </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Compares two integers of type int. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to integer one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to integer two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>-1, if *i1 is less than *i2, 0 if both are equal, 1 if *i1 is greater than *i2 </dd></dl>
+
+</div>
+</div>
+<a id="aa29e6e559946375e34113e34e0b0bd0d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa29e6e559946375e34113e34e0b0bd0d">&#9670;&nbsp;</a></span>ucx_cmp_int16()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_cmp_int16 </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Compares two integers of type int16_t. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to int16_t one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to int16_t two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>-1, if *i1 is less than *i2, 0 if both are equal, 1 if *i1 is greater than *i2 </dd></dl>
+
+</div>
+</div>
+<a id="a858b2ac443fb202643b71f6a7e9218dd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a858b2ac443fb202643b71f6a7e9218dd">&#9670;&nbsp;</a></span>ucx_cmp_int32()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_cmp_int32 </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Compares two integers of type int32_t. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to int32_t one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to int32_t two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>-1, if *i1 is less than *i2, 0 if both are equal, 1 if *i1 is greater than *i2 </dd></dl>
+
+</div>
+</div>
+<a id="a54701aea6a89fed1402dfb0bf56bc7f6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a54701aea6a89fed1402dfb0bf56bc7f6">&#9670;&nbsp;</a></span>ucx_cmp_int64()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_cmp_int64 </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Compares two integers of type int64_t. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to int64_t one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to int64_t two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>-1, if *i1 is less than *i2, 0 if both are equal, 1 if *i1 is greater than *i2 </dd></dl>
+
+</div>
+</div>
+<a id="aeb57a2b9a6aaa0460c7a6bec29accf2c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aeb57a2b9a6aaa0460c7a6bec29accf2c">&#9670;&nbsp;</a></span>ucx_cmp_longint()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_cmp_longint </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Compares two integers of type long int. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to long integer one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to long integer two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>-1, if *i1 is less than *i2, 0 if both are equal, 1 if *i1 is greater than *i2 </dd></dl>
+
+</div>
+</div>
+<a id="a366b57def20f86a41eaedf575eea5375"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a366b57def20f86a41eaedf575eea5375">&#9670;&nbsp;</a></span>ucx_cmp_longlong()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_cmp_longlong </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Compares two integers of type long long. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to long long one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to long long two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>-1, if *i1 is less than *i2, 0 if both are equal, 1 if *i1 is greater than *i2 </dd></dl>
+
+</div>
+</div>
+<a id="aff7d2bcded71196831a8c0664333f8e7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aff7d2bcded71196831a8c0664333f8e7">&#9670;&nbsp;</a></span>ucx_cmp_mem()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_cmp_mem </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>ptr1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>ptr2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>n</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Compares two memory areas. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ptr1</td><td>pointer one </td></tr>
+    <tr><td class="paramname">ptr2</td><td>pointer two </td></tr>
+    <tr><td class="paramname">n</td><td>a pointer to the size_t containing the third parameter for memcmp </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the result of memcmp(ptr1, ptr2, *n) </dd></dl>
+
+</div>
+</div>
+<a id="aa174d539de3ea59be4f9640f17ce53d8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa174d539de3ea59be4f9640f17ce53d8">&#9670;&nbsp;</a></span>ucx_cmp_ptr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_cmp_ptr </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>ptr1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>ptr2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Compares two pointers. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">ptr1</td><td>pointer one </td></tr>
+    <tr><td class="paramname">ptr2</td><td>pointer two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>-1 if ptr1 is less than ptr2, 0 if both are equal, 1 if ptr1 is greater than ptr2 </dd></dl>
+
+</div>
+</div>
+<a id="adee0739589166d272f8cb7c23aabf8ba"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adee0739589166d272f8cb7c23aabf8ba">&#9670;&nbsp;</a></span>ucx_cmp_sstr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_cmp_sstr </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>s1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>s2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Wraps the sstrcmp function. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">s1</td><td>sstr one </td></tr>
+    <tr><td class="paramname">s2</td><td>sstr two </td></tr>
+    <tr><td class="paramname">data</td><td>ignored </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the result of <a class="el" href="string_8h.html#a7ae7156c8de57454ca38d306100b8160" title="Compares two UCX strings with standard memcmp(). ">sstrcmp(s1, s2)</a> </dd></dl>
+
+</div>
+</div>
+<a id="aa6a37b9d172b6a5b2803d152f9e1b258"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa6a37b9d172b6a5b2803d152f9e1b258">&#9670;&nbsp;</a></span>ucx_cmp_str()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_cmp_str </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>s1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>s2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Wraps the strcmp function. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">s1</td><td>string one </td></tr>
+    <tr><td class="paramname">s2</td><td>string two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the result of strcmp(s1, s2) </dd></dl>
+
+</div>
+</div>
+<a id="ac6b354a878f551a3a5b20a167db3f308"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac6b354a878f551a3a5b20a167db3f308">&#9670;&nbsp;</a></span>ucx_cmp_strn()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_cmp_strn </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>s1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>s2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>n</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Wraps the strncmp function. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">s1</td><td>string one </td></tr>
+    <tr><td class="paramname">s2</td><td>string two </td></tr>
+    <tr><td class="paramname">n</td><td>a pointer to the size_t containing the third strncmp parameter </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the result of strncmp(s1, s2, *n) </dd></dl>
+
+</div>
+</div>
+<a id="abd83a5da91c3dd026a6931bd80c12f1e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abd83a5da91c3dd026a6931bd80c12f1e">&#9670;&nbsp;</a></span>ucx_cmp_uint()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_cmp_uint </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Compares two integers of type unsigned int. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to unsigned integer one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to unsigned integer two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>-1, if *i1 is less than *i2, 0 if both are equal, 1 if *i1 is greater than *i2 </dd></dl>
+
+</div>
+</div>
+<a id="acde5366437e886a459b7468f7a9e11f0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acde5366437e886a459b7468f7a9e11f0">&#9670;&nbsp;</a></span>ucx_cmp_uint16()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_cmp_uint16 </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Compares two integers of type uint16_t. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to uint16_t one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to uint16_t two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>-1, if *i1 is less than *i2, 0 if both are equal, 1 if *i1 is greater than *i2 </dd></dl>
+
+</div>
+</div>
+<a id="a5879d1722330355914d8c9146fa549d3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5879d1722330355914d8c9146fa549d3">&#9670;&nbsp;</a></span>ucx_cmp_uint32()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_cmp_uint32 </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Compares two integers of type uint32_t. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to uint32_t one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to uint32_t two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>-1, if *i1 is less than *i2, 0 if both are equal, 1 if *i1 is greater than *i2 </dd></dl>
+
+</div>
+</div>
+<a id="a1572a78b5b42f7151a5b2a5a7283d62d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1572a78b5b42f7151a5b2a5a7283d62d">&#9670;&nbsp;</a></span>ucx_cmp_uint64()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_cmp_uint64 </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Compares two integers of type uint64_t. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to uint64_t one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to uint64_t two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>-1, if *i1 is less than *i2, 0 if both are equal, 1 if *i1 is greater than *i2 </dd></dl>
+
+</div>
+</div>
+<a id="a3f3cbae2594d6f722bae29acb0408a24"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3f3cbae2594d6f722bae29acb0408a24">&#9670;&nbsp;</a></span>ucx_cmp_ulongint()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_cmp_ulongint </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Compares two integers of type unsigned long int. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to unsigned long integer one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to unsigned long integer two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>-1, if *i1 is less than *i2, 0 if both are equal, 1 if *i1 is greater than *i2 </dd></dl>
+
+</div>
+</div>
+<a id="a6acfc359421f21f9a042a654ff7faac5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6acfc359421f21f9a042a654ff7faac5">&#9670;&nbsp;</a></span>ucx_cmp_ulonglong()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_cmp_ulonglong </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Compares two integers of type unsigned long long. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to unsigned long long one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to unsigned long long two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>-1, if *i1 is less than *i2, 0 if both are equal, 1 if *i1 is greater than *i2 </dd></dl>
+
+</div>
+</div>
+<a id="a4ab6753739d56c09cdf6079fdcabf7c6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4ab6753739d56c09cdf6079fdcabf7c6">&#9670;&nbsp;</a></span>ucx_dist_int()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">intmax_t ucx_dist_int </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Distance function for integers of type int. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to integer one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to integer two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
+
+</div>
+</div>
+<a id="a81fb8434b70ca11bf2c14abfa21d16a9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a81fb8434b70ca11bf2c14abfa21d16a9">&#9670;&nbsp;</a></span>ucx_dist_int16()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">intmax_t ucx_dist_int16 </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Distance function for integers of type int16_t. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to int16_t one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to int16_t two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
+
+</div>
+</div>
+<a id="ab4a659cc46096f0490c1dafa57726476"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab4a659cc46096f0490c1dafa57726476">&#9670;&nbsp;</a></span>ucx_dist_int32()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">intmax_t ucx_dist_int32 </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Distance function for integers of type int32_t. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to int32_t one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to int32_t two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
+
+</div>
+</div>
+<a id="a54e7d06585bad3a899befc4e9c13853f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a54e7d06585bad3a899befc4e9c13853f">&#9670;&nbsp;</a></span>ucx_dist_int64()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">intmax_t ucx_dist_int64 </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Distance function for integers of type int64_t. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to int64_t one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to int64_t two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
+
+</div>
+</div>
+<a id="a43e73d288b1553a0078bf4c98dd341f5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a43e73d288b1553a0078bf4c98dd341f5">&#9670;&nbsp;</a></span>ucx_dist_longint()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">intmax_t ucx_dist_longint </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Distance function for integers of type long int. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to long integer one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to long integer two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
+
+</div>
+</div>
+<a id="a306778414a2427951ea263be92368627"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a306778414a2427951ea263be92368627">&#9670;&nbsp;</a></span>ucx_dist_longlong()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">intmax_t ucx_dist_longlong </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Distance function for integers of type long long. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to long long one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to long long two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
+
+</div>
+</div>
+<a id="a37b7d471ca1679992afc11a0deda45f4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a37b7d471ca1679992afc11a0deda45f4">&#9670;&nbsp;</a></span>ucx_dist_uint()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">intmax_t ucx_dist_uint </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Distance function for integers of type unsigned int. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to unsigned integer one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to unsigned integer two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
+
+</div>
+</div>
+<a id="a66e00a0703cbcde050ec922578e2f080"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a66e00a0703cbcde050ec922578e2f080">&#9670;&nbsp;</a></span>ucx_dist_uint16()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">intmax_t ucx_dist_uint16 </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Distance function for integers of type uint16_t. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to uint16_t one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to uint16_t two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
+
+</div>
+</div>
+<a id="add2b5c5507caba59d894b84e056b079b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#add2b5c5507caba59d894b84e056b079b">&#9670;&nbsp;</a></span>ucx_dist_uint32()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">intmax_t ucx_dist_uint32 </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Distance function for integers of type uint32_t. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to uint32_t one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to uint32_t two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
+
+</div>
+</div>
+<a id="a3ba75e2e0b2479eef2b22fb219b42da7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3ba75e2e0b2479eef2b22fb219b42da7">&#9670;&nbsp;</a></span>ucx_dist_uint64()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">intmax_t ucx_dist_uint64 </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Distance function for integers of type uint64_t. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to uint64_t one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to uint64_t two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
+
+</div>
+</div>
+<a id="abb13476228d0c16bfaba08469adbae2d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abb13476228d0c16bfaba08469adbae2d">&#9670;&nbsp;</a></span>ucx_dist_ulongint()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">intmax_t ucx_dist_ulongint </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Distance function for integers of type unsigned long int. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to unsigned long integer one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to unsigned long integer two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
+
+</div>
+</div>
+<a id="a59a5859272cb4b43cbdd58208c41e32b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a59a5859272cb4b43cbdd58208c41e32b">&#9670;&nbsp;</a></span>ucx_dist_ulonglong()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">intmax_t ucx_dist_ulonglong </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i1</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>i2</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Distance function for integers of type unsigned long long. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">i1</td><td>pointer to unsigned long long one </td></tr>
+    <tr><td class="paramname">i2</td><td>pointer to unsigned long long two </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>i1 minus i2 </dd></dl>
+
+</div>
+</div>
+<a id="aa0bec80e1c67f769ff5e112a7d4ce72a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa0bec80e1c67f769ff5e112a7d4ce72a">&#9670;&nbsp;</a></span>ucx_fprintf()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_fprintf </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a>&#160;</td>
+          <td class="paramname"><em>wfc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>fmt</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&#160;</td>
+          <td class="paramname"><em>...</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>A <code>printf()</code> like function which writes the output to a stream by using a <a class="el" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed" title="Function pointer to a write function. ">write_func()</a>. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">stream</td><td>the stream the data is written to </td></tr>
+    <tr><td class="paramname">wfc</td><td>the write function </td></tr>
+    <tr><td class="paramname">fmt</td><td>format string </td></tr>
+    <tr><td class="paramname">...</td><td>additional arguments </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the total number of bytes written </dd></dl>
+
+</div>
+</div>
+<a id="ab2e184e6a744941aab6b8058116baf30"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab2e184e6a744941aab6b8058116baf30">&#9670;&nbsp;</a></span>ucx_memcpy()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* ucx_memcpy </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>m</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>n</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Copies a memory area. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">m</td><td>a pointer to the memory area </td></tr>
+    <tr><td class="paramname">n</td><td>a pointer to the size_t containing the size of the memory area </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to a copy of the specified memory area that can be passed to free(void*) </dd></dl>
+
+</div>
+</div>
+<a id="adeb6e8d0a53a829207cfa0a979d01fff"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adeb6e8d0a53a829207cfa0a979d01fff">&#9670;&nbsp;</a></span>ucx_strcpy()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* ucx_strcpy </td>
+          <td>(</td>
+          <td class="paramtype">const void *&#160;</td>
+          <td class="paramname"><em>s</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>data</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Copies a string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">s</td><td>the string to copy </td></tr>
+    <tr><td class="paramname">data</td><td>omitted </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a pointer to a copy of s1 that can be passed to free(void*) </dd></dl>
+
+</div>
+</div>
+<a id="a114ee7f7da62656ffd35e2dc23394201"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a114ee7f7da62656ffd35e2dc23394201">&#9670;&nbsp;</a></span>ucx_stream_bncopy()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t ucx_stream_bncopy </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>src</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>dest</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#a6a67e255e460acb58f802067b3ff5fd5">read_func</a>&#160;</td>
+          <td class="paramname"><em>rfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a>&#160;</td>
+          <td class="paramname"><em>wfnc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">char *&#160;</td>
+          <td class="paramname"><em>buf</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>bufsize</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t&#160;</td>
+          <td class="paramname"><em>n</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Reads data from a stream and writes it to another stream. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">src</td><td>the source stream </td></tr>
+    <tr><td class="paramname">dest</td><td>the destination stream </td></tr>
+    <tr><td class="paramname">rfnc</td><td>the read function </td></tr>
+    <tr><td class="paramname">wfnc</td><td>the write function </td></tr>
+    <tr><td class="paramname">buf</td><td>a pointer to the copy buffer or <code>NULL</code> if a buffer shall be implicitly created on the heap </td></tr>
+    <tr><td class="paramname">bufsize</td><td>the size of the copy buffer - if <code>NULL</code> was provided for <code>buf</code>, this is the size of the buffer that shall be implicitly created </td></tr>
+    <tr><td class="paramname">n</td><td>the maximum number of bytes that shall be copied </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the total number of bytes copied </dd></dl>
+
+</div>
+</div>
+<a id="a3ea1dfb856c741f3e8ec6bfdc9ad427e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3ea1dfb856c741f3e8ec6bfdc9ad427e">&#9670;&nbsp;</a></span>ucx_vasprintf()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structsstr__t.html">sstr_t</a> ucx_vasprintf </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="structUcxAllocator.html">UcxAllocator</a> *&#160;</td>
+          <td class="paramname"><em>allocator</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>fmt</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">va_list&#160;</td>
+          <td class="paramname"><em>ap</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p><code>va_list</code> version of <a class="el" href="utils_8h.html#a9f9cf0e89ffdc256ecb35429907f51f5" title="A printf() like function which allocates space for a sstr_t the result is written to...">ucx_asprintf()</a>. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>the <a class="el" href="structUcxAllocator.html" title="UCX allocator data structure containing memory management functions. ">UcxAllocator</a> used for allocating the result <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> </td></tr>
+    <tr><td class="paramname">fmt</td><td>format string </td></tr>
+    <tr><td class="paramname">ap</td><td>argument list </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>a <a class="el" href="structsstr__t.html" title="The UCX string structure. ">sstr_t</a> containing the formatted string </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="utils_8h.html#a9f9cf0e89ffdc256ecb35429907f51f5" title="A printf() like function which allocates space for a sstr_t the result is written to...">ucx_asprintf()</a> </dd></dl>
+
+</div>
+</div>
+<a id="a4907967beb92c3ae351dd239abbb6927"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4907967beb92c3ae351dd239abbb6927">&#9670;&nbsp;</a></span>ucx_vfprintf()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int ucx_vfprintf </td>
+          <td>(</td>
+          <td class="paramtype">void *&#160;</td>
+          <td class="paramname"><em>stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a>&#160;</td>
+          <td class="paramname"><em>wfc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const char *&#160;</td>
+          <td class="paramname"><em>fmt</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">va_list&#160;</td>
+          <td class="paramname"><em>ap</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p><code>va_list</code> version of <a class="el" href="utils_8h.html#aa0bec80e1c67f769ff5e112a7d4ce72a" title="A printf() like function which writes the output to a stream by using a write_func(). ">ucx_fprintf()</a>. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">stream</td><td>the stream the data is written to </td></tr>
+    <tr><td class="paramname">wfc</td><td>the write function </td></tr>
+    <tr><td class="paramname">fmt</td><td>format string </td></tr>
+    <tr><td class="paramname">ap</td><td>argument list </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the total number of bytes written </dd></dl>
+<dl class="section see"><dt>See also</dt><dd><a class="el" href="utils_8h.html#aa0bec80e1c67f769ff5e112a7d4ce72a" title="A printf() like function which writes the output to a stream by using a write_func(). ">ucx_fprintf()</a> </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/api-2.1/utils_8h_source.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,124 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>ucx: /home/mike/workspace/c/ucx/src/ucx/utils.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectlogo"><img alt="Logo" src="uaplogo.png"/></td>
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">ucx
+   </div>
+   <div id="projectbrief">UAP Common Extensions</div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_69f4ea29401808fe6229564976cde3ce.html">ucx</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">utils.h</div>  </div>
+</div><!--header-->
+<div class="contents">
+<a href="utils_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment"> * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"> * Redistribution and use in source and binary forms, with or without</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment"> * modification, are permitted provided that the following conditions are met:</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> *   1. Redistributions of source code must retain the above copyright</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer.</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> *   2. Redistributions in binary form must reproduce the above copyright</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment"> *      notice, this list of conditions and the following disclaimer in the</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment"> *      documentation and/or other materials provided with the distribution.</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment"> * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment"> * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment"> * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment"> * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="comment"> * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment"> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment"> * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="comment"> * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE</span></div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="comment"> * POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;</div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;<span class="preprocessor">#ifndef UCX_UTILS_H</span></div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;<span class="preprocessor">#define UCX_UTILS_H</span></div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;</div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="ucx_8h.html">ucx.h</a>&quot;</span></div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="string_8h.html">string.h</a>&quot;</span></div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="allocator_8h.html">allocator.h</a>&quot;</span></div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;<span class="preprocessor">#include &lt;inttypes.h&gt;</span></div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="string_8h.html">string.h</a>&gt;</span></div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;<span class="preprocessor">#include &lt;stdarg.h&gt;</span></div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;</div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;</div><div class="line"><a name="l00055"></a><span class="lineno"><a class="line" href="utils_8h.html#a23efd74fa5f701d4cf26ccbfd138a439">   55</a></span>&#160;<span class="preprocessor">#define UCX_STREAM_COPY_BUFSIZE 4096</span></div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;<span class="keywordtype">void</span> *<a class="code" href="utils_8h.html#adeb6e8d0a53a829207cfa0a979d01fff">ucx_strcpy</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *s, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;</div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;<span class="keywordtype">void</span> *<a class="code" href="utils_8h.html#ab2e184e6a744941aab6b8058116baf30">ucx_memcpy</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *m, <span class="keywordtype">void</span> *n);</div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;<span class="keywordtype">size_t</span> <a class="code" href="utils_8h.html#a114ee7f7da62656ffd35e2dc23394201">ucx_stream_bncopy</a>(<span class="keywordtype">void</span> *src, <span class="keywordtype">void</span> *dest, <a class="code" href="ucx_8h.html#a6a67e255e460acb58f802067b3ff5fd5">read_func</a> rfnc, <a class="code" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a> wfnc,</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;        <span class="keywordtype">char</span>* buf, <span class="keywordtype">size_t</span> bufsize, <span class="keywordtype">size_t</span> n);</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;</div><div class="line"><a name="l00104"></a><span class="lineno"><a class="line" href="utils_8h.html#a41ca1344f781c0d3bf7a414a6e811392">  104</a></span>&#160;<span class="preprocessor">#define ucx_stream_copy(src,dest,rfnc,wfnc) ucx_stream_bncopy(\</span></div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;<span class="preprocessor">        src, dest, (read_func)rfnc, (write_func)wfnc, \</span></div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;<span class="preprocessor">        NULL, UCX_STREAM_COPY_BUFSIZE, (size_t)-1)</span></div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;</div><div class="line"><a name="l00118"></a><span class="lineno"><a class="line" href="utils_8h.html#add13f39a8af440b4f7e6f74339eaada2">  118</a></span>&#160;<span class="preprocessor">#define ucx_stream_ncopy(src,dest,rfnc,wfnc, n) ucx_stream_bncopy(\</span></div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;<span class="preprocessor">        src, dest, (read_func)rfnc, (write_func)wfnc, \</span></div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;<span class="preprocessor">        NULL, UCX_STREAM_COPY_BUFSIZE, n)</span></div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;</div><div class="line"><a name="l00136"></a><span class="lineno"><a class="line" href="utils_8h.html#a6003a1750a66234169bd1f8cc84b297b">  136</a></span>&#160;<span class="preprocessor">#define ucx_stream_bcopy(src,dest,rfnc,wfnc, buf, bufsize) ucx_stream_bncopy(\</span></div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;<span class="preprocessor">        src, dest, (read_func)rfnc, (write_func)wfnc, \</span></div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;<span class="preprocessor">        buf, bufsize, (size_t)-1)</span></div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;</div><div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;<span class="keywordtype">int</span> <a class="code" href="utils_8h.html#aa6a37b9d172b6a5b2803d152f9e1b258">ucx_cmp_str</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *s1, <span class="keyword">const</span> <span class="keywordtype">void</span> *s2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;</div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;<span class="keywordtype">int</span> <a class="code" href="utils_8h.html#ac6b354a878f551a3a5b20a167db3f308">ucx_cmp_strn</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *s1, <span class="keyword">const</span> <span class="keywordtype">void</span> *s2, <span class="keywordtype">void</span> *n);</div><div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;</div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;<span class="keywordtype">int</span> <a class="code" href="utils_8h.html#adee0739589166d272f8cb7c23aabf8ba">ucx_cmp_sstr</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *s1, <span class="keyword">const</span> <span class="keywordtype">void</span> *s2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;</div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;<span class="keywordtype">int</span> <a class="code" href="utils_8h.html#a8ce7e11e6b3deafe89a32a091fde7f16">ucx_cmp_int</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;</div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;<span class="keywordtype">int</span> <a class="code" href="utils_8h.html#aeb57a2b9a6aaa0460c7a6bec29accf2c">ucx_cmp_longint</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;</div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;<span class="keywordtype">int</span> <a class="code" href="utils_8h.html#a366b57def20f86a41eaedf575eea5375">ucx_cmp_longlong</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;</div><div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;<span class="keywordtype">int</span> <a class="code" href="utils_8h.html#aa29e6e559946375e34113e34e0b0bd0d">ucx_cmp_int16</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;<span class="keywordtype">int</span> <a class="code" href="utils_8h.html#a858b2ac443fb202643b71f6a7e9218dd">ucx_cmp_int32</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;</div><div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;<span class="keywordtype">int</span> <a class="code" href="utils_8h.html#a54701aea6a89fed1402dfb0bf56bc7f6">ucx_cmp_int64</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;</div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;<span class="keywordtype">int</span> <a class="code" href="utils_8h.html#abd83a5da91c3dd026a6931bd80c12f1e">ucx_cmp_uint</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;</div><div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;<span class="keywordtype">int</span> <a class="code" href="utils_8h.html#a3f3cbae2594d6f722bae29acb0408a24">ucx_cmp_ulongint</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;</div><div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;<span class="keywordtype">int</span> <a class="code" href="utils_8h.html#a6acfc359421f21f9a042a654ff7faac5">ucx_cmp_ulonglong</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;</div><div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;<span class="keywordtype">int</span> <a class="code" href="utils_8h.html#acde5366437e886a459b7468f7a9e11f0">ucx_cmp_uint16</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;</div><div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;<span class="keywordtype">int</span> <a class="code" href="utils_8h.html#a5879d1722330355914d8c9146fa549d3">ucx_cmp_uint32</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;</div><div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;<span class="keywordtype">int</span> <a class="code" href="utils_8h.html#a1572a78b5b42f7151a5b2a5a7283d62d">ucx_cmp_uint64</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;</div><div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;intmax_t <a class="code" href="utils_8h.html#a4ab6753739d56c09cdf6079fdcabf7c6">ucx_dist_int</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;</div><div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;intmax_t <a class="code" href="utils_8h.html#a43e73d288b1553a0078bf4c98dd341f5">ucx_dist_longint</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;</div><div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;intmax_t <a class="code" href="utils_8h.html#a306778414a2427951ea263be92368627">ucx_dist_longlong</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;</div><div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;intmax_t <a class="code" href="utils_8h.html#a81fb8434b70ca11bf2c14abfa21d16a9">ucx_dist_int16</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;</div><div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;intmax_t <a class="code" href="utils_8h.html#ab4a659cc46096f0490c1dafa57726476">ucx_dist_int32</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;</div><div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;intmax_t <a class="code" href="utils_8h.html#a54e7d06585bad3a899befc4e9c13853f">ucx_dist_int64</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;</div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;intmax_t <a class="code" href="utils_8h.html#a37b7d471ca1679992afc11a0deda45f4">ucx_dist_uint</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;</div><div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;intmax_t <a class="code" href="utils_8h.html#abb13476228d0c16bfaba08469adbae2d">ucx_dist_ulongint</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;</div><div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;intmax_t <a class="code" href="utils_8h.html#a59a5859272cb4b43cbdd58208c41e32b">ucx_dist_ulonglong</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;</div><div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;intmax_t <a class="code" href="utils_8h.html#a66e00a0703cbcde050ec922578e2f080">ucx_dist_uint16</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00376"></a><span class="lineno">  376</span>&#160;</div><div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;intmax_t <a class="code" href="utils_8h.html#add2b5c5507caba59d894b84e056b079b">ucx_dist_uint32</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00385"></a><span class="lineno">  385</span>&#160;</div><div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;intmax_t <a class="code" href="utils_8h.html#a3ba75e2e0b2479eef2b22fb219b42da7">ucx_dist_uint64</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *i1, <span class="keyword">const</span> <span class="keywordtype">void</span> *i2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;</div><div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;<span class="keywordtype">int</span> <a class="code" href="utils_8h.html#ad1196b561bcdad76c393885819769a97">ucx_cmp_float</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *f1, <span class="keyword">const</span> <span class="keywordtype">void</span> *f2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;</div><div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;<span class="keywordtype">int</span> <a class="code" href="utils_8h.html#ab804b7c27d0bfcd7bf3a3583140825b6">ucx_cmp_double</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *d1, <span class="keyword">const</span> <span class="keywordtype">void</span> *d2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;</div><div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;<span class="keywordtype">int</span> <a class="code" href="utils_8h.html#aa174d539de3ea59be4f9640f17ce53d8">ucx_cmp_ptr</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *ptr1, <span class="keyword">const</span> <span class="keywordtype">void</span> *ptr2, <span class="keywordtype">void</span> *data);</div><div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;</div><div class="line"><a name="l00433"></a><span class="lineno">  433</span>&#160;<span class="keywordtype">int</span> <a class="code" href="utils_8h.html#aff7d2bcded71196831a8c0664333f8e7">ucx_cmp_mem</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> *ptr1, <span class="keyword">const</span> <span class="keywordtype">void</span> *ptr2, <span class="keywordtype">void</span> *n);</div><div class="line"><a name="l00434"></a><span class="lineno">  434</span>&#160;</div><div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;<span class="keywordtype">int</span> <a class="code" href="utils_8h.html#aa0bec80e1c67f769ff5e112a7d4ce72a">ucx_fprintf</a>(<span class="keywordtype">void</span> *stream, <a class="code" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a> wfc, <span class="keyword">const</span> <span class="keywordtype">char</span> *fmt, ...);</div><div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;</div><div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;<span class="keywordtype">int</span> <a class="code" href="utils_8h.html#a4907967beb92c3ae351dd239abbb6927">ucx_vfprintf</a>(<span class="keywordtype">void</span> *stream, <a class="code" href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a> wfc, <span class="keyword">const</span> <span class="keywordtype">char</span> *fmt, va_list ap);</div><div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;</div><div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;<a class="code" href="structsstr__t.html">sstr_t</a> <a class="code" href="utils_8h.html#a9f9cf0e89ffdc256ecb35429907f51f5">ucx_asprintf</a>(<a class="code" href="structUcxAllocator.html">UcxAllocator</a> *allocator, <span class="keyword">const</span> <span class="keywordtype">char</span> *fmt, ...);</div><div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;</div><div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;<a class="code" href="structsstr__t.html">sstr_t</a> <a class="code" href="utils_8h.html#a3ea1dfb856c741f3e8ec6bfdc9ad427e">ucx_vasprintf</a>(<a class="code" href="structUcxAllocator.html">UcxAllocator</a> *allocator, <span class="keyword">const</span> <span class="keywordtype">char</span> *fmt, va_list ap);</div><div class="line"><a name="l00486"></a><span class="lineno">  486</span>&#160;</div><div class="line"><a name="l00488"></a><span class="lineno"><a class="line" href="utils_8h.html#af9f333b66ecd639c347c7235f4992e2e">  488</a></span>&#160;<span class="preprocessor">#define ucx_sprintf(...) \</span></div><div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160;<span class="preprocessor">    ucx_asprintf(ucx_default_allocator(), __VA_ARGS__)</span></div><div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;</div><div class="line"><a name="l00500"></a><span class="lineno"><a class="line" href="utils_8h.html#a9d7d65a420f026fcb6982803d5120519">  500</a></span>&#160;<span class="preprocessor">#define ucx_bprintf(buffer, ...) ucx_fprintf((UcxBuffer*)buffer, \</span></div><div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;<span class="preprocessor">        (write_func)ucx_buffer_write, __VA_ARGS__)</span></div><div class="line"><a name="l00502"></a><span class="lineno">  502</span>&#160;</div><div class="line"><a name="l00503"></a><span class="lineno">  503</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;}</div><div class="line"><a name="l00505"></a><span class="lineno">  505</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00506"></a><span class="lineno">  506</span>&#160;</div><div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* UCX_UTILS_H */</span><span class="preprocessor"></span></div><div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;</div><div class="ttc" id="utils_8h_html_a5879d1722330355914d8c9146fa549d3"><div class="ttname"><a href="utils_8h.html#a5879d1722330355914d8c9146fa549d3">ucx_cmp_uint32</a></div><div class="ttdeci">int ucx_cmp_uint32(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Compares two integers of type uint32_t. </div><div class="ttdef"><b>Definition:</b> utils.c:205</div></div>
+<div class="ttc" id="structsstr__t_html"><div class="ttname"><a href="structsstr__t.html">sstr_t</a></div><div class="ttdoc">The UCX string structure. </div><div class="ttdef"><b>Definition:</b> string.h:90</div></div>
+<div class="ttc" id="utils_8h_html_aeb57a2b9a6aaa0460c7a6bec29accf2c"><div class="ttname"><a href="utils_8h.html#aeb57a2b9a6aaa0460c7a6bec29accf2c">ucx_cmp_longint</a></div><div class="ttdeci">int ucx_cmp_longint(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Compares two integers of type long int. </div><div class="ttdef"><b>Definition:</b> utils.c:115</div></div>
+<div class="ttc" id="utils_8h_html_a4ab6753739d56c09cdf6079fdcabf7c6"><div class="ttname"><a href="utils_8h.html#a4ab6753739d56c09cdf6079fdcabf7c6">ucx_dist_int</a></div><div class="ttdeci">intmax_t ucx_dist_int(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Distance function for integers of type int. </div><div class="ttdef"><b>Definition:</b> utils.c:225</div></div>
+<div class="ttc" id="string_8h_html"><div class="ttname"><a href="string_8h.html">string.h</a></div><div class="ttdoc">Bounded string implementation. </div></div>
+<div class="ttc" id="utils_8h_html_a6acfc359421f21f9a042a654ff7faac5"><div class="ttname"><a href="utils_8h.html#a6acfc359421f21f9a042a654ff7faac5">ucx_cmp_ulonglong</a></div><div class="ttdeci">int ucx_cmp_ulonglong(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Compares two integers of type unsigned long long. </div><div class="ttdef"><b>Definition:</b> utils.c:185</div></div>
+<div class="ttc" id="utils_8h_html_a114ee7f7da62656ffd35e2dc23394201"><div class="ttname"><a href="utils_8h.html#a114ee7f7da62656ffd35e2dc23394201">ucx_stream_bncopy</a></div><div class="ttdeci">size_t ucx_stream_bncopy(void *src, void *dest, read_func rfnc, write_func wfnc, char *buf, size_t bufsize, size_t n)</div><div class="ttdoc">Reads data from a stream and writes it to another stream. </div><div class="ttdef"><b>Definition:</b> utils.c:52</div></div>
+<div class="ttc" id="utils_8h_html_adee0739589166d272f8cb7c23aabf8ba"><div class="ttname"><a href="utils_8h.html#adee0739589166d272f8cb7c23aabf8ba">ucx_cmp_sstr</a></div><div class="ttdeci">int ucx_cmp_sstr(const void *s1, const void *s2, void *data)</div><div class="ttdoc">Wraps the sstrcmp function. </div><div class="ttdef"><b>Definition:</b> utils.c:99</div></div>
+<div class="ttc" id="ucx_8h_html"><div class="ttname"><a href="ucx_8h.html">ucx.h</a></div><div class="ttdoc">Main UCX Header providing most common definitions. </div></div>
+<div class="ttc" id="utils_8h_html_ad1196b561bcdad76c393885819769a97"><div class="ttname"><a href="utils_8h.html#ad1196b561bcdad76c393885819769a97">ucx_cmp_float</a></div><div class="ttdeci">int ucx_cmp_float(const void *f1, const void *f2, void *data)</div><div class="ttdoc">Compares two real numbers of type float. </div><div class="ttdef"><b>Definition:</b> utils.c:297</div></div>
+<div class="ttc" id="utils_8h_html_a366b57def20f86a41eaedf575eea5375"><div class="ttname"><a href="utils_8h.html#a366b57def20f86a41eaedf575eea5375">ucx_cmp_longlong</a></div><div class="ttdeci">int ucx_cmp_longlong(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Compares two integers of type long long. </div><div class="ttdef"><b>Definition:</b> utils.c:125</div></div>
+<div class="ttc" id="utils_8h_html_a858b2ac443fb202643b71f6a7e9218dd"><div class="ttname"><a href="utils_8h.html#a858b2ac443fb202643b71f6a7e9218dd">ucx_cmp_int32</a></div><div class="ttdeci">int ucx_cmp_int32(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Compares two integers of type int32_t. </div><div class="ttdef"><b>Definition:</b> utils.c:145</div></div>
+<div class="ttc" id="utils_8h_html_a3f3cbae2594d6f722bae29acb0408a24"><div class="ttname"><a href="utils_8h.html#a3f3cbae2594d6f722bae29acb0408a24">ucx_cmp_ulongint</a></div><div class="ttdeci">int ucx_cmp_ulongint(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Compares two integers of type unsigned long int. </div><div class="ttdef"><b>Definition:</b> utils.c:175</div></div>
+<div class="ttc" id="utils_8h_html_a1572a78b5b42f7151a5b2a5a7283d62d"><div class="ttname"><a href="utils_8h.html#a1572a78b5b42f7151a5b2a5a7283d62d">ucx_cmp_uint64</a></div><div class="ttdeci">int ucx_cmp_uint64(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Compares two integers of type uint64_t. </div><div class="ttdef"><b>Definition:</b> utils.c:215</div></div>
+<div class="ttc" id="utils_8h_html_a306778414a2427951ea263be92368627"><div class="ttname"><a href="utils_8h.html#a306778414a2427951ea263be92368627">ucx_dist_longlong</a></div><div class="ttdeci">intmax_t ucx_dist_longlong(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Distance function for integers of type long long. </div><div class="ttdef"><b>Definition:</b> utils.c:237</div></div>
+<div class="ttc" id="utils_8h_html_ac6b354a878f551a3a5b20a167db3f308"><div class="ttname"><a href="utils_8h.html#ac6b354a878f551a3a5b20a167db3f308">ucx_cmp_strn</a></div><div class="ttdeci">int ucx_cmp_strn(const void *s1, const void *s2, void *n)</div><div class="ttdoc">Wraps the strncmp function. </div><div class="ttdef"><b>Definition:</b> utils.c:95</div></div>
+<div class="ttc" id="utils_8h_html_aa6a37b9d172b6a5b2803d152f9e1b258"><div class="ttname"><a href="utils_8h.html#aa6a37b9d172b6a5b2803d152f9e1b258">ucx_cmp_str</a></div><div class="ttdeci">int ucx_cmp_str(const void *s1, const void *s2, void *data)</div><div class="ttdoc">Wraps the strcmp function. </div><div class="ttdef"><b>Definition:</b> utils.c:91</div></div>
+<div class="ttc" id="utils_8h_html_ab804b7c27d0bfcd7bf3a3583140825b6"><div class="ttname"><a href="utils_8h.html#ab804b7c27d0bfcd7bf3a3583140825b6">ucx_cmp_double</a></div><div class="ttdeci">int ucx_cmp_double(const void *d1, const void *d2, void *data)</div><div class="ttdoc">Compares two real numbers of type double. </div><div class="ttdef"><b>Definition:</b> utils.c:308</div></div>
+<div class="ttc" id="utils_8h_html_a3ba75e2e0b2479eef2b22fb219b42da7"><div class="ttname"><a href="utils_8h.html#a3ba75e2e0b2479eef2b22fb219b42da7">ucx_dist_uint64</a></div><div class="ttdeci">intmax_t ucx_dist_uint64(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Distance function for integers of type uint64_t. </div><div class="ttdef"><b>Definition:</b> utils.c:291</div></div>
+<div class="ttc" id="utils_8h_html_add2b5c5507caba59d894b84e056b079b"><div class="ttname"><a href="utils_8h.html#add2b5c5507caba59d894b84e056b079b">ucx_dist_uint32</a></div><div class="ttdeci">intmax_t ucx_dist_uint32(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Distance function for integers of type uint32_t. </div><div class="ttdef"><b>Definition:</b> utils.c:285</div></div>
+<div class="ttc" id="structUcxAllocator_html"><div class="ttname"><a href="structUcxAllocator.html">UcxAllocator</a></div><div class="ttdoc">UCX allocator data structure containing memory management functions. </div><div class="ttdef"><b>Definition:</b> allocator.h:88</div></div>
+<div class="ttc" id="utils_8h_html_aa174d539de3ea59be4f9640f17ce53d8"><div class="ttname"><a href="utils_8h.html#aa174d539de3ea59be4f9640f17ce53d8">ucx_cmp_ptr</a></div><div class="ttdeci">int ucx_cmp_ptr(const void *ptr1, const void *ptr2, void *data)</div><div class="ttdoc">Compares two pointers. </div><div class="ttdef"><b>Definition:</b> utils.c:319</div></div>
+<div class="ttc" id="utils_8h_html_aff7d2bcded71196831a8c0664333f8e7"><div class="ttname"><a href="utils_8h.html#aff7d2bcded71196831a8c0664333f8e7">ucx_cmp_mem</a></div><div class="ttdeci">int ucx_cmp_mem(const void *ptr1, const void *ptr2, void *n)</div><div class="ttdoc">Compares two memory areas. </div><div class="ttdef"><b>Definition:</b> utils.c:329</div></div>
+<div class="ttc" id="utils_8h_html_a59a5859272cb4b43cbdd58208c41e32b"><div class="ttname"><a href="utils_8h.html#a59a5859272cb4b43cbdd58208c41e32b">ucx_dist_ulonglong</a></div><div class="ttdeci">intmax_t ucx_dist_ulonglong(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Distance function for integers of type unsigned long long. </div><div class="ttdef"><b>Definition:</b> utils.c:273</div></div>
+<div class="ttc" id="utils_8h_html_aa0bec80e1c67f769ff5e112a7d4ce72a"><div class="ttname"><a href="utils_8h.html#aa0bec80e1c67f769ff5e112a7d4ce72a">ucx_fprintf</a></div><div class="ttdeci">int ucx_fprintf(void *stream, write_func wfc, const char *fmt,...)</div><div class="ttdoc">A printf() like function which writes the output to a stream by using a write_func(). </div><div class="ttdef"><b>Definition:</b> utils.c:343</div></div>
+<div class="ttc" id="utils_8h_html_acde5366437e886a459b7468f7a9e11f0"><div class="ttname"><a href="utils_8h.html#acde5366437e886a459b7468f7a9e11f0">ucx_cmp_uint16</a></div><div class="ttdeci">int ucx_cmp_uint16(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Compares two integers of type uint16_t. </div><div class="ttdef"><b>Definition:</b> utils.c:195</div></div>
+<div class="ttc" id="utils_8h_html_a8ce7e11e6b3deafe89a32a091fde7f16"><div class="ttname"><a href="utils_8h.html#a8ce7e11e6b3deafe89a32a091fde7f16">ucx_cmp_int</a></div><div class="ttdeci">int ucx_cmp_int(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Compares two integers of type int. </div><div class="ttdef"><b>Definition:</b> utils.c:105</div></div>
+<div class="ttc" id="utils_8h_html_a54e7d06585bad3a899befc4e9c13853f"><div class="ttname"><a href="utils_8h.html#a54e7d06585bad3a899befc4e9c13853f">ucx_dist_int64</a></div><div class="ttdeci">intmax_t ucx_dist_int64(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Distance function for integers of type int64_t. </div><div class="ttdef"><b>Definition:</b> utils.c:255</div></div>
+<div class="ttc" id="ucx_8h_html_a6a67e255e460acb58f802067b3ff5fd5"><div class="ttname"><a href="ucx_8h.html#a6a67e255e460acb58f802067b3ff5fd5">read_func</a></div><div class="ttdeci">size_t(* read_func)(void *, size_t, size_t, void *)</div><div class="ttdoc">Function pointer to a read function. </div><div class="ttdef"><b>Definition:</b> ucx.h:132</div></div>
+<div class="ttc" id="utils_8h_html_abd83a5da91c3dd026a6931bd80c12f1e"><div class="ttname"><a href="utils_8h.html#abd83a5da91c3dd026a6931bd80c12f1e">ucx_cmp_uint</a></div><div class="ttdeci">int ucx_cmp_uint(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Compares two integers of type unsigned int. </div><div class="ttdef"><b>Definition:</b> utils.c:165</div></div>
+<div class="ttc" id="utils_8h_html_a9f9cf0e89ffdc256ecb35429907f51f5"><div class="ttname"><a href="utils_8h.html#a9f9cf0e89ffdc256ecb35429907f51f5">ucx_asprintf</a></div><div class="ttdeci">sstr_t ucx_asprintf(UcxAllocator *allocator, const char *fmt,...)</div><div class="ttdoc">A printf() like function which allocates space for a sstr_t the result is written to...</div><div class="ttdef"><b>Definition:</b> utils.c:394</div></div>
+<div class="ttc" id="utils_8h_html_a37b7d471ca1679992afc11a0deda45f4"><div class="ttname"><a href="utils_8h.html#a37b7d471ca1679992afc11a0deda45f4">ucx_dist_uint</a></div><div class="ttdeci">intmax_t ucx_dist_uint(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Distance function for integers of type unsigned int. </div><div class="ttdef"><b>Definition:</b> utils.c:261</div></div>
+<div class="ttc" id="utils_8h_html_a81fb8434b70ca11bf2c14abfa21d16a9"><div class="ttname"><a href="utils_8h.html#a81fb8434b70ca11bf2c14abfa21d16a9">ucx_dist_int16</a></div><div class="ttdeci">intmax_t ucx_dist_int16(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Distance function for integers of type int16_t. </div><div class="ttdef"><b>Definition:</b> utils.c:243</div></div>
+<div class="ttc" id="utils_8h_html_adeb6e8d0a53a829207cfa0a979d01fff"><div class="ttname"><a href="utils_8h.html#adeb6e8d0a53a829207cfa0a979d01fff">ucx_strcpy</a></div><div class="ttdeci">void * ucx_strcpy(const void *s, void *data)</div><div class="ttdoc">Copies a string. </div><div class="ttdef"><b>Definition:</b> utils.c:37</div></div>
+<div class="ttc" id="utils_8h_html_a43e73d288b1553a0078bf4c98dd341f5"><div class="ttname"><a href="utils_8h.html#a43e73d288b1553a0078bf4c98dd341f5">ucx_dist_longint</a></div><div class="ttdeci">intmax_t ucx_dist_longint(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Distance function for integers of type long int. </div><div class="ttdef"><b>Definition:</b> utils.c:231</div></div>
+<div class="ttc" id="utils_8h_html_a66e00a0703cbcde050ec922578e2f080"><div class="ttname"><a href="utils_8h.html#a66e00a0703cbcde050ec922578e2f080">ucx_dist_uint16</a></div><div class="ttdeci">intmax_t ucx_dist_uint16(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Distance function for integers of type uint16_t. </div><div class="ttdef"><b>Definition:</b> utils.c:279</div></div>
+<div class="ttc" id="utils_8h_html_ab4a659cc46096f0490c1dafa57726476"><div class="ttname"><a href="utils_8h.html#ab4a659cc46096f0490c1dafa57726476">ucx_dist_int32</a></div><div class="ttdeci">intmax_t ucx_dist_int32(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Distance function for integers of type int32_t. </div><div class="ttdef"><b>Definition:</b> utils.c:249</div></div>
+<div class="ttc" id="allocator_8h_html"><div class="ttname"><a href="allocator_8h.html">allocator.h</a></div><div class="ttdoc">Allocator for custom memory management. </div></div>
+<div class="ttc" id="utils_8h_html_abb13476228d0c16bfaba08469adbae2d"><div class="ttname"><a href="utils_8h.html#abb13476228d0c16bfaba08469adbae2d">ucx_dist_ulongint</a></div><div class="ttdeci">intmax_t ucx_dist_ulongint(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Distance function for integers of type unsigned long int. </div><div class="ttdef"><b>Definition:</b> utils.c:267</div></div>
+<div class="ttc" id="ucx_8h_html_a989b3f0fa4d307d278378fde435641ed"><div class="ttname"><a href="ucx_8h.html#a989b3f0fa4d307d278378fde435641ed">write_func</a></div><div class="ttdeci">size_t(* write_func)(const void *, size_t, size_t, void *)</div><div class="ttdoc">Function pointer to a write function. </div><div class="ttdef"><b>Definition:</b> ucx.h:119</div></div>
+<div class="ttc" id="utils_8h_html_aa29e6e559946375e34113e34e0b0bd0d"><div class="ttname"><a href="utils_8h.html#aa29e6e559946375e34113e34e0b0bd0d">ucx_cmp_int16</a></div><div class="ttdeci">int ucx_cmp_int16(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Compares two integers of type int16_t. </div><div class="ttdef"><b>Definition:</b> utils.c:135</div></div>
+<div class="ttc" id="utils_8h_html_ab2e184e6a744941aab6b8058116baf30"><div class="ttname"><a href="utils_8h.html#ab2e184e6a744941aab6b8058116baf30">ucx_memcpy</a></div><div class="ttdeci">void * ucx_memcpy(const void *m, void *n)</div><div class="ttdoc">Copies a memory area. </div><div class="ttdef"><b>Definition:</b> utils.c:45</div></div>
+<div class="ttc" id="utils_8h_html_a54701aea6a89fed1402dfb0bf56bc7f6"><div class="ttname"><a href="utils_8h.html#a54701aea6a89fed1402dfb0bf56bc7f6">ucx_cmp_int64</a></div><div class="ttdeci">int ucx_cmp_int64(const void *i1, const void *i2, void *data)</div><div class="ttdoc">Compares two integers of type int64_t. </div><div class="ttdef"><b>Definition:</b> utils.c:155</div></div>
+<div class="ttc" id="utils_8h_html_a4907967beb92c3ae351dd239abbb6927"><div class="ttname"><a href="utils_8h.html#a4907967beb92c3ae351dd239abbb6927">ucx_vfprintf</a></div><div class="ttdeci">int ucx_vfprintf(void *stream, write_func wfc, const char *fmt, va_list ap)</div><div class="ttdoc">va_list version of ucx_fprintf(). </div><div class="ttdef"><b>Definition:</b> utils.c:352</div></div>
+<div class="ttc" id="utils_8h_html_a3ea1dfb856c741f3e8ec6bfdc9ad427e"><div class="ttname"><a href="utils_8h.html#a3ea1dfb856c741f3e8ec6bfdc9ad427e">ucx_vasprintf</a></div><div class="ttdeci">sstr_t ucx_vasprintf(UcxAllocator *allocator, const char *fmt, va_list ap)</div><div class="ttdoc">va_list version of ucx_asprintf(). </div><div class="ttdef"><b>Definition:</b> utils.c:403</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated on Thu Dec 19 2019 19:58:24 for ucx by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
--- a/docs/src/CMakeLists.txt	Mon Dec 30 09:54:10 2019 +0100
+++ b/docs/src/CMakeLists.txt	Sat Feb 06 19:11:44 2021 +0100
@@ -1,7 +1,7 @@
 #
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 #
-# Copyright 2019 Mike Becker, Olaf Wintermann All rights reserved.
+# Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions are met:
@@ -28,7 +28,7 @@
 
 set(PANDOC_DESTDIR ${CMAKE_BINARY_DIR}/docs/web)
 set(PANDOC_ARGS -c ucx.css -B header.html -A footer.html -T 'UAP Common Extensions')
-set(PANDOC_SRC index.md license.md modules.md install.md)
+set(PANDOC_SRC index.md license.md install.md)
 set(LOGO_PATH ../../uaplogo.png)
 
 if (NOT EXISTS ${PANDOC_EXECUTABLE})
@@ -42,6 +42,7 @@
 message(STATUS "HTML Documentation will be generated at: ${PANDOC_DESTDIR}.")
 file(MAKE_DIRECTORY ${PANDOC_DESTDIR})
 
+# UCX 3.0 documentation
 foreach(source_file ${PANDOC_SRC})
     string(REPLACE .md .html dest_file ${source_file})
     string(PREPEND dest_file "${PANDOC_DESTDIR}/")
@@ -54,10 +55,20 @@
     )
 endforeach()
 
+# UCX 2.1 documentation
+add_custom_target(docs-html-21
+        COMMAND ${PANDOC_EXECUTABLE} -c ucx.css -B header-ucx2.html -A footer.html
+            -T 'UAP Common Extensions' -o ${PANDOC_DESTDIR}/modules-ucx2.html modules-ucx2.md
+        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+        DEPENDS modules-ucx2.md
+        COMMENT "Adding UCX 2.1 HTML documentation."
+)
+
+# Collect all HTML documentation
 add_custom_target(docs-html
         COMMAND ${CMAKE_COMMAND} -E copy ucx.css ${PANDOC_DESTDIR}/ucx.css
         COMMAND ${CMAKE_COMMAND} -E copy ${LOGO_PATH} ${PANDOC_DESTDIR}/uaplogo.png
-        DEPENDS ${PANDOC_DEST}
+        DEPENDS ${PANDOC_DEST} docs-html-21
         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
         COMMENT "Generating HTML documentation with pandoc."
 )
--- a/docs/src/Makefile	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-#
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-#
-# Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-#   1. Redistributions of source code must retain the above copyright
-#      notice, this list of conditions and the following disclaimer.
-#
-#   2. Redistributions in binary form must reproduce the above copyright
-#      notice, this list of conditions and the following disclaimer in the
-#      documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
-# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-
-PD=pandoc
-PFLAGS=-c ucx.css -B header.html -A footer.html -T 'UAP Common Extensions'
-
-SRC  = index.md
-SRC += install.md
-SRC += license.md
-SRC += modules.md
-
-DEST = ../web
-
-PROJROOT = ../..
-LOGO = uaplogo.png
-
-HTML = $(SRC:%.md=$(DEST)/%.html)
-
-all:  html api
-	
-
-html: $(DEST) $(DEST)/ucx.css $(DEST)/$(LOGO) $(HTML)
-	
-
-api: $(DEST)
-	cd $(PROJROOT); doxygen
-
-$(DEST):
-	mkdir -p $@
-
-$(DEST)/%.html: %.md
-	$(PD) $(PFLAGS) $< -o $@
-
-$(DEST)/ucx.css: ucx.css
-	cp $< $@
-	
-$(DEST)/$(LOGO): $(PROJROOT)/$(LOGO)
-	cp $< $@
-
-clean:
-	rm -Rf $(DEST) 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/src/header-ucx2.html	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,58 @@
+        <!-- begin header -->
+        <div id="page-header">
+            <span>UAP Common Extensions</span>
+            <img src="uaplogo.png" alt="UAP Core">
+        </div>
+        <!-- end header -->
+
+        <!-- begin navigation -->
+        <div id="sidebar">
+            <div class="nav">
+                <h3>Getting Started</h3>
+                <ul>
+                    <li><a href="index.html">Overview</a></li>
+                    <li><a href="install.html">Build Instructions</a></li>
+                    <li><a href="license.html">License</a></li>
+                </ul>
+            </div>
+            <div class="nav">
+                <h3>Documentation</h3>
+                <ul>
+                    <li><a href="modules.html">Modules</a>
+                    <ul>
+                        <li><a href="modules.html#allocator">Allocator</a></li>
+                        <li><a href="modules.html#array">Array</a></li>
+                        <li><a href="modules.html#avl-tree">AVL Tree</a></li>
+                        <li><a href="modules.html#buffer">Buffer</a></li>
+                        <li><a href="modules.html#list">List</a></li>
+                        <li><a href="modules.html#logging">Logging</a></li>
+                        <li><a href="modules.html#map">Map</a></li>
+                        <li><a href="modules.html#memory-pool">Memory Pool</a></li>
+                        <li><a href="modules.html#properties">Properties</a></li>
+                        <li><a href="modules.html#stack">Stack</a></li>
+                        <li><a href="modules.html#string">String</a></li>
+                        <li><a href="modules.html#testing">Testing</a></li>
+                        <li><a href="modules.html#utilities">Utilities</a></li>
+                    </ul>
+                    </li>
+                    <li><a target="_blank" href="api-2.1/index.html">API Reference</a></li>
+                </ul>
+            </div>
+            <div class="nav">
+                <h3>Repositories</h3>
+                <ul>
+                    <li><a target="_blank" href="https://develop.uap-core.de/hg/ucx/">UAP Core Repository</a></li>
+                    <li><a target="_blank" href="https://sourceforge.net/p/ucx/">Source Forge</a></li>
+                </ul>
+            </div>
+            <div class="nav">
+                <h3>Partners</h3>
+                <ul>
+                    <li><a target="_blank" href="https://www.unixwork.de">UNIXwork</a></li>
+                </ul>
+            </div>
+        </div>
+        <!-- end navigation -->
+
+        <!-- begin content -->
+        <div id="content">
\ No newline at end of file
--- a/docs/src/header.html	Mon Dec 30 09:54:10 2019 +0100
+++ b/docs/src/header.html	Sat Feb 06 19:11:44 2021 +0100
@@ -18,24 +18,9 @@
             <div class="nav">
                 <h3>Documentation</h3>
                 <ul>
-                    <li><a href="modules.html">Modules</a>
-                    <ul>
-                        <li><a href="modules.html#allocator">Allocator</a></li>
-                        <li><a href="modules.html#array">Array</a></li>
-                        <li><a href="modules.html#avl-tree">AVL Tree</a></li>
-                        <li><a href="modules.html#buffer">Buffer</a></li>
-                        <li><a href="modules.html#list">List</a></li>
-                        <li><a href="modules.html#logging">Logging</a></li>
-                        <li><a href="modules.html#map">Map</a></li>
-                        <li><a href="modules.html#memory-pool">Memory Pool</a></li>
-                        <li><a href="modules.html#properties">Properties</a></li>
-                        <li><a href="modules.html#stack">Stack</a></li>
-                        <li><a href="modules.html#string">String</a></li>
-                        <li><a href="modules.html#testing">Testing</a></li>
-                        <li><a href="modules.html#utilities">Utilities</a></li>
-                    </ul>
-                    </li>
+                    <li>Under construction...</li>
                     <li><a target="_blank" href="api/index.html">API Reference</a></li>
+                    <li><a href="modules-ucx2.html">UCX 2.1</a>
                 </ul>
             </div>
             <div class="nav">
--- a/docs/src/index.md	Mon Dec 30 09:54:10 2019 +0100
+++ b/docs/src/index.md	Sat Feb 06 19:11:44 2021 +0100
@@ -29,6 +29,10 @@
 Changelog
 ---------
 
+### Version 3.0
+
+ * under construction...
+
 ### Version 2.1 - 2019-12-30
  
  * adds string replace functions
--- a/docs/src/install.md	Mon Dec 30 09:54:10 2019 +0100
+++ b/docs/src/install.md	Sat Feb 06 19:11:44 2021 +0100
@@ -2,14 +2,32 @@
 title: Build Instructions
 ---
 
-The install procedure is the same on all supported platforms.
-For Microsoft Windows, however, you will need an appropriate port of the linux
-tools (like MinGW or Cygwin).
+The build processes uses CMake starting with UCX 3.0.
 First, download the source code from [Source Forge][1].
 
     wget https://sourceforge.net/projects/ucx/files/ucx-latest.tar.gz
     tar -xzf ucx-latest.tar.gz
     cd ucx-latest
+    
+Then create a build directory and issue the cmake command and then make.
+
+    mkdir build
+    cd build
+    cmake ..
+    make
+
+---
+
+### UCX 2.1
+
+The build procedure for UCX 2.1 uses a configure script.
+For Microsoft Windows, you will need an appropriate port of the linux
+tools (like MinGW or Cygwin).
+First, download the source code from [Source Forge][1].
+
+    wget https://sourceforge.net/projects/ucx/files/ucx-2.1.0.tar.gz
+    tar -xzf ucx-2.1.0.tar.gz
+    cd ucx-2.1.0
 
 Then issue the `configure` and `make` commands.
 
--- a/docs/src/license.md	Mon Dec 30 09:54:10 2019 +0100
+++ b/docs/src/license.md	Sat Feb 06 19:11:44 2021 +0100
@@ -2,7 +2,7 @@
 title: License
 ---
 
-Copyright 2017 Mike Becker, Olaf Wintermann. All rights reserved.
+Copyright 2021 Mike Becker, Olaf Wintermann. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/src/modules-ucx2.md	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,873 @@
+---
+title: UCX 2.1 Modules
+---
+
+UCX 2.1 provided several modules for data structures and algorithms.
+You may choose to use specific modules by inclueding the corresponding header
+file.
+Please note, that some modules make use of other UCX 2.1 modules.
+For instance, the [Allocator](#allocator) module is used by many other modules
+to allow flexible memory allocation.
+By default the header files are placed into an `ucx` directory within your
+systems include directory. In this case you can use a module by including it
+via `#include <ucx/MODULENAME.h>`.
+Required modules are included automatically.
+
+<div id="modules" align="center">
+    
+----------------------- ----------------------  --------------------------------  ---------------------------
+[String](#string)       [Buffer](#buffer)
+[Allocator](#allocator) [Stack](#stack)         [Memory&nbsp;Pool](#memory-pool)     
+[Array](#array)         [List](#list)           [Map](#map)                       [AVL&nbsp;Tree](#avl-tree)
+[Logging](#logging)     [Testing](#testing)     [Utilities](#utilities)           [Properties](#properties)                         
+----------------------- ----------------------  --------------------------------  ---------------------------
+
+</div>
+
+## Allocator
+
+*Header file:* [allocator.h](api-2.1/allocator_8h.html)  
+*Required modules:* None.
+
+A UCX allocator consists of a pointer to the memory area / pool and four
+function pointers to memory management functions operating on this memory
+area / pool. These functions shall behave equivalent to the standard libc
+functions `malloc`, `calloc`, `realloc` and `free`.
+
+The signature of the memory management functions is based on the signature
+of the respective libc function but each of them takes the pointer to the
+memory area / pool as first argument.
+
+As the pointer to the memory area / pool can be arbitrarily chosen, any data
+can be provided to the memory management functions. One example is the
+[UCX Memory Pool](#memory-pool).
+
+## Array
+
+*Header file:* [array.h](api-2.1/array_8h.html)  
+*Required modules:* [Allocator](#allocator)
+
+The UCX Array is an implementation of a dynamic array with automatic
+reallocation. The array structure contains a capacity, the current size,
+the size of each element, the raw pointer to the memory area and an allocator.
+Arrays are in most cases much faster than linked list.
+One can decide, whether to create a new array on the heap with `ucx_array_new()`
+or to save one indirection by initializing a `UcxArray` structure on the stack
+with `ucx_array_init()`.
+
+### Remove duplicates from an array of strings
+
+The following example shows, how a `UcxArray` can be built with
+a standard dynamic C array (pointer+length) as basis.
+
+```C
+UcxArray* create_unique(sstr_t* array, size_t arrlen) {
+    // worst case is no duplicates, hence the capacity is set to arrlen
+    UcxArray* result = ucx_array_new(arrlen, sizeof(sstr_t));
+    // only append elements, if they are not already present in the array
+    for (size_t i = 0 ; i < arrlen ; ++i) {
+        if (!ucx_array_contains(result, array+i, ucx_cmp_sstr, NULL)) {
+            ucx_array_append_from(result, array+i, 1);
+        }
+    }
+    // make the array as small as possible
+    ucx_array_shrink(result);
+    return result;
+}
+
+/* ... */
+
+sstr_t* array = /* some standard array of strings */
+size_t arrlen = /* the length of the array */
+
+UcxArray* result = create_unique(array,arrlen);
+
+/* Iterate over the array and print the elements */
+sstr_t* unique = result->data;
+for (size_t i = 0 ; i < result->size ; i++) {
+    printf("%" PRIsstr "\n", SFMT(unique[i]));
+}
+
+/* Free the array. */
+ucx_array_free(result);
+```
+### Preventing out of bounds writes
+
+The functions `ucx_array_reserve()`, `ucx_array_resize()`, `ucx_array_grow()`,
+and `ucx_array_shrink()` allow easy management of the array capacity.
+Imagine you want to add `n` elements to an array. If your `n` elements are
+already somewhere else consecutively in memory, you can use
+`ucx_array_append_from()` and benefit from the autogrow facility in this family
+of functions. Otherwise, you can ask the array to have enough capacity for
+holding additional `n` elements.
+
+```C
+size_t n = // ... elements to add
+if (ucx_array_grow(array, n)) {
+   fprintf(stderr, "Cannot add %zu elements to the array.\n", n);
+   return 1;
+}
+for (size_t i = 0 ; i < n ; i++) {
+    ((int*)array->data)[array->size++] = 80;
+}
+```
+
+## AVL Tree
+
+*Header file:* [avl.h](api-2.1/avl_8h.html)  
+*Required modules:* [Allocator](#allocator)
+
+This binary search tree implementation allows average O(1) insertion and
+removal of elements (excluding binary search time).
+All common binary tree operations are implemented. Furthermore, this module
+provides search functions via lower and upper bounds.
+
+### Filtering items with a time window
+
+Suppose you have a list of items which contain a `time_t` value and your task
+is to find all items within a time window `[t_start, t_end]`.
+With AVL Trees this is easy:
+```C
+/* ---------------------
+ * Somewhere in a header
+ */
+typedef struct {
+    time_t ts;
+    /* other important data */
+} MyObject;
+
+/* -----------
+ * Source code
+ */
+
+UcxAVLTree* tree = ucx_avl_new(ucx_cmp_longint);
+/* ... populate tree with objects, use '& MyObject.ts' as key ... */
+
+
+/* Now find every item, with 30 <= ts <= 70 */
+time_t ts_start = 30;
+time_t ts_end = 70;
+
+printf("Values in range:\n");
+for (
+        UcxAVLNode* node = ucx_avl_find_node(
+            tree, (intptr_t) &ts_start,
+            ucx_dist_longint, UCX_AVL_FIND_LOWER_BOUNDED);
+        node && (*(time_t*)node->key) <= ts_end;
+        node = ucx_avl_succ(node)
+    ) {
+    printf(" ts: %ld\n", ((MyObject*)node->value)->ts);
+}
+
+ucx_avl_free_content(tree, free);
+ucx_avl_free(tree);
+```
+
+## Buffer
+
+*Header file:* [buffer.h](api-2.1/buffer_8h.html)  
+*Required modules:* None.
+
+Instances of this buffer implementation can be used to read from or to write to
+memory like you would do with a stream. This allows the use of
+`ucx_stream_copy()` from the [Utilities](#utilities) module to copy contents
+from one buffer to another or from file or network streams to the buffer and
+vice-versa.
+
+More features for convenient use of the buffer can be enabled, like automatic
+memory management and automatic resizing of the buffer space.
+See the documentation of the macro constants in the header file for more
+information.
+
+### Add line numbers to a file
+
+When reading a file line by line, you have three options: first, you could limit
+the maximum supported line length.
+Second, you allocate a god buffer large
+enough for the most lines a text file could have.
+And third, undoubtedly the best option, you start with a small buffer, which
+adjusts on demand.
+An `UcxBuffer` can be created to do just that for you.
+Just pass the `UCX_BUFFER_AUTOEXTEND` option to the initialization function.
+Here is a full working program, which adds line numbers to a file.
+```C
+#include <stdio.h>
+#include <ucx/buffer.h>
+#include <ucx/utils.h>
+
+int main(int argc, char** argv) {
+
+    if (argc != 2) {
+        fprintf(stderr, "Usage: %s <file>\n", argv[0]);
+        return 1;
+    }
+
+    FILE* input = fopen(argv[1], "r");
+    if (!input) {
+        perror("Canno read input");
+        return 1;
+    }
+
+    const size_t chunksize = 256;
+
+    UcxBuffer* linebuf =
+        ucx_buffer_new(
+            NULL,       /* the buffer should manage the memory area for us */
+            2*chunksize,  /* initial size should be twice the chunk size */
+            UCX_BUFFER_AUTOEXTEND); /* the buffer will grow when necessary */
+
+    size_t lineno = 1;
+    do {
+        /* read line chunk */
+        size_t read = ucx_stream_ncopy(
+                input, linebuf, fread, ucx_buffer_write, chunksize);
+        if (read == 0) break;
+        
+        /* handle line endings */
+        do {
+            sstr_t bufstr = ucx_buffer_to_sstr(linebuf);
+            sstr_t nl = sstrchr(bufstr, '\n');
+            if (nl.length == 0) break;
+
+            size_t linelen = bufstr.length - nl.length;
+            sstr_t linestr = sstrsubsl(bufstr, 0, linelen);
+
+            printf("%zu: %" PRIsstr "\n", lineno++, SFMT(linestr));
+
+            /* shift the buffer to the next line */
+            ucx_buffer_shift_left(linebuf, linelen+1);
+        } while(1);
+
+    } while(1);
+
+    /* print the 'noeol' line, if any */
+    sstr_t lastline = ucx_buffer_to_sstr(linebuf);
+    if (lastline.length > 0) {
+        printf("%zu: %" PRIsstr, lineno, SFMT(lastline));
+    }
+
+    fclose(input);
+    ucx_buffer_free(linebuf);
+
+    return 0;
+}
+```
+
+## List
+
+*Header file:* [list.h](api-2.1/list_8h.html)  
+*Required modules:* [Allocator](#allocator)
+
+This module provides the data structure and several functions for a doubly
+linked list. Among the common operations like insert, remove, search and sort,
+we allow convenient iteration via a special `UCX_FOREACH` macro.
+
+### Remove duplicates from an array of strings
+
+Assume you are given an array of `sstr_t` and want to create a list of these
+strings without duplicates.
+This is a similar example to the one [above](#array), but here we are
+using a `UcxList`.
+```C
+#include <stdio.h>
+#include <ucx/list.h>
+#include <ucx/string.h>
+#include <ucx/utils.h>
+
+UcxList* remove_duplicates(sstr_t* array, size_t arrlen) {
+    UcxList* list = NULL;
+    for (size_t i = 0 ; i < arrlen ; ++i) {
+        if (ucx_list_find(list, array+i, ucx_cmp_sstr, NULL) == -1) {
+            sstr_t* s = malloc(sizeof(sstr_t));
+            *s = sstrdup(array[i]);
+            list = ucx_list_append(list, s);
+        }
+    }
+    return list;
+}
+
+/* we will need this function to clean up the list contents later */
+void free_sstr(void* ptr) {
+    sstr_t* s = ptr;
+    free(s->ptr);
+    free(s);
+}
+
+/* ... */
+
+sstr_t* array = /* some array of strings */
+size_t arrlen = /* the length of the array */
+
+UcxList* list = remove_duplicates(array,arrlen);
+
+/* Iterate over the list and print the elements */
+UCX_FOREACH(elem, list) {
+    sstr_t s = *((sstr_t*)elem->data);
+    printf("%" PRIsstr "\n", SFMT(s));
+}
+
+/* Use our free function to free the duplicated strings. */
+ucx_list_free_content(list, free_sstr);
+ucx_list_free(list);
+```
+
+## Logging
+
+*Header file:* [logging.h](api-2.1/logging_8h.html)  
+*Required modules:* [Map](#map), [String](#string)
+
+The logging module comes with some predefined log levels and allows some more
+customization. You may choose if you want to get timestamps or source file and
+line number logged automatically when outputting a message.
+The following function call initializes a debug logger with all of the above
+information:
+```C
+    log = ucx_logger_new(stdout, UCX_LOGGER_DEBUG,
+            UCX_LOGGER_LEVEL | UCX_LOGGER_TIMESTAMP | UCX_LOGGER_SOURCE);
+```
+Afterwards you can use this logger with the predefined macros
+```C
+    ucx_logger_trace(log, "Verbose output");
+    ucx_logger_debug(log, "Debug message");
+    ucx_logger_info(log, "Information");
+    ucx_logger_warn(log, "Warning");
+    ucx_logger_error(log, "Error message");
+```
+or you use
+```C
+    ucx_logger_log(log, CUSTOM_LEVEL, "Some message")
+```
+When you use your custom log level, don't forget to register it with
+```C
+    ucx_logger_register_level(log, CUSTOM_LEVEL, "CUSTOM")
+```
+where the last argument must be a string literal.
+
+## Map
+
+*Header file:* [map.h](api-2.1/map_8h.html)  
+*Required modules:* [Allocator](#allocator), [String](#string)
+
+This module provides a hash map implementation using murmur hash 2 and separate
+chaining with linked lists. Similarly to the list module, we provide a
+`UCX_MAP_FOREACH` macro to conveniently iterate through the key/value pairs.
+
+### Parsing command line options
+
+Assume you want to parse command line options and record them within a map.
+One way to do this is shown by the following code sample:
+```C
+    UcxMap* options = ucx_map_new(16);
+    const char *NOARG = "";
+    
+    char *option = NULL;
+    char optchar = 0;
+    for(int i=1;i<argc;i++) {
+        char *arg = argv[i];
+        size_t len = strlen(arg);
+        if(len > 1 && arg[0] == '-') {
+            for(int c=1;c<len;c++) {
+                if(option) {
+                    fprintf(stderr,
+                            "Missing argument for option -%c\n", optchar);
+                    return 1;
+                }
+                switch(arg[c]) {
+                    default: {
+                        fprintf(stderr, "Unknown option -%c\n\n", arg[c]);
+                        return 1;
+                    }
+                    case 'v': {
+                        ucx_map_cstr_put(options, "verbose", NOARG);
+                        break;
+                    }
+                    case 'o': {
+                        option = "output";
+                        optchar = 'o';
+                        break;
+                    }
+                }
+            }
+        } else if(option) {
+            ucx_map_cstr_put(options, option, arg);
+            option = NULL;
+        } else {
+            /* ... handle argument that is not an option ... */
+        }
+    }
+    if(option) {
+        fprintf(stderr,
+                "Missing argument for option -%c\n", optchar);
+        return 1;
+    }
+```
+With the following loop, you can access the previously recorded options:
+```C
+    UcxMapIterator iter = ucx_map_iterator(options);
+    char *arg;
+    UCX_MAP_FOREACH(optkey, arg, iter) {
+        char* opt = optkey.data;
+        if (*arg) {
+            printf("%s = %s\n", opt, arg);
+        } else {
+            printf("%s active\n", opt);
+        }
+    }
+```
+Don't forget to call `ucx_map_free()`, when you are done with the map.
+
+## Memory Pool
+
+*Header file:* [mempool.h](api-2.1/mempool_8h.html)  
+*Required modules:* [Allocator](#allocator)
+
+Here we have a concrete allocator implementation in the sense of a memory pool.
+This pool allows you to register destructor functions for the allocated memory,
+which are automatically called on the destruction of the pool.
+But you may also register *independent* destructor functions within a pool in
+case some external library allocated memory for you, which should be
+destroyed together with this pool.
+
+Many UCX modules support the use of an allocator.
+The [String Module](#string), for instance, provides the `sstrdup_a()` function,
+which uses the specified allocator to allocate the memory for the duplicated
+string.
+This way, you can use a `UcxMempool` to keep track of the memory occupied by
+duplicated strings and cleanup everything with just a single call to
+`ucx_mempool_destroy()`.
+
+### Read CSV data into a structure
+
+The following code example shows some of the basic memory pool functions and
+how they can be used with other UCX modules.
+```C
+#include <stdio.h>
+#include <ucx/mempool.h>
+#include <ucx/list.h>
+#include <ucx/string.h>
+#include <ucx/buffer.h>
+#include <ucx/utils.h>
+
+typedef struct {
+    sstr_t column_a;
+    sstr_t column_b;
+    sstr_t column_c;
+} CSVData;
+
+int main(int argc, char** argv) {
+
+    UcxMempool* pool = ucx_mempool_new(128);
+
+    FILE *f = fopen("test.csv", "r");
+    if (!f) {
+        perror("Cannot open file");
+        return 1;
+    }
+    /* close the file automatically at pool destruction*/
+    ucx_mempool_reg_destr(pool, f, (ucx_destructor) fclose);
+
+    /* create a buffer and register it at the memory pool for destruction */
+    UcxBuffer* content = ucx_buffer_new(NULL, 256, UCX_BUFFER_AUTOEXTEND);
+    ucx_mempool_reg_destr(pool, content, (ucx_destructor) ucx_buffer_free);
+
+    /* read the file and split it by lines first */
+    ucx_stream_copy(f, content, fread, ucx_buffer_write);
+    sstr_t contentstr = ucx_buffer_to_sstr(content);
+    ssize_t lc = 0;
+    sstr_t* lines = sstrsplit_a(pool->allocator, contentstr, S("\n"), &lc);
+
+    /* skip the header and parse the remaining data */
+    UcxList* datalist = NULL;
+    for (size_t i = 1 ; i < lc ; i++) {
+        if (lines[i].length == 0) continue;
+        ssize_t fc = 3;
+        sstr_t* fields = sstrsplit_a(pool->allocator, lines[i], S(";"), &fc);
+        if (fc != 3) {
+            fprintf(stderr, "Syntax error in line %zu.\n", i);
+            ucx_mempool_destroy(pool);
+            return 1;
+        }
+        CSVData* data = ucx_mempool_malloc(pool, sizeof(CSVData));
+        data->column_a = fields[0];
+        data->column_b = fields[1];
+        data->column_c = fields[2];
+        datalist = ucx_list_append_a(pool->allocator, datalist, data);
+    }
+
+    /* control output */
+    UCX_FOREACH(elem, datalist) {
+        CSVData* data = elem->data;
+        printf("Column A: %" PRIsstr " | "
+               "Column B: %" PRIsstr " | "
+               "Column C: %" PRIsstr "\n",
+               SFMT(data->column_a), SFMT(data->column_b), SFMT(data->column_c)
+        );
+    }
+
+    /* cleanup everything, no manual free() needed */
+    ucx_mempool_destroy(pool);
+
+    return 0;
+} 
+```
+
+### Overriding the default destructor
+
+Sometimes you need to allocate memory with `ucx_mempool_malloc()`, but the
+memory is not supposed to be freed with a simple call to `free()`.
+In this case, you can overwrite the default destructor as follows:
+```C
+    MyObject* obj = ucx_mempool_malloc(pool, sizeof(MyObject));
+
+    /* some special initialization with own resource management */
+    my_object_init(obj);
+
+    /* register destructor function */
+    ucx_mempool_set_destr(obj, (ucx_destructor) my_object_destroy);
+```
+Be aware, that your destructor function should not free any memory, that is
+also managed by the pool.
+Otherwise you might be risking a double-free.
+More precisely, a destructor function set with `ucx_mempool_set_destr()` MUST
+NOT call `free()` on the specified pointer whereas a desructor function
+registered with `ucx_mempool_reg_destr()` MAY (and in most cases will) call
+`free()`.
+
+## Properties
+
+*Header file:* [properties.h](api-2.1/properties_8h.html)  
+*Required modules:* [Map](#map)
+
+This module provides load and store function for `*.properties` files.
+The key/value pairs are stored within an UCX Map.
+
+### Example: Loading properties from a file
+
+```C
+/* Open the file as usual */
+FILE* file = fopen("myprops.properties", "r");
+if (!file) {
+    // error handling
+    return 1;
+}
+
+/* Load the properties from the file */
+UcxMap* myprops = ucx_map_new(16);
+if (ucx_properties_load(myprops, file)) {
+    /* ... error handling ... */
+    fclose(file);
+    ucx_map_free(myprops);
+    return 1;
+}
+
+/* Print out the key/value pairs */
+char* propval;
+UcxMapIterator propiter = ucx_map_iterator(myprops);
+UCX_MAP_FOREACH(key, propval, propiter) {
+    printf("%s = %s\n", (char*)key.data, propval);
+}
+
+/* Don't forget to free the values before freeing the map */
+ucx_map_free_content(myprops, NULL);
+ucx_map_free(myprops);
+fclose(file);
+```
+
+## Stack
+
+*Header file:* [stack.h](api-2.1/stack_8h.html)  
+*Required modules:* [Allocator](#allocator)
+
+This concrete implementation of an UCX Allocator allows you to grab some amount
+of memory which is then handled as a stack.
+Please note, that the term *stack* only refers to the behavior of this
+allocator. You may still choose to use either stack or heap memory
+for the underlying space.
+A typical use case is an algorithm where you need to allocate and free large
+amounts of memory very frequently.
+
+The following code sample shows how to initialize a stack and push and pop
+simple data.
+```C
+    const size_t len = 1024;
+    char space[len];
+    UcxStack stack;
+    ucx_stack_init(&stack, space, len);
+
+    int i = 42;
+    float f = 3.14f;
+    const char* str = "Hello!";
+    size_t strn = 7;
+
+    /* push the integer */
+    ucx_stack_push(&stack, sizeof(int), &i);
+
+    /* push the float and rember the address */
+    float* remember = ucx_stack_push(&stack, sizeof(float), &f);
+
+    /* push the string with zero terminator */
+    ucx_stack_push(&stack, strn, str);
+
+    /* if we forget, how big an element was, we can ask the stack */
+    printf("Length of string: %zu\n", ucx_stack_topsize(&stack)-1);
+
+    /* retrieve the string as sstr_t, without zero terminator! */
+    sstr_t s;
+    s.length = ucx_stack_topsize(&stack)-1;
+    s.ptr = malloc(s.length);
+    ucx_stack_popn(&stack, s.ptr, s.length);
+    printf("%" PRIsstr "\n", SFMT(s));
+
+    /* print the float directly from the stack and free it */
+    printf("Float: %f\n", *remember);
+    ucx_stack_free(&stack, remember);
+
+    /* the last element is the integer */
+    int j;
+    ucx_stack_pop(&stack, &j);
+    printf("Integer: %d\n", j);
+```
+
+
+
+## String
+
+*Header file:* [string.h](api-2.1/string_8h.html)  
+*Required modules:* [Allocator](#allocator)
+
+This module provides a safe implementation of bounded string.
+Usually C strings do not carry a length. While for zero-terminated strings you
+can easily get the length with `strlen`, this is not generally possible for
+arbitrary strings.
+The `sstr_t` type of this module always carries the string and its length to
+reduce the risk of buffer overflows dramatically.
+
+### Initialization
+
+There are several ways to create an `sstr_t`:
+
+```C
+/* (1) sstr() uses strlen() internally, hence cstr MUST be zero-terminated */
+sstr_t a = sstr(cstr);
+
+/* (2) cstr does not need to be zero-terminated, if length is specified */
+sstr_t b = sstrn(cstr, len);
+
+/* (3) S() macro creates sstr_t from a string using sizeof() and using sstrn().
+       This version is especially useful for function arguments */
+sstr_t c = S("hello");
+
+/* (4) SC() macro works like S(), but makes the string immutable using scstr_t.
+       (available since UCX 2.0) */
+scstr_t d = SC("hello");
+
+/* (5) ST() macro creates sstr_t struct literal using sizeof() */
+sstr_t e = ST("hello");
+```
+
+You should not use the `S()`, `SC()`, or `ST()` macro with string of unknown
+origin, since the `sizeof()` call might not coincide with the string length in
+those cases. If you know what you are doing, it can save you some performance,
+because you do not need the `strlen()` call.
+
+### Handling immutable strings
+
+*(Since: UCX 2.0)*
+
+For immutable strings (i.e. `const char*` strings), UCX provides the `scstr_t`
+type, which works exactly as the `sstr_t` type but with a pointer
+to `const char`. All UCX string functions come in two flavors: one that enforces
+the `scstr_t` type, and another that usually accepts both types and performs
+a conversion automatically, if necessary.
+
+There are some exceptions to this rule, as the return type may depend on the
+argument type.
+E.g. the `sstrchr()` function returns a substring starting at
+the first occurrence of the specified character.
+Since this substring points to the memory of the argument string, it does not
+accept `scstr_t` as input argument, because the return type would break the
+constness.
+
+
+### Finding the position of a substring
+
+The `sstrstr()` function gives you a new `sstr_t` object starting with the
+requested substring. Thus determining the position comes down to a simple
+subtraction.
+
+```C
+sstr_t haystack = ST("Here we go!");
+sstr_t needle = ST("we");
+sstr_t result = sstrstr(haystack, needle);
+if (result.ptr)
+    printf("Found at position %zd.\n", haystack.length-result.length);
+else
+    printf("Not found.\n");
+```
+
+### Spliting a string by a delimiter
+
+The `sstrsplit()` function (and its allocator based version `sstrsplit_a()`) is
+very powerful and might look a bit nasty at a first glance. But it is indeed
+very simple to use. It is even more convenient in combination with a memory
+pool.
+
+```C
+sstr_t test = ST("here::are::some::strings");
+sstr_t delim = ST("::");
+
+ssize_t count = 0; /* no limit */
+UcxMempool* pool = ucx_mempool_new_default();
+
+sstr_t* result = sstrsplit_a(pool->allocator, test, delim, &count);
+for (ssize_t i = 0 ; i < count ; i++) {
+    /* don't forget to specify the length via the %*s format specifier */
+    printf("%*s\n", result[i].length, result[i].ptr);
+}
+
+ucx_mempool_destroy(pool);
+```
+The output is:
+
+    here
+    are
+    some
+    strings
+
+The memory pool ensures, that all strings are freed.
+
+### Disabling convenience macros
+
+If you are experiencing any troubles with the short convenience macros `S()`,
+`SC()`, or `ST()`, you can disable them by setting the macro
+`UCX_NO_SSTR_SHORTCUTS` before including the header (or via a compiler option).
+For the formatting macros `SFMT()` and `PRIsstr` you can use the macro
+`UCX_NO_SSTR_FORMAT_MACROS` to disable them.
+
+Please keep in mind, that after disabling the macros, you cannot use them in
+your code *and* foreign code that you might have included.
+You should only disable the macros, if you are experiencing a nasty name clash
+which cannot be otherwise resolved.
+
+## Testing
+
+*Header file:* [test.h](api-2.1/test_8h.html)  
+*Required modules:* None.
+
+This module provides a testing framework which allows you to execute test cases
+within test suites.
+To avoid code duplication within tests, we also provide the possibility to
+define test subroutines.
+
+You should declare test cases and subroutines in a header file per test unit
+and implement them as you would implement normal functions.
+```C
+    /* myunit.h */
+    UCX_TEST(function_name);
+    UCX_TEST_SUBROUTINE(subroutine_name, paramlist); /* optional */
+
+
+    /* myunit.c */
+    UCX_TEST_SUBROUTINE(subroutine_name, paramlist) {
+        /* ... reusable tests with UCX_TEST_ASSERT() ... */
+    }
+
+    UCX_TEST(function_name) {
+        /* ... resource allocation and other test preparation ... */
+
+        /* mandatory marker for the start of the tests */
+        UCX_TEST_BEGIN
+
+        /*  ... verifications with UCX_TEST_ASSERT() ...
+         * (and/or calls with UCX_TEST_CALL_SUBROUTINE())
+         */
+
+        /* mandatory marker for the end of the tests */
+        UCX_TEST_END
+
+        /* ... resource cleanup ...
+         * (all code after UCX_TEST_END is always executed)
+         */
+    }
+```
+If you want to use the `UCX_TEST_ASSERT()` macro in a function, you are
+*required* to use a `UCX_TEST_SUBROUTINE`.
+Otherwise the testing framework does not know where to jump, when the assertion
+fails.
+
+After implementing the tests, you can easily build a test suite and execute it:
+```C
+    UcxTestSuite* suite = ucx_test_suite_new();
+    ucx_test_register(suite, testMyTestCase01);
+    ucx_test_register(suite, testMyTestCase02);
+    /* ... */
+    ucx_test_run(suite, stdout); /* stdout, or any other FILE stream */
+```
+
+## Utilities
+
+*Header file:* [utils.h](api-2.1/utils_8h.html)  
+*Required modules:* [Allocator](#allocator), [String](#string)
+
+In this module we provide very general utility function for copy and compare
+operations.
+We also provide several `printf` variants to conveniently print formatted data
+to streams or strings.
+
+### A simple copy program
+
+The utilities package provides several stream copy functions.
+One of them has a very simple interface and can, for instance, be used to copy
+whole files in a single call.
+This is a minimal working example:
+```C
+#include <stdio.h>
+#include <ucx/utils.h>
+
+int main(int argc, char** argv) {
+
+    if (argc != 3) {
+        fprintf(stderr, "Use %s <src> <dest>", argv[0]);
+        return 1;
+    }
+
+    FILE *srcf = fopen(argv[1], "r");   /* insert error handling on your own */
+    FILE *destf = fopen(argv[2], "w");
+    
+    size_t n =  ucx_stream_copy(srcf, destf, fread, fwrite);
+    printf("%zu bytes copied.\n", n);
+
+    fclose(srcf);
+    fclose(destf);
+
+
+    return 0;
+}
+```
+
+### Automatic allocation for formatted strings
+
+The UCX utility function `ucx_asprintf()` and it's convenient shortcut
+`ucx_sprintf` allow easy formatting of strings, without ever having to worry
+about the required space.
+```C
+sstr_t mystring = ucx_sprintf("The answer is: %d!", 42);
+```
+Still, you have to pass `mystring.ptr` to `free()` (or the free function of
+your allocator, if you use `ucx_asprintf`).
+If you don't have all the information ready to build your string, you can even
+use a [UcxBuffer](#buffer) as a target with the utility function
+`ucx_bprintf()`.
+```C
+UcxBuffer* strbuffer = ucx_buffer_new(NULL, 512, UCX_BUFFER_AUTOEXTEND);
+
+for (unsigned int i = 2 ; i < 100 ; i++) {
+        ucx_bprintf(strbuffer, "Integer %d is %s\n",
+                        i, prime(i) ? "prime" : "not prime");
+}
+
+/* print the result to stdout */
+printf("%s", (char*)strbuffer->space);
+
+ucx_buffer_free(strbuffer);
+```
--- a/docs/src/modules.md	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,873 +0,0 @@
----
-title: Modules
----
-
-UCX provides several modules for data structures and algorithms.
-You may choose to use specific modules by inclueding the corresponding header
-file.
-Please note, that some modules make use of other UCX modules.
-For instance, the [Allocator](#allocator) module is used by many other modules
-to allow flexible memory allocation.
-By default the header files are placed into an `ucx` directory within your
-systems include directory. In this case you can use a module by including it
-via `#include <ucx/MODULENAME.h>`.
-Required modules are included automatically.
-
-<div id="modules" align="center">
-    
------------------------ ----------------------  --------------------------------  ---------------------------
-[String](#string)       [Buffer](#buffer)
-[Allocator](#allocator) [Stack](#stack)         [Memory&nbsp;Pool](#memory-pool)     
-[Array](#array)         [List](#list)           [Map](#map)                       [AVL&nbsp;Tree](#avl-tree)
-[Logging](#logging)     [Testing](#testing)     [Utilities](#utilities)           [Properties](#properties)                         
------------------------ ----------------------  --------------------------------  ---------------------------
-
-</div>
-
-## Allocator
-
-*Header file:* [allocator.h](api/allocator_8h.html)  
-*Required modules:* None.
-
-A UCX allocator consists of a pointer to the memory area / pool and four
-function pointers to memory management functions operating on this memory
-area / pool. These functions shall behave equivalent to the standard libc
-functions `malloc`, `calloc`, `realloc` and `free`.
-
-The signature of the memory management functions is based on the signature
-of the respective libc function but each of them takes the pointer to the
-memory area / pool as first argument.
-
-As the pointer to the memory area / pool can be arbitrarily chosen, any data
-can be provided to the memory management functions. One example is the
-[UCX Memory Pool](#memory-pool).
-
-## Array
-
-*Header file:* [array.h](api/array_8h.html)  
-*Required modules:* [Allocator](#allocator)
-
-The UCX Array is an implementation of a dynamic array with automatic
-reallocation. The array structure contains a capacity, the current size,
-the size of each element, the raw pointer to the memory area and an allocator.
-Arrays are in most cases much faster than linked list.
-One can decide, whether to create a new array on the heap with `ucx_array_new()`
-or to save one indirection by initializing a `UcxArray` structure on the stack
-with `ucx_array_init()`.
-
-### Remove duplicates from an array of strings
-
-The following example shows, how a `UcxArray` can be built with
-a standard dynamic C array (pointer+length) as basis.
-
-```C
-UcxArray* create_unique(sstr_t* array, size_t arrlen) {
-    // worst case is no duplicates, hence the capacity is set to arrlen
-    UcxArray* result = ucx_array_new(arrlen, sizeof(sstr_t));
-    // only append elements, if they are not already present in the array
-    for (size_t i = 0 ; i < arrlen ; ++i) {
-        if (!ucx_array_contains(result, array+i, ucx_cmp_sstr, NULL)) {
-            ucx_array_append_from(result, array+i, 1);
-        }
-    }
-    // make the array as small as possible
-    ucx_array_shrink(result);
-    return result;
-}
-
-/* ... */
-
-sstr_t* array = /* some standard array of strings */
-size_t arrlen = /* the length of the array */
-
-UcxArray* result = create_unique(array,arrlen);
-
-/* Iterate over the array and print the elements */
-sstr_t* unique = result->data;
-for (size_t i = 0 ; i < result->size ; i++) {
-    printf("%" PRIsstr "\n", SFMT(unique[i]));
-}
-
-/* Free the array. */
-ucx_array_free(result);
-```
-### Preventing out of bounds writes
-
-The functions `ucx_array_reserve()`, `ucx_array_resize()`, `ucx_array_grow()`,
-and `ucx_array_shrink()` allow easy management of the array capacity.
-Imagine you want to add `n` elements to an array. If your `n` elements are
-already somewhere else consecutively in memory, you can use
-`ucx_array_append_from()` and benefit from the autogrow facility in this family
-of functions. Otherwise, you can ask the array to have enough capacity for
-holding additional `n` elements.
-
-```C
-size_t n = // ... elements to add
-if (ucx_array_grow(array, n)) {
-   fprintf(stderr, "Cannot add %zu elements to the array.\n", n);
-   return 1;
-}
-for (size_t i = 0 ; i < n ; i++) {
-    ((int*)array->data)[array->size++] = 80;
-}
-```
-
-## AVL Tree
-
-*Header file:* [avl.h](api/avl_8h.html)  
-*Required modules:* [Allocator](#allocator)
-
-This binary search tree implementation allows average O(1) insertion and
-removal of elements (excluding binary search time).
-All common binary tree operations are implemented. Furthermore, this module
-provides search functions via lower and upper bounds.
-
-### Filtering items with a time window
-
-Suppose you have a list of items which contain a `time_t` value and your task
-is to find all items within a time window `[t_start, t_end]`.
-With AVL Trees this is easy:
-```C
-/* ---------------------
- * Somewhere in a header
- */
-typedef struct {
-    time_t ts;
-    /* other important data */
-} MyObject;
-
-/* -----------
- * Source code
- */
-
-UcxAVLTree* tree = ucx_avl_new(ucx_cmp_longint);
-/* ... populate tree with objects, use '& MyObject.ts' as key ... */
-
-
-/* Now find every item, with 30 <= ts <= 70 */
-time_t ts_start = 30;
-time_t ts_end = 70;
-
-printf("Values in range:\n");
-for (
-        UcxAVLNode* node = ucx_avl_find_node(
-            tree, (intptr_t) &ts_start,
-            ucx_dist_longint, UCX_AVL_FIND_LOWER_BOUNDED);
-        node && (*(time_t*)node->key) <= ts_end;
-        node = ucx_avl_succ(node)
-    ) {
-    printf(" ts: %ld\n", ((MyObject*)node->value)->ts);
-}
-
-ucx_avl_free_content(tree, free);
-ucx_avl_free(tree);
-```
-
-## Buffer
-
-*Header file:* [buffer.h](api/buffer_8h.html)  
-*Required modules:* None.
-
-Instances of this buffer implementation can be used to read from or to write to
-memory like you would do with a stream. This allows the use of
-`ucx_stream_copy()` from the [Utilities](#utilities) module to copy contents
-from one buffer to another or from file or network streams to the buffer and
-vice-versa.
-
-More features for convenient use of the buffer can be enabled, like automatic
-memory management and automatic resizing of the buffer space.
-See the documentation of the macro constants in the header file for more
-information.
-
-### Add line numbers to a file
-
-When reading a file line by line, you have three options: first, you could limit
-the maximum supported line length.
-Second, you allocate a god buffer large
-enough for the most lines a text file could have.
-And third, undoubtedly the best option, you start with a small buffer, which
-adjusts on demand.
-An `UcxBuffer` can be created to do just that for you.
-Just pass the `UCX_BUFFER_AUTOEXTEND` option to the initialization function.
-Here is a full working program, which adds line numbers to a file.
-```C
-#include <stdio.h>
-#include <ucx/buffer.h>
-#include <ucx/utils.h>
-
-int main(int argc, char** argv) {
-
-    if (argc != 2) {
-        fprintf(stderr, "Usage: %s <file>\n", argv[0]);
-        return 1;
-    }
-
-    FILE* input = fopen(argv[1], "r");
-    if (!input) {
-        perror("Canno read input");
-        return 1;
-    }
-
-    const size_t chunksize = 256;
-
-    UcxBuffer* linebuf =
-        ucx_buffer_new(
-            NULL,       /* the buffer should manage the memory area for us */
-            2*chunksize,  /* initial size should be twice the chunk size */
-            UCX_BUFFER_AUTOEXTEND); /* the buffer will grow when necessary */
-
-    size_t lineno = 1;
-    do {
-        /* read line chunk */
-        size_t read = ucx_stream_ncopy(
-                input, linebuf, fread, ucx_buffer_write, chunksize);
-        if (read == 0) break;
-        
-        /* handle line endings */
-        do {
-            sstr_t bufstr = ucx_buffer_to_sstr(linebuf);
-            sstr_t nl = sstrchr(bufstr, '\n');
-            if (nl.length == 0) break;
-
-            size_t linelen = bufstr.length - nl.length;
-            sstr_t linestr = sstrsubsl(bufstr, 0, linelen);
-
-            printf("%zu: %" PRIsstr "\n", lineno++, SFMT(linestr));
-
-            /* shift the buffer to the next line */
-            ucx_buffer_shift_left(linebuf, linelen+1);
-        } while(1);
-
-    } while(1);
-
-    /* print the 'noeol' line, if any */
-    sstr_t lastline = ucx_buffer_to_sstr(linebuf);
-    if (lastline.length > 0) {
-        printf("%zu: %" PRIsstr, lineno, SFMT(lastline));
-    }
-
-    fclose(input);
-    ucx_buffer_free(linebuf);
-
-    return 0;
-}
-```
-
-## List
-
-*Header file:* [list.h](api/list_8h.html)  
-*Required modules:* [Allocator](#allocator)
-
-This module provides the data structure and several functions for a doubly
-linked list. Among the common operations like insert, remove, search and sort,
-we allow convenient iteration via a special `UCX_FOREACH` macro.
-
-### Remove duplicates from an array of strings
-
-Assume you are given an array of `sstr_t` and want to create a list of these
-strings without duplicates.
-This is a similar example to the one [above](#array), but here we are
-using a `UcxList`.
-```C
-#include <stdio.h>
-#include <ucx/list.h>
-#include <ucx/string.h>
-#include <ucx/utils.h>
-
-UcxList* remove_duplicates(sstr_t* array, size_t arrlen) {
-    UcxList* list = NULL;
-    for (size_t i = 0 ; i < arrlen ; ++i) {
-        if (ucx_list_find(list, array+i, ucx_cmp_sstr, NULL) == -1) {
-            sstr_t* s = malloc(sizeof(sstr_t));
-            *s = sstrdup(array[i]);
-            list = ucx_list_append(list, s);
-        }
-    }
-    return list;
-}
-
-/* we will need this function to clean up the list contents later */
-void free_sstr(void* ptr) {
-    sstr_t* s = ptr;
-    free(s->ptr);
-    free(s);
-}
-
-/* ... */
-
-sstr_t* array = /* some array of strings */
-size_t arrlen = /* the length of the array */
-
-UcxList* list = remove_duplicates(array,arrlen);
-
-/* Iterate over the list and print the elements */
-UCX_FOREACH(elem, list) {
-    sstr_t s = *((sstr_t*)elem->data);
-    printf("%" PRIsstr "\n", SFMT(s));
-}
-
-/* Use our free function to free the duplicated strings. */
-ucx_list_free_content(list, free_sstr);
-ucx_list_free(list);
-```
-
-## Logging
-
-*Header file:* [logging.h](api/logging_8h.html)  
-*Required modules:* [Map](#map), [String](#string)
-
-The logging module comes with some predefined log levels and allows some more
-customization. You may choose if you want to get timestamps or source file and
-line number logged automatically when outputting a message.
-The following function call initializes a debug logger with all of the above
-information:
-```C
-    log = ucx_logger_new(stdout, UCX_LOGGER_DEBUG,
-            UCX_LOGGER_LEVEL | UCX_LOGGER_TIMESTAMP | UCX_LOGGER_SOURCE);
-```
-Afterwards you can use this logger with the predefined macros
-```C
-    ucx_logger_trace(log, "Verbose output");
-    ucx_logger_debug(log, "Debug message");
-    ucx_logger_info(log, "Information");
-    ucx_logger_warn(log, "Warning");
-    ucx_logger_error(log, "Error message");
-```
-or you use
-```C
-    ucx_logger_log(log, CUSTOM_LEVEL, "Some message")
-```
-When you use your custom log level, don't forget to register it with
-```C
-    ucx_logger_register_level(log, CUSTOM_LEVEL, "CUSTOM")
-```
-where the last argument must be a string literal.
-
-## Map
-
-*Header file:* [map.h](api/map_8h.html)  
-*Required modules:* [Allocator](#allocator), [String](#string)
-
-This module provides a hash map implementation using murmur hash 2 and separate
-chaining with linked lists. Similarly to the list module, we provide a
-`UCX_MAP_FOREACH` macro to conveniently iterate through the key/value pairs.
-
-### Parsing command line options
-
-Assume you want to parse command line options and record them within a map.
-One way to do this is shown by the following code sample:
-```C
-    UcxMap* options = ucx_map_new(16);
-    const char *NOARG = "";
-    
-    char *option = NULL;
-    char optchar = 0;
-    for(int i=1;i<argc;i++) {
-        char *arg = argv[i];
-        size_t len = strlen(arg);
-        if(len > 1 && arg[0] == '-') {
-            for(int c=1;c<len;c++) {
-                if(option) {
-                    fprintf(stderr,
-                            "Missing argument for option -%c\n", optchar);
-                    return 1;
-                }
-                switch(arg[c]) {
-                    default: {
-                        fprintf(stderr, "Unknown option -%c\n\n", arg[c]);
-                        return 1;
-                    }
-                    case 'v': {
-                        ucx_map_cstr_put(options, "verbose", NOARG);
-                        break;
-                    }
-                    case 'o': {
-                        option = "output";
-                        optchar = 'o';
-                        break;
-                    }
-                }
-            }
-        } else if(option) {
-            ucx_map_cstr_put(options, option, arg);
-            option = NULL;
-        } else {
-            /* ... handle argument that is not an option ... */
-        }
-    }
-    if(option) {
-        fprintf(stderr,
-                "Missing argument for option -%c\n", optchar);
-        return 1;
-    }
-```
-With the following loop, you can access the previously recorded options:
-```C
-    UcxMapIterator iter = ucx_map_iterator(options);
-    char *arg;
-    UCX_MAP_FOREACH(optkey, arg, iter) {
-        char* opt = optkey.data;
-        if (*arg) {
-            printf("%s = %s\n", opt, arg);
-        } else {
-            printf("%s active\n", opt);
-        }
-    }
-```
-Don't forget to call `ucx_map_free()`, when you are done with the map.
-
-## Memory Pool
-
-*Header file:* [mempool.h](api/mempool_8h.html)  
-*Required modules:* [Allocator](#allocator)
-
-Here we have a concrete allocator implementation in the sense of a memory pool.
-This pool allows you to register destructor functions for the allocated memory,
-which are automatically called on the destruction of the pool.
-But you may also register *independent* destructor functions within a pool in
-case some external library allocated memory for you, which should be
-destroyed together with this pool.
-
-Many UCX modules support the use of an allocator.
-The [String Module](#string), for instance, provides the `sstrdup_a()` function,
-which uses the specified allocator to allocate the memory for the duplicated
-string.
-This way, you can use a `UcxMempool` to keep track of the memory occupied by
-duplicated strings and cleanup everything with just a single call to
-`ucx_mempool_destroy()`.
-
-### Read CSV data into a structure
-
-The following code example shows some of the basic memory pool functions and
-how they can be used with other UCX modules.
-```C
-#include <stdio.h>
-#include <ucx/mempool.h>
-#include <ucx/list.h>
-#include <ucx/string.h>
-#include <ucx/buffer.h>
-#include <ucx/utils.h>
-
-typedef struct {
-    sstr_t column_a;
-    sstr_t column_b;
-    sstr_t column_c;
-} CSVData;
-
-int main(int argc, char** argv) {
-
-    UcxMempool* pool = ucx_mempool_new(128);
-
-    FILE *f = fopen("test.csv", "r");
-    if (!f) {
-        perror("Cannot open file");
-        return 1;
-    }
-    /* close the file automatically at pool destruction*/
-    ucx_mempool_reg_destr(pool, f, (ucx_destructor) fclose);
-
-    /* create a buffer and register it at the memory pool for destruction */
-    UcxBuffer* content = ucx_buffer_new(NULL, 256, UCX_BUFFER_AUTOEXTEND);
-    ucx_mempool_reg_destr(pool, content, (ucx_destructor) ucx_buffer_free);
-
-    /* read the file and split it by lines first */
-    ucx_stream_copy(f, content, fread, ucx_buffer_write);
-    sstr_t contentstr = ucx_buffer_to_sstr(content);
-    ssize_t lc = 0;
-    sstr_t* lines = sstrsplit_a(pool->allocator, contentstr, S("\n"), &lc);
-
-    /* skip the header and parse the remaining data */
-    UcxList* datalist = NULL;
-    for (size_t i = 1 ; i < lc ; i++) {
-        if (lines[i].length == 0) continue;
-        ssize_t fc = 3;
-        sstr_t* fields = sstrsplit_a(pool->allocator, lines[i], S(";"), &fc);
-        if (fc != 3) {
-            fprintf(stderr, "Syntax error in line %zu.\n", i);
-            ucx_mempool_destroy(pool);
-            return 1;
-        }
-        CSVData* data = ucx_mempool_malloc(pool, sizeof(CSVData));
-        data->column_a = fields[0];
-        data->column_b = fields[1];
-        data->column_c = fields[2];
-        datalist = ucx_list_append_a(pool->allocator, datalist, data);
-    }
-
-    /* control output */
-    UCX_FOREACH(elem, datalist) {
-        CSVData* data = elem->data;
-        printf("Column A: %" PRIsstr " | "
-               "Column B: %" PRIsstr " | "
-               "Column C: %" PRIsstr "\n",
-               SFMT(data->column_a), SFMT(data->column_b), SFMT(data->column_c)
-        );
-    }
-
-    /* cleanup everything, no manual free() needed */
-    ucx_mempool_destroy(pool);
-
-    return 0;
-} 
-```
-
-### Overriding the default destructor
-
-Sometimes you need to allocate memory with `ucx_mempool_malloc()`, but the
-memory is not supposed to be freed with a simple call to `free()`.
-In this case, you can overwrite the default destructor as follows:
-```C
-    MyObject* obj = ucx_mempool_malloc(pool, sizeof(MyObject));
-
-    /* some special initialization with own resource management */
-    my_object_init(obj);
-
-    /* register destructor function */
-    ucx_mempool_set_destr(obj, (ucx_destructor) my_object_destroy);
-```
-Be aware, that your destructor function should not free any memory, that is
-also managed by the pool.
-Otherwise you might be risking a double-free.
-More precisely, a destructor function set with `ucx_mempool_set_destr()` MUST
-NOT call `free()` on the specified pointer whereas a desructor function
-registered with `ucx_mempool_reg_destr()` MAY (and in most cases will) call
-`free()`.
-
-## Properties
-
-*Header file:* [properties.h](api/properties_8h.html)  
-*Required modules:* [Map](#map)
-
-This module provides load and store function for `*.properties` files.
-The key/value pairs are stored within an UCX Map.
-
-### Example: Loading properties from a file
-
-```C
-/* Open the file as usual */
-FILE* file = fopen("myprops.properties", "r");
-if (!file) {
-    // error handling
-    return 1;
-}
-
-/* Load the properties from the file */
-UcxMap* myprops = ucx_map_new(16);
-if (ucx_properties_load(myprops, file)) {
-    /* ... error handling ... */
-    fclose(file);
-    ucx_map_free(myprops);
-    return 1;
-}
-
-/* Print out the key/value pairs */
-char* propval;
-UcxMapIterator propiter = ucx_map_iterator(myprops);
-UCX_MAP_FOREACH(key, propval, propiter) {
-    printf("%s = %s\n", (char*)key.data, propval);
-}
-
-/* Don't forget to free the values before freeing the map */
-ucx_map_free_content(myprops, NULL);
-ucx_map_free(myprops);
-fclose(file);
-```
-
-## Stack
-
-*Header file:* [stack.h](api/stack_8h.html)  
-*Required modules:* [Allocator](#allocator)
-
-This concrete implementation of an UCX Allocator allows you to grab some amount
-of memory which is then handled as a stack.
-Please note, that the term *stack* only refers to the behavior of this
-allocator. You may still choose to use either stack or heap memory
-for the underlying space.
-A typical use case is an algorithm where you need to allocate and free large
-amounts of memory very frequently.
-
-The following code sample shows how to initialize a stack and push and pop
-simple data.
-```C
-    const size_t len = 1024;
-    char space[len];
-    UcxStack stack;
-    ucx_stack_init(&stack, space, len);
-
-    int i = 42;
-    float f = 3.14f;
-    const char* str = "Hello!";
-    size_t strn = 7;
-
-    /* push the integer */
-    ucx_stack_push(&stack, sizeof(int), &i);
-
-    /* push the float and rember the address */
-    float* remember = ucx_stack_push(&stack, sizeof(float), &f);
-
-    /* push the string with zero terminator */
-    ucx_stack_push(&stack, strn, str);
-
-    /* if we forget, how big an element was, we can ask the stack */
-    printf("Length of string: %zu\n", ucx_stack_topsize(&stack)-1);
-
-    /* retrieve the string as sstr_t, without zero terminator! */
-    sstr_t s;
-    s.length = ucx_stack_topsize(&stack)-1;
-    s.ptr = malloc(s.length);
-    ucx_stack_popn(&stack, s.ptr, s.length);
-    printf("%" PRIsstr "\n", SFMT(s));
-
-    /* print the float directly from the stack and free it */
-    printf("Float: %f\n", *remember);
-    ucx_stack_free(&stack, remember);
-
-    /* the last element is the integer */
-    int j;
-    ucx_stack_pop(&stack, &j);
-    printf("Integer: %d\n", j);
-```
-
-
-
-## String
-
-*Header file:* [string.h](api/string_8h.html)  
-*Required modules:* [Allocator](#allocator)
-
-This module provides a safe implementation of bounded string.
-Usually C strings do not carry a length. While for zero-terminated strings you
-can easily get the length with `strlen`, this is not generally possible for
-arbitrary strings.
-The `sstr_t` type of this module always carries the string and its length to
-reduce the risk of buffer overflows dramatically.
-
-### Initialization
-
-There are several ways to create an `sstr_t`:
-
-```C
-/* (1) sstr() uses strlen() internally, hence cstr MUST be zero-terminated */
-sstr_t a = sstr(cstr);
-
-/* (2) cstr does not need to be zero-terminated, if length is specified */
-sstr_t b = sstrn(cstr, len);
-
-/* (3) S() macro creates sstr_t from a string using sizeof() and using sstrn().
-       This version is especially useful for function arguments */
-sstr_t c = S("hello");
-
-/* (4) SC() macro works like S(), but makes the string immutable using scstr_t.
-       (available since UCX 2.0) */
-scstr_t d = SC("hello");
-
-/* (5) ST() macro creates sstr_t struct literal using sizeof() */
-sstr_t e = ST("hello");
-```
-
-You should not use the `S()`, `SC()`, or `ST()` macro with string of unknown
-origin, since the `sizeof()` call might not coincide with the string length in
-those cases. If you know what you are doing, it can save you some performance,
-because you do not need the `strlen()` call.
-
-### Handling immutable strings
-
-*(Since: UCX 2.0)*
-
-For immutable strings (i.e. `const char*` strings), UCX provides the `scstr_t`
-type, which works exactly as the `sstr_t` type but with a pointer
-to `const char`. All UCX string functions come in two flavors: one that enforces
-the `scstr_t` type, and another that usually accepts both types and performs
-a conversion automatically, if necessary.
-
-There are some exceptions to this rule, as the return type may depend on the
-argument type.
-E.g. the `sstrchr()` function returns a substring starting at
-the first occurrence of the specified character.
-Since this substring points to the memory of the argument string, it does not
-accept `scstr_t` as input argument, because the return type would break the
-constness.
-
-
-### Finding the position of a substring
-
-The `sstrstr()` function gives you a new `sstr_t` object starting with the
-requested substring. Thus determining the position comes down to a simple
-subtraction.
-
-```C
-sstr_t haystack = ST("Here we go!");
-sstr_t needle = ST("we");
-sstr_t result = sstrstr(haystack, needle);
-if (result.ptr)
-    printf("Found at position %zd.\n", haystack.length-result.length);
-else
-    printf("Not found.\n");
-```
-
-### Spliting a string by a delimiter
-
-The `sstrsplit()` function (and its allocator based version `sstrsplit_a()`) is
-very powerful and might look a bit nasty at a first glance. But it is indeed
-very simple to use. It is even more convenient in combination with a memory
-pool.
-
-```C
-sstr_t test = ST("here::are::some::strings");
-sstr_t delim = ST("::");
-
-ssize_t count = 0; /* no limit */
-UcxMempool* pool = ucx_mempool_new_default();
-
-sstr_t* result = sstrsplit_a(pool->allocator, test, delim, &count);
-for (ssize_t i = 0 ; i < count ; i++) {
-    /* don't forget to specify the length via the %*s format specifier */
-    printf("%*s\n", result[i].length, result[i].ptr);
-}
-
-ucx_mempool_destroy(pool);
-```
-The output is:
-
-    here
-    are
-    some
-    strings
-
-The memory pool ensures, that all strings are freed.
-
-### Disabling convenience macros
-
-If you are experiencing any troubles with the short convenience macros `S()`,
-`SC()`, or `ST()`, you can disable them by setting the macro
-`UCX_NO_SSTR_SHORTCUTS` before including the header (or via a compiler option).
-For the formatting macros `SFMT()` and `PRIsstr` you can use the macro
-`UCX_NO_SSTR_FORMAT_MACROS` to disable them.
-
-Please keep in mind, that after disabling the macros, you cannot use them in
-your code *and* foreign code that you might have included.
-You should only disable the macros, if you are experiencing a nasty name clash
-which cannot be otherwise resolved.
-
-## Testing
-
-*Header file:* [test.h](api/test_8h.html)  
-*Required modules:* None.
-
-This module provides a testing framework which allows you to execute test cases
-within test suites.
-To avoid code duplication within tests, we also provide the possibility to
-define test subroutines.
-
-You should declare test cases and subroutines in a header file per test unit
-and implement them as you would implement normal functions.
-```C
-    /* myunit.h */
-    UCX_TEST(function_name);
-    UCX_TEST_SUBROUTINE(subroutine_name, paramlist); /* optional */
-
-
-    /* myunit.c */
-    UCX_TEST_SUBROUTINE(subroutine_name, paramlist) {
-        /* ... reusable tests with UCX_TEST_ASSERT() ... */
-    }
-
-    UCX_TEST(function_name) {
-        /* ... resource allocation and other test preparation ... */
-
-        /* mandatory marker for the start of the tests */
-        UCX_TEST_BEGIN
-
-        /*  ... verifications with UCX_TEST_ASSERT() ...
-         * (and/or calls with UCX_TEST_CALL_SUBROUTINE())
-         */
-
-        /* mandatory marker for the end of the tests */
-        UCX_TEST_END
-
-        /* ... resource cleanup ...
-         * (all code after UCX_TEST_END is always executed)
-         */
-    }
-```
-If you want to use the `UCX_TEST_ASSERT()` macro in a function, you are
-*required* to use a `UCX_TEST_SUBROUTINE`.
-Otherwise the testing framework does not know where to jump, when the assertion
-fails.
-
-After implementing the tests, you can easily build a test suite and execute it:
-```C
-    UcxTestSuite* suite = ucx_test_suite_new();
-    ucx_test_register(suite, testMyTestCase01);
-    ucx_test_register(suite, testMyTestCase02);
-    /* ... */
-    ucx_test_run(suite, stdout); /* stdout, or any other FILE stream */
-```
-
-## Utilities
-
-*Header file:* [utils.h](api/utils_8h.html)  
-*Required modules:* [Allocator](#allocator), [String](#string)
-
-In this module we provide very general utility function for copy and compare
-operations.
-We also provide several `printf` variants to conveniently print formatted data
-to streams or strings.
-
-### A simple copy program
-
-The utilities package provides several stream copy functions.
-One of them has a very simple interface and can, for instance, be used to copy
-whole files in a single call.
-This is a minimal working example:
-```C
-#include <stdio.h>
-#include <ucx/utils.h>
-
-int main(int argc, char** argv) {
-
-    if (argc != 3) {
-        fprintf(stderr, "Use %s <src> <dest>", argv[0]);
-        return 1;
-    }
-
-    FILE *srcf = fopen(argv[1], "r");   /* insert error handling on your own */
-    FILE *destf = fopen(argv[2], "w");
-    
-    size_t n =  ucx_stream_copy(srcf, destf, fread, fwrite);
-    printf("%zu bytes copied.\n", n);
-
-    fclose(srcf);
-    fclose(destf);
-
-
-    return 0;
-}
-```
-
-### Automatic allocation for formatted strings
-
-The UCX utility function `ucx_asprintf()` and it's convenient shortcut
-`ucx_sprintf` allow easy formatting of strings, without ever having to worry
-about the required space.
-```C
-sstr_t mystring = ucx_sprintf("The answer is: %d!", 42);
-```
-Still, you have to pass `mystring.ptr` to `free()` (or the free function of
-your allocator, if you use `ucx_asprintf`).
-If you don't have all the information ready to build your string, you can even
-use a [UcxBuffer](#buffer) as a target with the utility function
-`ucx_bprintf()`.
-```C
-UcxBuffer* strbuffer = ucx_buffer_new(NULL, 512, UCX_BUFFER_AUTOEXTEND);
-
-for (unsigned int i = 2 ; i < 100 ; i++) {
-        ucx_bprintf(strbuffer, "Integer %d is %s\n",
-                        i, prime(i) ? "prime" : "not prime");
-}
-
-/* print the result to stdout */
-printf("%s", (char*)strbuffer->space);
-
-ucx_buffer_free(strbuffer);
-```
--- a/src/CMakeLists.txt	Mon Dec 30 09:54:10 2019 +0100
+++ b/src/CMakeLists.txt	Sat Feb 06 19:11:44 2021 +0100
@@ -1,34 +1,8 @@
 set(sources
-        allocator.c
-        array.c
-        avl.c
-        buffer.c
         list.c
-        logging.c
-        map.c
-        mempool.c
-        properties.c
-        stack.c
-        string.c
-        test.c
-        ucx.c
-        utils.c
 )
 set(headers
-        ucx/allocator.h
-        ucx/array.h
-        ucx/avl.h
-        ucx/buffer.h
-        ucx/list.h
-        ucx/logging.h
-        ucx/map.h
-        ucx/mempool.h
-        ucx/properties.h
-        ucx/stack.h
-        ucx/string.h
-        ucx/test.h
-        ucx/ucx.h
-        ucx/utils.h
+        cx/list.h
 )
 
 add_library(ucx SHARED ${sources})
@@ -37,7 +11,7 @@
 target_include_directories(ucx PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
 target_include_directories(ucx_static PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
 
-set_target_properties(ucx PROPERTIES SOVERSION 3 VERSION 3.1.0)
+set_target_properties(ucx PROPERTIES SOVERSION 4 VERSION 4.0.0)
 set_target_properties(ucx_static PROPERTIES VERSION ${CMAKE_PROJECT_VERSION})
 
 # it is sufficient to specify the headers for one of the targets
--- a/src/Makefile.am	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-#
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-#
-# Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-#   1. Redistributions of source code must retain the above copyright
-#      notice, this list of conditions and the following disclaimer.
-#
-#   2. Redistributions in binary form must reproduce the above copyright
-#      notice, this list of conditions and the following disclaimer in the
-#      documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
-# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-
-lib_LTLIBRARIES = libucx.la
-libucx_la_LDFLAGS = -version-info $(UCX_LIB_VERSION)
-libucx_la_SOURCES = utils.c
-libucx_la_SOURCES += array.c
-libucx_la_SOURCES += list.c
-libucx_la_SOURCES += map.c
-libucx_la_SOURCES += avl.c
-libucx_la_SOURCES += properties.c
-libucx_la_SOURCES += mempool.c
-libucx_la_SOURCES += string.c
-libucx_la_SOURCES += test.c
-libucx_la_SOURCES += allocator.c
-libucx_la_SOURCES += logging.c
-libucx_la_SOURCES += buffer.c
-libucx_la_SOURCES += stack.c
-libucx_la_SOURCES += ucx.c
-
-ucxdir = $(includedir)/ucx
-ucx_HEADERS = ucx/allocator.h
-ucx_HEADERS += ucx/array.h
-ucx_HEADERS += ucx/avl.h
-ucx_HEADERS += ucx/buffer.h
-ucx_HEADERS += ucx/list.h
-ucx_HEADERS += ucx/logging.h
-ucx_HEADERS += ucx/map.h
-ucx_HEADERS += ucx/mempool.h
-ucx_HEADERS += ucx/properties.h
-ucx_HEADERS += ucx/stack.h
-ucx_HEADERS += ucx/string.h
-ucx_HEADERS += ucx/test.h
-ucx_HEADERS += ucx/ucx.h
-ucx_HEADERS += ucx/utils.h
-
-
--- a/src/allocator.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "ucx/allocator.h"
-
-#include <stdlib.h>
-
-static UcxAllocator default_allocator = {
-    NULL,
-    ucx_default_malloc,
-    ucx_default_calloc,
-    ucx_default_realloc,
-    ucx_default_free
-};
-
-UcxAllocator *ucx_default_allocator() {
-    UcxAllocator *allocator = &default_allocator;
-    return allocator;
-}
-
-void *ucx_default_malloc(void *ignore, size_t n) {
-    return malloc(n);
-}
-
-void *ucx_default_calloc(void *ignore, size_t n, size_t size) {
-    return calloc(n, size);
-}
-
-void *ucx_default_realloc(void *ignore, void *data, size_t n) {
-    return realloc(data, n);
-}
-
-void ucx_default_free(void *ignore, void *data) {
-    free(data);
-}
--- a/src/array.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,467 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2019 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#define _GNU_SOURCE /* we want to use qsort_r(), if available */
-#define __STDC_WANT_LIB_EXT1__ 1 /* use qsort_s, if available */
-
-
-#include "ucx/array.h"
-#include "ucx/utils.h"
-
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-
-#ifndef UCX_ARRAY_DISABLE_QSORT
-#ifdef __GLIBC__
-#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 8)
-#define ucx_array_sort_impl qsort_r
-#endif /* glibc version >= 2.8 */
-#elif /* not  __GLIBC__ */ defined(__APPLE__) || defined(__FreeBSD__)
-#define ucx_array_sort_impl ucx_qsort_r
-#define USE_UCX_QSORT_R
-#elif /* not (__APPLE || __FreeBSD__) */ defined(__sun)
-#if __STDC_VERSION__ >= 201112L
-#define ucx_array_sort_impl qsort_s
-#endif
-#endif /* __GLIBC__, __APLE__, __FreeBSD__, __sun */
-#endif /* UCX_ARRAY_DISABLE_QSORT */
-
-#ifndef ucx_array_sort_impl
-#define ucx_array_sort_impl ucx_mergesort
-#endif
-
-static int ucx_array_ensurecap(UcxArray *array, size_t reqcap) {
-    size_t required_capacity = array->capacity;
-    while (reqcap > required_capacity) {
-        if (required_capacity * 2 < required_capacity)
-            return 1;
-        required_capacity <<= 1;
-    }
-    if (ucx_array_reserve(array, required_capacity)) {
-        return 1;
-    }
-    return 0;
-}
-
-int ucx_array_util_set_a(UcxAllocator* alloc, void** array, size_t* capacity,
-    size_t elmsize, size_t index, void* data) {
-    
-    if(!alloc || !capacity || !array) {
-        errno = EINVAL;
-        return 1;
-    }
-    
-    size_t newcapacity = *capacity;
-    while(index >= newcapacity) {
-        if(ucx_szmul(newcapacity, 2, &newcapacity)) {
-            errno = EOVERFLOW;
-            return 1;
-        }        
-    }
-
-    size_t memlen, offset;
-    if(ucx_szmul(newcapacity, elmsize, &memlen)) {
-        errno = EOVERFLOW;
-        return 1;
-    }
-    /* we don't need to check index*elmsize - it is smaller than memlen */
-    
-    
-    void* newptr = alrealloc(alloc, *array, memlen);
-    if(newptr == NULL) {
-        errno = ENOMEM; /* we cannot assume that every allocator sets this */
-        return 1;
-    }
-    *array = newptr;
-    *capacity = newcapacity;
-    
-    
-    char* dest = *array;
-    dest += elmsize*index;
-    memcpy(dest, data, elmsize);
-    
-    return 0;
-}
-
-int ucx_array_util_setptr_a(UcxAllocator* alloc, void** array, size_t* capacity,
-    size_t index, void* data) {
-    
-    return ucx_array_util_set_a(alloc, array, capacity, sizeof(void*),
-            index, &data);
-}
-
-UcxArray* ucx_array_new(size_t capacity, size_t elemsize) {
-    return ucx_array_new_a(capacity, elemsize, ucx_default_allocator());
-}
-
-UcxArray* ucx_array_new_a(size_t capacity, size_t elemsize,
-        UcxAllocator* allocator) {
-    UcxArray* array = almalloc(allocator, sizeof(UcxArray));
-    if(array) {
-        ucx_array_init_a(array, capacity, elemsize, allocator);
-    }
-    return array;
-}
-
-void ucx_array_init(UcxArray* array, size_t capacity, size_t elemsize) {
-    ucx_array_init_a(array, capacity, elemsize, ucx_default_allocator());
-}
-
-void ucx_array_init_a(UcxArray* array, size_t capacity, size_t elemsize,
-        UcxAllocator* allocator) {
-    
-    array->allocator = allocator;
-    array->elemsize = elemsize;
-    array->size = 0;
-    array->data = alcalloc(allocator, capacity, elemsize);
-    
-    if (array->data) {
-        array->capacity = capacity;
-    } else {
-        array->capacity = 0;
-    }
-}
-
-int ucx_array_clone(UcxArray* dest, UcxArray const* src) {
-    if (ucx_array_ensurecap(dest, src->capacity)) {
-        return 1;
-    }
-    
-    dest->elemsize = src->elemsize;
-    dest->size = src->size;
-    
-    if (dest->data) {
-        memcpy(dest->data, src->data, src->size*src->elemsize);
-    }
-    
-    return 0;
-}
-
-int ucx_array_equals(UcxArray const *array1, UcxArray const *array2,
-        cmp_func cmpfnc, void* data) {
-    
-    if (array1->size != array2->size || array1->elemsize != array2->elemsize) {
-        return 0;
-    } else {
-        if (array1->size == 0)
-            return 1;
-        
-        size_t elemsize;
-        if (cmpfnc == NULL) {
-            cmpfnc = ucx_cmp_mem;
-            elemsize = array1->elemsize;
-            data = &elemsize;
-        }
-        
-        for (size_t i = 0 ; i < array1->size ; i++) {
-            int r = cmpfnc(
-                    ucx_array_at(array1, i),
-                    ucx_array_at(array2, i),
-                    data);
-            if (r != 0)
-                return 0;
-        }
-        return 1;
-    }
-}
-
-void ucx_array_destroy(UcxArray *array) {
-    if(array->data)
-        alfree(array->allocator, array->data);
-    array->data = NULL;
-    array->capacity = array->size = 0;
-}
-
-void ucx_array_free(UcxArray *array) {
-    ucx_array_destroy(array);
-    alfree(array->allocator, array);
-}
-
-int ucx_array_append_from(UcxArray *array, void *data, size_t count) {
-    if (ucx_array_ensurecap(array, array->size + count))
-        return 1;
-    
-    void* dest = ucx_array_at(array, array->size);
-    if (data) {
-        memcpy(dest, data, array->elemsize*count);
-    } else {
-        memset(dest, 0, array->elemsize*count);
-    }
-    array->size += count;
-    
-    return 0;
-}
-
-int ucx_array_prepend_from(UcxArray *array, void *data, size_t count) {
-    if (ucx_array_ensurecap(array, array->size + count))
-        return 1;
-    
-    if (array->size > 0) {
-        void *dest = ucx_array_at(array, count);
-        memmove(dest, array->data, array->elemsize*array->size);
-    }
-    
-    if (data) {
-        memcpy(array->data, data, array->elemsize*count);
-    } else {
-        memset(array->data, 0, array->elemsize*count);
-    }
-    array->size += count;
-        
-    return 0;
-}
-
-int ucx_array_set_from(UcxArray *array, size_t index,
-        void *data, size_t count) {
-    if (ucx_array_ensurecap(array, index + count))
-        return 1;
-    
-    if (index+count > array->size) {
-        array->size = index+count;
-    }
-    
-    void *dest = ucx_array_at(array, index);
-    if (data) {
-        memcpy(dest, data, array->elemsize*count);
-    } else {
-        memset(dest, 0, array->elemsize*count);
-    }
-    
-    return 0;
-}
-
-int ucx_array_concat(UcxArray *array1, const UcxArray *array2) {
-    
-    if (array1->elemsize != array2->elemsize)
-        return 1;
-    
-    size_t capacity = array1->capacity+array2->capacity;
-        
-    if (array1->capacity < capacity) {
-        if (ucx_array_reserve(array1, capacity)) {
-            return 1;
-        }
-    }
-    
-    void* dest = ucx_array_at(array1, array1->size);
-    memcpy(dest, array2->data, array2->size*array2->elemsize);
-    
-    array1->size += array2->size;
-    
-    return 0;
-}
-
-void *ucx_array_at(UcxArray const *array, size_t index) {
-    char* memory = array->data;
-    char* loc = memory + index*array->elemsize;
-    return loc;
-}
-
-size_t ucx_array_find(UcxArray const *array, void *elem,
-        cmp_func cmpfnc, void *data) {
-    
-    size_t elemsize;
-    if (cmpfnc == NULL) {
-        cmpfnc = ucx_cmp_mem;
-        elemsize = array->elemsize;
-        data = &elemsize;
-    }
-
-    if (array->size > 0) {
-        for (size_t i = 0 ; i < array->size ; i++) {
-            void* ptr = ucx_array_at(array, i);
-            if (cmpfnc(ptr, elem, data) == 0) {
-                return i;
-            }
-        }
-        return array->size;
-    } else {
-        return 0;
-    }
-}
-
-int ucx_array_contains(UcxArray const *array, void *elem,
-        cmp_func cmpfnc, void *data) {
-    return ucx_array_find(array, elem, cmpfnc, data) != array->size;
-}
-
-static void ucx_mergesort_merge(void *arrdata,size_t elemsize,
-        cmp_func cmpfnc, void *data,
-        size_t start, size_t mid, size_t end) { 
-    
-    char* array = arrdata;
-    
-    size_t rightstart = mid + 1; 
-  
-    if (cmpfnc(array + mid*elemsize,
-            array + rightstart*elemsize, data) <= 0) {
-        /* already sorted */
-        return;
-    }
-  
-    /* we need memory for one element */
-    void *value = malloc(elemsize);
-    
-    while (start <= mid && rightstart <= end) { 
-        if (cmpfnc(array + start*elemsize,
-                array + rightstart*elemsize, data) <= 0) { 
-            start++; 
-        } else {
-            /* save the value from the right */
-            memcpy(value, array + rightstart*elemsize, elemsize);
-                        
-            /* shift all left elements one element to the right */
-            size_t shiftcount = rightstart-start;
-            void *startptr = array + start*elemsize;
-            void *dest = array + (start+1)*elemsize;
-            memmove(dest, startptr, shiftcount*elemsize);
-            
-            /* bring the first value from the right to the left */
-            memcpy(startptr, value, elemsize);
-  
-            start++; 
-            mid++; 
-            rightstart++; 
-        }
-    }
-    
-    /* free the temporary memory */
-    free(value);
-} 
-  
-static void ucx_mergesort_impl(void *arrdata, size_t elemsize,
-        cmp_func cmpfnc, void *data, size_t l, size_t r) { 
-    if (l < r) {
-        size_t m = l + (r - l) / 2; 
-  
-        ucx_mergesort_impl(arrdata, elemsize, cmpfnc, data, l, m); 
-        ucx_mergesort_impl(arrdata, elemsize, cmpfnc, data, m + 1, r); 
-        ucx_mergesort_merge(arrdata, elemsize, cmpfnc, data, l, m, r);
-    } 
-}
-
-static void ucx_mergesort(void *arrdata, size_t count, size_t elemsize,
-        cmp_func cmpfnc, void *data) {
-    
-    ucx_mergesort_impl(arrdata, elemsize, cmpfnc, data, 0, count-1);
-}
-
-#ifdef USE_UCX_QSORT_R
-struct cmpfnc_swapargs_info {
-    cmp_func func;
-    void *data;
-};
-
-static int cmp_func_swap_args(void *data, const void *x, const void *y) {
-    struct cmpfnc_swapargs_info* info = data;
-    return info->func(x, y, info->data);
-}
-
-static void ucx_qsort_r(void *array, size_t count, size_t elemsize,
-		     cmp_func cmpfnc, void *data) {
-    struct cmpfnc_swapargs_info info;
-    info.func = cmpfnc;
-    info.data = data;
-    qsort_r(array, count, elemsize, &info, cmp_func_swap_args);
-}
-#endif /* USE_UCX_QSORT_R */
-
-void ucx_array_sort(UcxArray* array, cmp_func cmpfnc, void *data) {
-    ucx_array_sort_impl(array->data, array->size, array->elemsize,
-            cmpfnc, data);
-}
-
-void ucx_array_remove(UcxArray *array, size_t index) {
-    array->size--;
-    if (index < array->size) {
-        void* dest = ucx_array_at(array, index);
-        void* src = ucx_array_at(array, index+1);
-        memmove(dest, src, (array->size - index)*array->elemsize);
-    }
-}
-
-void ucx_array_remove_fast(UcxArray *array, size_t index) {
-    array->size--;
-    if (index < array->size) {       
-        void* dest = ucx_array_at(array, index);
-        void* src = ucx_array_at(array, array->size);
-        memcpy(dest, src, array->elemsize);
-    }
-}
-
-int ucx_array_shrink(UcxArray* array) {
-    void* newptr = alrealloc(array->allocator, array->data,
-                array->size*array->elemsize);
-    if (newptr) {
-        array->data = newptr;
-        array->capacity = array->size;
-        return 0;
-    } else {
-        return 1;
-    }
-}
-
-int ucx_array_resize(UcxArray* array, size_t capacity) {
-    if (array->capacity >= capacity) {
-        void* newptr = alrealloc(array->allocator, array->data,
-                capacity*array->elemsize);
-        if (newptr) {
-            array->data = newptr;
-            array->capacity = capacity;
-            if (array->size > array->capacity) {
-                array->size = array->capacity;
-            }
-            return 0;
-        } else {
-            return 1;
-        }
-    } else {
-        return ucx_array_reserve(array, capacity);
-    }
-}
-
-int ucx_array_reserve(UcxArray* array, size_t capacity) {
-    if (array->capacity > capacity) {
-        return 0;
-    } else {
-        void* newptr = alrealloc(array->allocator, array->data,
-                capacity*array->elemsize);
-        if (newptr) {
-            array->data = newptr;
-            array->capacity = capacity;
-            return 0;
-        } else {
-            return 1;
-        }
-    }
-}
-
-int ucx_array_grow(UcxArray* array, size_t count) {
-    return ucx_array_reserve(array, array->size+count);
-}
--- a/src/avl.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,373 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "ucx/avl.h"
-
-#include <limits.h>
-
-#define ptrcast(ptr) ((void*)(ptr))
-#define alloc_tree(al) (UcxAVLTree*) almalloc((al), sizeof(UcxAVLTree))
-#define alloc_node(al) (UcxAVLNode*) almalloc((al), sizeof(UcxAVLNode))
-
-static void ucx_avl_connect(UcxAVLTree *tree,
-        UcxAVLNode *node, UcxAVLNode *child, intptr_t nullkey) {
-    if (child) {
-        child->parent = node;
-    }
-    // if child is NULL, nullkey decides if left or right pointer is cleared
-    if (tree->cmpfunc(
-        ptrcast(child ? child->key : nullkey),
-        ptrcast(node->key), tree->userdata) > 0) {
-      node->right = child;
-    } else {
-      node->left = child;
-    }
-    size_t lh = node->left ? node->left->height : 0;
-    size_t rh = node->right ? node->right->height : 0;
-    node->height = 1 + (lh > rh ? lh : rh);
-}
-
-#define avlheight(node) ((node) ? (node)->height : 0)
-
-static UcxAVLNode* avl_rotright(UcxAVLTree *tree, UcxAVLNode *l0) {
-    UcxAVLNode *p = l0->parent;
-    UcxAVLNode *l1 = l0->left;
-    if (p) {
-        ucx_avl_connect(tree, p, l1, 0);
-    } else {
-        l1->parent = NULL;
-    }
-    ucx_avl_connect(tree, l0, l1->right, l1->key);
-    ucx_avl_connect(tree, l1, l0, 0);
-    return l1;
-}
-
-static UcxAVLNode* avl_rotleft(UcxAVLTree *tree, UcxAVLNode *l0) {
-    UcxAVLNode *p = l0->parent;
-    UcxAVLNode *l1 = l0->right;
-    if (p) {
-        ucx_avl_connect(tree, p, l1, 0);
-    } else {
-        l1->parent = NULL;
-    }
-    ucx_avl_connect(tree, l0, l1->left, l1->key);
-    ucx_avl_connect(tree, l1, l0, 0);
-    return l1;
-}
-
-static void ucx_avl_balance(UcxAVLTree *tree, UcxAVLNode *n) {
-    int lh = avlheight(n->left);
-    int rh = avlheight(n->right);
-    n->height = 1 + (lh > rh ? lh : rh);
-    
-    if (lh - rh == 2) {
-      UcxAVLNode *c = n->left;
-      if (avlheight(c->right) - avlheight(c->left) == 1) {
-        avl_rotleft(tree, c);
-      }
-      n = avl_rotright(tree, n);
-    } else if (rh - lh == 2) {  
-      UcxAVLNode *c = n->right;
-      if (avlheight(c->left) - avlheight(c->right) == 1) {
-        avl_rotright(tree, c);
-      }
-      n = avl_rotleft(tree, n);
-    }
-
-    if (n->parent) {
-      ucx_avl_balance(tree, n->parent);
-    } else {
-      tree->root = n;
-    }
-}
-
-UcxAVLTree *ucx_avl_new(cmp_func cmpfunc) {
-    return ucx_avl_new_a(cmpfunc, ucx_default_allocator());
-}
-
-UcxAVLTree *ucx_avl_new_a(cmp_func cmpfunc, UcxAllocator *allocator) {
-    UcxAVLTree* tree = alloc_tree(allocator);
-    if (tree) {
-        tree->allocator = allocator;
-        tree->cmpfunc = cmpfunc;
-        tree->root = NULL;
-        tree->userdata = NULL;
-    }
-    
-    return tree;
-}
-
-static void ucx_avl_free_node(UcxAllocator *al, UcxAVLNode *node) {
-    if (node) {
-        ucx_avl_free_node(al, node->left);
-        ucx_avl_free_node(al, node->right);
-        alfree(al, node);
-    }
-}
-
-void ucx_avl_free(UcxAVLTree *tree) {
-    UcxAllocator *al = tree->allocator;
-    ucx_avl_free_node(al, tree->root);
-    alfree(al, tree);
-}
-
-static void ucx_avl_free_content_node(UcxAllocator *al, UcxAVLNode *node,
-        ucx_destructor destr) {
-    if (node) {
-        ucx_avl_free_content_node(al, node->left, destr);
-        ucx_avl_free_content_node(al, node->right, destr);
-        if (destr) {
-            destr(node->value);
-        } else {
-            alfree(al, node->value);
-        }
-    }
-}
-
-void ucx_avl_free_content(UcxAVLTree *tree, ucx_destructor destr) {
-    ucx_avl_free_content_node(tree->allocator, tree->root, destr);
-}
-
-UcxAVLNode *ucx_avl_get_node(UcxAVLTree *tree, intptr_t key) {
-    UcxAVLNode *n = tree->root;
-    int cmpresult;
-    while (n && (cmpresult = tree->cmpfunc(
-            ptrcast(key), ptrcast(n->key), tree->userdata))) {
-        n = cmpresult > 0 ? n->right : n->left;
-    }
-    return n;
-}
-
-void *ucx_avl_get(UcxAVLTree *tree, intptr_t key) {
-    UcxAVLNode *n = ucx_avl_get_node(tree, key);
-    return n ? n->value : NULL;
-}
-
-UcxAVLNode *ucx_avl_find_node(UcxAVLTree *tree, intptr_t key,
-        distance_func dfnc, int mode) {
-    UcxAVLNode *n = tree->root;
-    UcxAVLNode *closest = NULL;
-
-    intmax_t cmpresult;
-    intmax_t closest_dist;
-    closest_dist = mode == UCX_AVL_FIND_LOWER_BOUNDED ? INTMAX_MIN : INTMAX_MAX;
-    
-    while (n && (cmpresult = dfnc(
-            ptrcast(key), ptrcast(n->key), tree->userdata))) {
-        if (mode == UCX_AVL_FIND_CLOSEST) {
-            intmax_t dist = cmpresult;
-            if (dist < 0) dist *= -1;
-            if (dist < closest_dist) {
-                closest_dist = dist;
-                closest = n;
-            }
-        } else if (mode == UCX_AVL_FIND_LOWER_BOUNDED && cmpresult <= 0) {
-            if (cmpresult > closest_dist) {
-                closest_dist = cmpresult;
-                closest = n;
-            }
-        } else if (mode == UCX_AVL_FIND_UPPER_BOUNDED && cmpresult >= 0) {
-            if (cmpresult < closest_dist) {
-                closest_dist = cmpresult;
-                closest = n;
-            }
-        }
-        n = cmpresult > 0 ? n->right : n->left;
-    }
-    return n ? n : closest;
-}
-
-void *ucx_avl_find(UcxAVLTree *tree, intptr_t key,
-        distance_func dfnc, int mode) {
-    UcxAVLNode *n = ucx_avl_find_node(tree, key, dfnc, mode);
-    return n ? n->value : NULL;
-}
-
-int ucx_avl_put(UcxAVLTree *tree, intptr_t key, void *value) {
-    return ucx_avl_put_s(tree, key, value, NULL);
-}
-
-int ucx_avl_put_s(UcxAVLTree *tree, intptr_t key, void *value,
-        void **oldvalue) {
-    if (tree->root) {
-        UcxAVLNode *n = tree->root;
-        int cmpresult;
-        while ((cmpresult = tree->cmpfunc(
-                ptrcast(key), ptrcast(n->key), tree->userdata))) {
-            UcxAVLNode *m = cmpresult > 0 ? n->right : n->left;
-            if (m) {
-                n = m;
-            } else {
-                break;
-            }
-        }
-
-        if (cmpresult) {
-            UcxAVLNode* e = alloc_node(tree->allocator);
-            if (e) {
-                e->key = key; e->value = value; e->height = 1;
-                e->parent = e->left = e->right = NULL;
-                ucx_avl_connect(tree, n, e, 0);
-                ucx_avl_balance(tree, n);
-                return 0;
-            } else {
-                return 1;
-            }
-        } else {
-            if (oldvalue) {
-                *oldvalue = n->value;
-            }
-            n->value = value;
-            return 0;
-        }
-    } else {
-        tree->root = alloc_node(tree->allocator);
-        if (tree->root) {
-            tree->root->key = key; tree->root->value = value;
-            tree->root->height = 1;
-            tree->root->parent = tree->root->left = tree->root->right = NULL;
-            
-            if (oldvalue) {
-                *oldvalue = NULL;
-            }
-            
-            return 0;
-        } else {
-            return 1;
-        }
-    }
-}
-
-int ucx_avl_remove(UcxAVLTree *tree, intptr_t key) {
-    return ucx_avl_remove_s(tree, key, NULL, NULL);
-}
-    
-int ucx_avl_remove_node(UcxAVLTree *tree, UcxAVLNode *node) {
-    return ucx_avl_remove_s(tree, node->key, NULL, NULL);
-}
-
-int ucx_avl_remove_s(UcxAVLTree *tree, intptr_t key,
-        intptr_t *oldkey, void **oldvalue) {
-    
-    UcxAVLNode *n = tree->root;
-    int cmpresult;
-    while (n && (cmpresult = tree->cmpfunc(
-            ptrcast(key), ptrcast(n->key), tree->userdata))) {
-        n = cmpresult > 0 ? n->right : n->left;
-    }
-    if (n) {
-        if (oldkey) {
-            *oldkey = n->key;
-        }
-        if (oldvalue) {
-            *oldvalue = n->value;
-        }
-        
-        UcxAVLNode *p = n->parent;
-        if (n->left && n->right) {
-            UcxAVLNode *s = n->right;
-            while (s->left) {
-                s = s->left;
-            }
-            ucx_avl_connect(tree, s->parent, s->right, s->key);
-            n->key = s->key; n->value = s->value;
-            p = s->parent;
-            alfree(tree->allocator, s);
-        } else {
-            if (p) {
-                ucx_avl_connect(tree, p, n->right ? n->right:n->left, n->key);
-            } else {
-                tree->root = n->right ? n->right : n->left;
-                if (tree->root) {
-                    tree->root->parent = NULL;
-                }
-            }
-            alfree(tree->allocator, n);
-        }
-
-        if (p) {
-            ucx_avl_balance(tree, p);
-        }
-        
-        return 0;
-    } else {
-        return 1;
-    }
-}
-
-static size_t ucx_avl_countn(UcxAVLNode *node) {
-    if (node) {
-        return 1 + ucx_avl_countn(node->left) + ucx_avl_countn(node->right);
-    } else {
-        return 0;
-    }
-}
-
-size_t ucx_avl_count(UcxAVLTree *tree) {
-    return ucx_avl_countn(tree->root);
-}
-
-UcxAVLNode* ucx_avl_pred(UcxAVLNode* node) {
-    if (node->left) {
-        UcxAVLNode* n = node->left;
-        while (n->right) {
-            n = n->right;
-        }
-        return n;
-    } else {
-        UcxAVLNode* n = node;
-        while (n->parent) {
-            if (n->parent->right == n) {
-                return n->parent;
-            } else {
-                n = n->parent;
-            }
-        }
-        return NULL;
-    }
-}
-
-UcxAVLNode* ucx_avl_succ(UcxAVLNode* node) {
-    if (node->right) {
-        UcxAVLNode* n = node->right;
-        while (n->left) {
-            n = n->left;
-        }
-        return n;
-    } else {
-        UcxAVLNode* n = node;
-        while (n->parent) {
-            if (n->parent->left == n) {
-                return n->parent;
-            } else {
-                n = n->parent;
-            }
-        }
-        return NULL;
-    }
-}
--- a/src/buffer.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,297 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "ucx/buffer.h"
-
-#include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
-
-UcxBuffer *ucx_buffer_new(void *space, size_t capacity, int flags) {
-    UcxBuffer *buffer = (UcxBuffer*) malloc(sizeof(UcxBuffer));
-    if (buffer) {
-        buffer->flags = flags;
-        if (!space) {
-            buffer->space = (char*)malloc(capacity);
-            if (!buffer->space) {
-                free(buffer);
-                return NULL;
-            }
-            memset(buffer->space, 0, capacity);
-            buffer->flags |= UCX_BUFFER_AUTOFREE;
-        } else {
-            buffer->space = (char*)space;
-        }
-        buffer->capacity = capacity;
-        buffer->size = 0;
-
-        buffer->pos = 0;
-    }
-
-    return buffer;
-}
-
-void ucx_buffer_free(UcxBuffer *buffer) {
-    if ((buffer->flags & UCX_BUFFER_AUTOFREE) == UCX_BUFFER_AUTOFREE) {
-        free(buffer->space);
-    }
-    free(buffer);
-}
-
-UcxBuffer* ucx_buffer_extract(
-        UcxBuffer *src, size_t start, size_t length, int flags) {
-    if (src->size == 0 || length == 0 ||
-        ((size_t)-1) - start < length || start+length > src->capacity)
-    {
-        return NULL;
-    }
-
-    UcxBuffer *dst = (UcxBuffer*) malloc(sizeof(UcxBuffer));
-    if (dst) {
-        dst->space = (char*)malloc(length);
-        if (!dst->space) {
-            free(dst);
-            return NULL;
-        }
-        dst->capacity = length;
-        dst->size = length;
-        dst->flags = flags | UCX_BUFFER_AUTOFREE;
-        dst->pos = 0;
-        memcpy(dst->space, src->space+start, length);
-    }
-    return dst;
-}
-
-int ucx_buffer_seek(UcxBuffer *buffer, off_t offset, int whence) {
-    size_t npos;
-    switch (whence) {
-    case SEEK_CUR:
-        npos = buffer->pos;
-        break;
-    case SEEK_END:
-        npos = buffer->size;
-        break;
-    case SEEK_SET:
-        npos = 0;
-        break;
-    default:
-        return -1;
-    }
-
-    size_t opos = npos;
-    npos += offset;
-    
-    if ((offset > 0 && npos < opos) || (offset < 0 && npos > opos)) {
-        return -1;
-    }
-    
-    if (npos >= buffer->size) {
-        return -1;
-    } else {
-        buffer->pos = npos;
-        return 0;
-    }
-
-}
-
-int ucx_buffer_eof(UcxBuffer *buffer) {
-    return buffer->pos >= buffer->size;
-}
-
-int ucx_buffer_extend(UcxBuffer *buffer, size_t len) {
-    size_t newcap = buffer->capacity;
-    
-    if (buffer->capacity + len < buffer->capacity) {
-        return -1;
-    }
-    
-    while (buffer->capacity + len > newcap) {
-        newcap <<= 1;
-        if (newcap < buffer->capacity) {
-            return -1;
-        }
-    }
-    
-    char *newspace = (char*)realloc(buffer->space, newcap);
-    if (newspace) {
-        memset(newspace+buffer->size, 0, newcap-buffer->size);
-        buffer->space = newspace;
-        buffer->capacity = newcap;
-    } else {
-        return -1;
-    }
-    
-    return 0;
-}
-
-size_t ucx_buffer_write(const void *ptr, size_t size, size_t nitems,
-        UcxBuffer *buffer) {
-    size_t len;
-    if(ucx_szmul(size, nitems, &len)) {
-        return 0;
-    }
-    size_t required = buffer->pos + len;
-    if (buffer->pos > required) {
-        return 0;
-    }
-    
-    if (required > buffer->capacity) {
-        if ((buffer->flags & UCX_BUFFER_AUTOEXTEND) == UCX_BUFFER_AUTOEXTEND) {
-            if (ucx_buffer_extend(buffer, required - buffer->capacity)) {
-                return 0;
-            }
-        } else {
-            len = buffer->capacity - buffer->pos;
-            if (size > 1) {
-                len -= len%size;
-            }
-        }
-    }
-    
-    if (len == 0) {
-        return len;
-    }
-    
-    memcpy(buffer->space + buffer->pos, ptr, len);
-    buffer->pos += len;
-    if(buffer->pos > buffer->size) {
-        buffer->size = buffer->pos;
-    }
-    
-    return len / size;
-}
-
-size_t ucx_buffer_read(void *ptr, size_t size, size_t nitems,
-        UcxBuffer *buffer) {
-    size_t len;
-    if(ucx_szmul(size, nitems, &len)) {
-        return 0;
-    }
-    if (buffer->pos + len > buffer->size) {
-        len = buffer->size - buffer->pos;
-        if (size > 1) len -= len%size;
-    }
-    
-    if (len <= 0) {
-        return len;
-    }
-    
-    memcpy(ptr, buffer->space + buffer->pos, len);
-    buffer->pos += len;
-    
-    return len / size;
-}
-
-int ucx_buffer_putc(UcxBuffer *buffer, int c) {
-    if(buffer->pos >= buffer->capacity) {
-        if ((buffer->flags & UCX_BUFFER_AUTOEXTEND) == UCX_BUFFER_AUTOEXTEND) {
-            if(ucx_buffer_extend(buffer, 1)) {
-                return EOF;
-            }
-        } else {
-            return EOF;
-        }
-    }
-    
-    c &= 0xFF;
-    buffer->space[buffer->pos] = (char) c;
-    buffer->pos++;
-    if(buffer->pos > buffer->size) {
-        buffer->size = buffer->pos;
-    }
-    return c;
-}
-
-int ucx_buffer_getc(UcxBuffer *buffer) {
-    if (ucx_buffer_eof(buffer)) {
-        return EOF;
-    } else {
-        int c = ((unsigned char*)buffer->space)[buffer->pos];
-        buffer->pos++;
-        return c;
-    }
-}
-
-size_t ucx_buffer_puts(UcxBuffer *buffer, const char *str) {
-    return ucx_buffer_write((const void*)str, 1, strlen(str), buffer);
-}
-
-int ucx_buffer_shift_left(UcxBuffer* buffer, size_t shift) {
-    if (shift >= buffer->size) {
-        buffer->pos = buffer->size = 0;
-    } else {
-        memmove(buffer->space, buffer->space + shift, buffer->size - shift);
-        buffer->size -= shift;
-        
-        if (buffer->pos >= shift) {
-            buffer->pos -= shift;
-        } else {
-            buffer->pos = 0;
-        }
-    }
-    return 0;
-}
-
-int ucx_buffer_shift_right(UcxBuffer* buffer, size_t shift) {
-    size_t req_capacity = buffer->size + shift;
-    size_t movebytes;
-    
-    // auto extend buffer, if required and enabled
-    if (buffer->capacity < req_capacity) {
-        if ((buffer->flags & UCX_BUFFER_AUTOEXTEND) == UCX_BUFFER_AUTOEXTEND) {
-            if (ucx_buffer_extend(buffer, req_capacity - buffer->capacity)) {
-                return 1;
-            }
-            movebytes = buffer->size;
-        } else {
-            movebytes = buffer->capacity - shift;
-        }
-    } else {
-        movebytes = buffer->size;
-    }
-    
-    memmove(buffer->space + shift, buffer->space, movebytes);
-    buffer->size = shift+movebytes;
-    
-    buffer->pos += shift;
-    if (buffer->pos > buffer->size) {
-        buffer->pos = buffer->size;
-    }
-    
-    return 0;
-}
-
-int ucx_buffer_shift(UcxBuffer* buffer, off_t shift) {
-    if (shift < 0) {
-        return ucx_buffer_shift_left(buffer, (size_t) (-shift));
-    } else if (shift > 0) {
-        return ucx_buffer_shift_right(buffer, (size_t) shift);
-    } else {
-        return 0;
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cx/list.h	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,32 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef UCX_LIST_H
+#define UCX_LIST_H
+
+#endif //UCX_LIST_H
--- a/src/list.c	Mon Dec 30 09:54:10 2019 +0100
+++ b/src/list.c	Sat Feb 06 19:11:44 2021 +0100
@@ -1,7 +1,7 @@
 /*
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
  *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
+ * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -26,403 +26,4 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include "ucx/list.h"
-
-UcxList *ucx_list_clone(const UcxList *l, copy_func fnc, void *data) {
-    return ucx_list_clone_a(ucx_default_allocator(), l, fnc, data);
-}
-
-UcxList *ucx_list_clone_a(UcxAllocator *alloc, const UcxList *l,
-        copy_func fnc, void *data) {
-    UcxList *ret = NULL;
-    while (l) {
-        if (fnc) {
-            ret = ucx_list_append_a(alloc, ret, fnc(l->data, data));
-        } else {
-            ret = ucx_list_append_a(alloc, ret, l->data);
-        }
-        l = l->next;
-    }
-    return ret;
-}
-
-int ucx_list_equals(const UcxList *l1, const UcxList *l2,
-        cmp_func fnc, void* data) {
-    if (l1 == l2) return 1;
-    
-    while (l1 != NULL && l2 != NULL) {
-        if (fnc == NULL) {
-            if (l1->data != l2->data) return 0;
-        } else {
-            if (fnc(l1->data, l2->data, data) != 0) return 0;
-        }
-        l1 = l1->next;
-        l2 = l2->next;
-    }
-    
-    return (l1 == NULL && l2 == NULL);
-}
-
-void ucx_list_free(UcxList *l) {
-    ucx_list_free_a(ucx_default_allocator(), l);
-}
-
-void ucx_list_free_a(UcxAllocator *alloc, UcxList *l) {
-    UcxList *e = l, *f;
-    while (e != NULL) {
-        f = e;
-        e = e->next;
-        alfree(alloc, f);
-    }
-}
-
-void ucx_list_free_content(UcxList* list, ucx_destructor destr) {
-    if (!destr) destr = free;
-    while (list != NULL) {
-        destr(list->data);
-        list = list->next;
-    }
-}
-
-UcxList *ucx_list_append(UcxList *l, void *data)  {
-    return ucx_list_append_a(ucx_default_allocator(), l, data);
-}
-
-UcxList *ucx_list_append_a(UcxAllocator *alloc, UcxList *l, void *data)  {
-    UcxList *nl = (UcxList*) almalloc(alloc, sizeof(UcxList));
-    if (!nl) {
-        return NULL;
-    }
-    
-    nl->data = data;
-    nl->next = NULL;
-    if (l) {
-        UcxList *t = ucx_list_last(l);
-        t->next = nl;
-        nl->prev = t;
-        return l;
-    } else {
-        nl->prev = NULL;
-        return nl;
-    }
-}
-
-UcxList *ucx_list_prepend(UcxList *l, void *data) {
-    return ucx_list_prepend_a(ucx_default_allocator(), l, data);
-}
-
-UcxList *ucx_list_prepend_a(UcxAllocator *alloc, UcxList *l, void *data) {
-    UcxList *nl = ucx_list_append_a(alloc, NULL, data);
-    if (!nl) {
-        return NULL;
-    }
-    l = ucx_list_first(l);
-    
-    if (l) {
-        nl->next = l;
-        l->prev = nl;
-    }
-    return nl;
-}
-
-UcxList *ucx_list_concat(UcxList *l1, UcxList *l2) {
-    if (l1) {
-        UcxList *last = ucx_list_last(l1);
-        last->next = l2;
-        if (l2) {
-            l2->prev = last;
-        }
-        return l1;
-    } else {
-        return l2;
-    }
-}
-
-UcxList *ucx_list_last(const UcxList *l) {
-    if (l == NULL) return NULL;
-    
-    const UcxList *e = l;
-    while (e->next != NULL) {
-        e = e->next;
-    }
-    return (UcxList*)e;
-}
-
-ssize_t ucx_list_indexof(const UcxList *list, const UcxList *elem) {
-    ssize_t index = 0;
-    while (list) {
-        if (list == elem) {
-            return index;
-        }
-        list = list->next;
-        index++;
-    }
-    return -1;
-}
-
-UcxList *ucx_list_get(const UcxList *l, size_t index) {
-    if (l == NULL) return NULL;
-
-    const UcxList *e = l;
-    while (e->next && index > 0) {
-        e = e->next;
-        index--;
-    }
-    
-    return (UcxList*)(index == 0 ? e : NULL);
-}
-
-ssize_t ucx_list_find(const UcxList *l, void *elem,
-        cmp_func fnc, void *cmpdata) {
-    ssize_t index = 0;
-    UCX_FOREACH(e, l) {
-        if (fnc) {
-            if (fnc(elem, e->data, cmpdata) == 0) {
-                return index;
-            }
-        } else {
-            if (elem == e->data) {
-                return index;
-            }
-        }
-        index++;
-    }
-    return -1;
-}
-
-int ucx_list_contains(const UcxList *l, void *elem,
-        cmp_func fnc, void *cmpdata) {
-    return ucx_list_find(l, elem, fnc, cmpdata) > -1;
-}
-
-size_t ucx_list_size(const UcxList *l) {
-    if (l == NULL) return 0;
-    
-    const UcxList *e = l;
-    size_t s = 1;
-    while (e->next != NULL) {
-        e = e->next;
-        s++;
-    }
-
-    return s;
-}
-
-static UcxList *ucx_list_sort_merge(size_t length,
-        UcxList* ls, UcxList* le, UcxList* re,
-        cmp_func fnc, void* data) {
-
-    UcxList** sorted = (UcxList**) malloc(sizeof(UcxList*)*length);
-    UcxList *rc, *lc;
-
-    lc = ls; rc = le;
-    size_t n = 0;
-    while (lc && lc != le && rc != re) {
-        if (fnc(lc->data, rc->data, data) <= 0) {
-            sorted[n] = lc;
-            lc = lc->next;
-        } else {
-            sorted[n] = rc;
-            rc = rc->next;
-        }
-        n++;
-    }
-    while (lc && lc != le) {
-        sorted[n] = lc;
-        lc = lc->next;
-        n++;
-    }
-    while (rc && rc != re) {
-        sorted[n] = rc;
-        rc = rc->next;
-        n++;
-    }
-
-    // Update pointer
-    sorted[0]->prev = NULL;
-    for (int i = 0 ; i < length-1 ; i++) {
-        sorted[i]->next = sorted[i+1];
-        sorted[i+1]->prev = sorted[i];
-    }
-    sorted[length-1]->next = NULL;
-
-    UcxList *ret = sorted[0];
-    free(sorted);
-    return ret;
-}
-
-UcxList *ucx_list_sort(UcxList *l, cmp_func fnc, void *data) {
-    if (l == NULL) {
-        return NULL;
-    }
-
-    UcxList *lc;
-    size_t ln = 1;
-
-    UcxList *ls = l, *le, *re;
-    
-    // check how many elements are already sorted
-    lc = ls;
-    while (lc->next != NULL && fnc(lc->next->data, lc->data, data) > 0) {
-        lc = lc->next;
-        ln++;
-    }
-    le = lc->next;
-
-    if (le == NULL) {
-        return l; // this list is already sorted :)
-    } else {
-        UcxList *rc;
-        size_t rn = 1;
-        rc = le;
-        // skip already sorted elements
-        while (rc->next != NULL && fnc(rc->next->data, rc->data, data) > 0) {
-            rc = rc->next;
-            rn++;
-        }
-        re = rc->next;
-
-        // {ls,...,le->prev} and {rs,...,re->prev} are sorted - merge them
-        UcxList *sorted = ucx_list_sort_merge(ln+rn,
-                ls, le, re,
-                fnc, data);
-        
-        // Something left? Sort it!
-        size_t remainder_length = ucx_list_size(re);
-        if (remainder_length > 0) {
-            UcxList *remainder = ucx_list_sort(re, fnc, data);
-
-            // merge sorted list with (also sorted) remainder
-            l = ucx_list_sort_merge(ln+rn+remainder_length,
-                    sorted, remainder, NULL, fnc, data);
-        } else {
-            // no remainder - we've got our sorted list
-            l = sorted;
-        }
-
-        return l;
-    }
-}
-
-UcxList *ucx_list_first(const UcxList *l) {
-    if (!l) {
-        return NULL;
-    }
-    
-    const UcxList *e = l;
-    while (e->prev) {
-        e = e->prev;
-    }
-    return (UcxList *)e;
-}
-
-UcxList *ucx_list_remove(UcxList *l, UcxList *e) {
-    return ucx_list_remove_a(ucx_default_allocator(), l, e);
-}
-    
-UcxList *ucx_list_remove_a(UcxAllocator *alloc, UcxList *l, UcxList *e) {
-    if (l == e) {
-        l = e->next;
-    }
-    
-    if (e->next) {
-        e->next->prev = e->prev;
-    }
-    
-    if (e->prev) {
-        e->prev->next = e->next;
-    }
-    
-    alfree(alloc, e);
-    return l;
-}
-
-
-static UcxList* ucx_list_setoperation_a(UcxAllocator *allocator,
-        UcxList const *left, UcxList const *right,
-        cmp_func cmpfnc, void* cmpdata,
-        copy_func cpfnc, void* cpdata,
-        int op) {
-    
-    UcxList *res = NULL;
-    UcxList *cur = NULL;
-    const UcxList *src = left;
-    
-    do {
-        UCX_FOREACH(node, src) {
-            void* elem = node->data;
-            if (
-                (op == 0 && !ucx_list_contains(res, elem, cmpfnc, cmpdata)) ||
-                (op == 1 && ucx_list_contains(right, elem, cmpfnc, cmpdata)) ||
-                (op == 2 && !ucx_list_contains(right, elem, cmpfnc, cmpdata))) {
-                UcxList *nl = almalloc(allocator, sizeof(UcxList));
-                nl->prev = cur;
-                nl->next = NULL;
-                if (cpfnc) {
-                    nl->data = cpfnc(elem, cpdata);
-                } else {
-                    nl->data = elem;
-                }
-                if (cur != NULL)
-                    cur->next = nl;
-                cur = nl;
-                if (res == NULL)
-                    res = cur;
-            }
-        }
-        if (op == 0 && src == left)
-            src = right;
-        else
-            src = NULL;
-    } while (src != NULL);
-    
-    return res;
-}
-
-UcxList* ucx_list_union(UcxList const *left, UcxList const *right,
-        cmp_func cmpfnc, void* cmpdata,
-        copy_func cpfnc, void* cpdata) {
-    return ucx_list_union_a(ucx_default_allocator(),
-            left, right, cmpfnc, cmpdata, cpfnc, cpdata);
-}
-
-UcxList* ucx_list_union_a(UcxAllocator *allocator,
-        UcxList const *left, UcxList const *right,
-        cmp_func cmpfnc, void* cmpdata,
-        copy_func cpfnc, void* cpdata) {
-    
-    return ucx_list_setoperation_a(allocator, left, right,
-            cmpfnc, cmpdata, cpfnc, cpdata, 0);
-}
-
-UcxList* ucx_list_intersection(UcxList const *left, UcxList const *right,
-        cmp_func cmpfnc, void* cmpdata,
-        copy_func cpfnc, void* cpdata) {
-    return ucx_list_intersection_a(ucx_default_allocator(), left, right,
-            cmpfnc, cmpdata, cpfnc, cpdata);
-}
-
-UcxList* ucx_list_intersection_a(UcxAllocator *allocator,
-        UcxList const *left, UcxList const *right,
-        cmp_func cmpfnc, void* cmpdata,
-        copy_func cpfnc, void* cpdata) {
-    
-    return ucx_list_setoperation_a(allocator, left, right,
-            cmpfnc, cmpdata, cpfnc, cpdata, 1);
-}
-
-UcxList* ucx_list_difference(UcxList const *left, UcxList const *right,
-        cmp_func cmpfnc, void* cmpdata,
-        copy_func cpfnc, void* cpdata) {
-    return ucx_list_difference_a(ucx_default_allocator(), left, right,
-            cmpfnc, cmpdata, cpfnc, cpdata);
-}
-
-UcxList* ucx_list_difference_a(UcxAllocator *allocator,
-        UcxList const *left, UcxList const *right,
-        cmp_func cmpfnc, void* cmpdata,
-        copy_func cpfnc, void* cpdata) {
-    
-    return ucx_list_setoperation_a(allocator, left, right,
-            cmpfnc, cmpdata, cpfnc, cpdata, 2);
-}
+#include "cx/list.h"
--- a/src/logging.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,117 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "ucx/logging.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#include <time.h>
-
-UcxLogger *ucx_logger_new(void *stream, unsigned int level, unsigned int mask) {
-    UcxLogger *logger = (UcxLogger*) malloc(sizeof(UcxLogger));
-    if (logger != NULL) {
-        logger->stream = stream;
-        logger->writer = (write_func)fwrite;
-        logger->dateformat = (char*) "%F %T %z ";
-        logger->level = level;
-        logger->mask = mask;
-        logger->levels = ucx_map_new(8);
-        
-        unsigned int l;
-        l = UCX_LOGGER_ERROR;
-        ucx_map_int_put(logger->levels, l, (void*) "[ERROR]");
-        l = UCX_LOGGER_WARN;
-        ucx_map_int_put(logger->levels, l, (void*) "[WARNING]");
-        l = UCX_LOGGER_INFO;
-        ucx_map_int_put(logger->levels, l, (void*) "[INFO]");
-        l = UCX_LOGGER_DEBUG;
-        ucx_map_int_put(logger->levels, l, (void*) "[DEBUG]");
-        l = UCX_LOGGER_TRACE;
-        ucx_map_int_put(logger->levels, l, (void*) "[TRACE]");
-    }
-
-    return logger;
-}
-
-void ucx_logger_free(UcxLogger *logger) {
-    ucx_map_free(logger->levels);
-    free(logger);
-}
-
-// estimated max. message length (documented)
-#define UCX_LOGGER_MSGMAX 4096
-
-void ucx_logger_logf(UcxLogger *logger, unsigned int level, const char* file,
-        const unsigned int line, const char *format, ...) {
-    if (level <= logger->level) {
-        char msg[UCX_LOGGER_MSGMAX];
-        const char *text;
-        size_t k = 0;
-        size_t n;
-        
-        if ((logger->mask & UCX_LOGGER_LEVEL) > 0) {
-            text = (const char*) ucx_map_int_get(logger->levels, level);
-            if (!text) {
-                text = "[UNKNOWN]";
-            }
-            n = strlen(text);
-            n = n > 256 ? 256 : n;
-            memcpy(msg+k, text, n);
-            k += n;
-            msg[k++] = ' ';
-        }
-        if ((logger->mask & UCX_LOGGER_TIMESTAMP) > 0) {
-            time_t now = time(NULL);
-            k += strftime(msg+k, 128, logger->dateformat, localtime(&now));
-        }
-        if ((logger->mask & UCX_LOGGER_SOURCE) > 0) {
-            char *fpart = strrchr(file, '/');
-            if (fpart) file = fpart+1;
-            fpart = strrchr(file, '\\');
-            if (fpart) file = fpart+1;
-            n = strlen(file);
-            memcpy(msg+k, file, n);
-            k += n;
-            k += sprintf(msg+k, ":%u ", line);
-        }
-        
-        if (k > 0) {
-            msg[k++] = '-'; msg[k++] = ' ';
-        }
-        
-        va_list args;
-        va_start (args, format);
-        k += vsnprintf(msg+k, UCX_LOGGER_MSGMAX-k-1, format, args);
-        va_end (args);        
-        
-        msg[k++] = '\n';
-        
-        logger->writer(msg, 1, k, logger->stream);
-    }
-}
--- a/src/map.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,402 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "ucx/map.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-UcxMap *ucx_map_new(size_t size) {
-    return ucx_map_new_a(NULL, size);
-}
-
-UcxMap *ucx_map_new_a(UcxAllocator *allocator, size_t size) {
-    if(size == 0) {
-        size = 16;
-    }
-       
-    if(!allocator) {
-        allocator = ucx_default_allocator();
-    }
-    
-    UcxMap *map = (UcxMap*)almalloc(allocator, sizeof(UcxMap));
-    if (!map) {
-        return NULL;
-    }
-    
-    map->allocator = allocator;
-    map->map = (UcxMapElement**)alcalloc(
-            allocator, size, sizeof(UcxMapElement*));
-    if(map->map == NULL) {
-        alfree(allocator, map);
-        return NULL;
-    }
-    map->size = size;
-    map->count = 0;
-
-    return map;
-}
-
-static void ucx_map_free_elmlist_contents(UcxMap *map) {
-    for (size_t n = 0 ; n < map->size ; n++) {
-        UcxMapElement *elem = map->map[n];
-        if (elem != NULL) {
-            do {
-                UcxMapElement *next = elem->next;
-                alfree(map->allocator, elem->key.data);
-                alfree(map->allocator, elem);
-                elem = next;
-            } while (elem != NULL);
-        }
-    }
-}
-
-void ucx_map_free(UcxMap *map) {
-    ucx_map_free_elmlist_contents(map);
-    alfree(map->allocator, map->map);
-    alfree(map->allocator, map);
-}
-
-void ucx_map_free_content(UcxMap *map, ucx_destructor destr) {
-    UcxMapIterator iter = ucx_map_iterator(map);
-    void *val;
-    UCX_MAP_FOREACH(key, val, iter) {
-        if (destr) {
-            destr(val);
-        } else {
-            alfree(map->allocator, val);
-        }
-    }
-}
-
-void ucx_map_clear(UcxMap *map) {
-    if (map->count == 0) {
-        return; // nothing to do
-    }
-    ucx_map_free_elmlist_contents(map);
-    memset(map->map, 0, map->size*sizeof(UcxMapElement*));
-    map->count = 0;
-}
-
-int ucx_map_copy(UcxMap const *from, UcxMap *to, copy_func fnc, void *data) {
-    UcxMapIterator i = ucx_map_iterator(from);
-    void *value;
-    UCX_MAP_FOREACH(key, value, i) {
-        if (ucx_map_put(to, key, fnc ? fnc(value, data) : value)) {
-            return 1;
-        }
-    }
-    return 0;
-}
-
-UcxMap *ucx_map_clone(UcxMap const *map, copy_func fnc, void *data) {
-    return ucx_map_clone_a(ucx_default_allocator(), map, fnc, data);
-}
-
-UcxMap *ucx_map_clone_a(UcxAllocator *allocator,
-        UcxMap const *map, copy_func fnc, void *data) {
-    size_t bs = (map->count * 5) >> 1;
-    UcxMap *newmap = ucx_map_new_a(allocator, bs > map->size ? bs : map->size);
-    if (!newmap) {
-        return NULL;
-    }
-    ucx_map_copy(map, newmap, fnc, data);
-    return newmap;
-}
-
-int ucx_map_rehash(UcxMap *map) {
-    size_t load = (map->size * 3) >> 2;
-    if (map->count > load) {
-        UcxMap oldmap;
-        oldmap.map = map->map;
-        oldmap.size = map->size;
-        oldmap.count = map->count;
-        oldmap.allocator = map->allocator;
-        
-        map->size = (map->count * 5) >> 1;
-        map->map = (UcxMapElement**)alcalloc(
-                map->allocator, map->size, sizeof(UcxMapElement*));
-        if (!map->map) {
-            *map = oldmap;
-            return 1;
-        }
-        map->count = 0;
-        ucx_map_copy(&oldmap, map, NULL, NULL);
-        
-        /* free the UcxMapElement list of oldmap */
-        ucx_map_free_elmlist_contents(&oldmap);
-        alfree(map->allocator, oldmap.map);
-    }
-    return 0;
-}
-
-int ucx_map_put(UcxMap *map, UcxKey key, void *data) {
-    UcxAllocator *allocator = map->allocator;
-    
-    if (key.hash == 0) {
-        key.hash = ucx_hash((const char*)key.data, key.len);
-    }
-    
-    struct UcxMapKey mapkey;
-    mapkey.hash = key.hash;
-
-    size_t slot = mapkey.hash%map->size;
-    UcxMapElement *elm = map->map[slot];
-    UcxMapElement *prev = NULL;
-
-    while (elm && elm->key.hash < mapkey.hash) {
-        prev = elm;
-        elm = elm->next;
-    }
-    
-    if (!elm || elm->key.hash != mapkey.hash) {
-        UcxMapElement *e = (UcxMapElement*)almalloc(
-                allocator, sizeof(UcxMapElement));
-        if (!e) {
-            return -1;
-        }
-        e->key.data = NULL;
-        if (prev) {
-            prev->next = e;
-        } else {
-            map->map[slot] = e;
-        }
-        e->next = elm;
-        elm = e;
-    }
-    
-    if (!elm->key.data) {
-        void *kd = almalloc(allocator, key.len);
-        if (!kd) {
-            return -1;
-        }
-        memcpy(kd, key.data, key.len);
-        mapkey.data = kd;
-        mapkey.len = key.len;
-        elm->key = mapkey;
-        map->count++;
-    }
-    elm->data = data;
-
-    return 0;
-}
-
-static void* ucx_map_get_and_remove(UcxMap *map, UcxKey key, int remove) {
-    if(key.hash == 0) {
-        key.hash = ucx_hash((const char*)key.data, key.len);
-    }
-    
-    size_t slot = key.hash%map->size;
-    UcxMapElement *elm = map->map[slot];
-    UcxMapElement *pelm = NULL;
-    while (elm && elm->key.hash <= key.hash) {
-        if(elm->key.hash == key.hash) {
-            int n = (key.len > elm->key.len) ? elm->key.len : key.len;
-            if (memcmp(elm->key.data, key.data, n) == 0) {
-                void *data = elm->data;
-                if (remove) {
-                    if (pelm) {
-                        pelm->next = elm->next;
-                    } else {
-                        map->map[slot] = elm->next;
-                    }
-                    alfree(map->allocator, elm->key.data);
-                    alfree(map->allocator, elm);
-                    map->count--;
-                }
-
-                return data;
-            }
-        }
-        pelm = elm;
-        elm = pelm->next;
-    }
-
-    return NULL;
-}
-
-void *ucx_map_get(UcxMap const *map, UcxKey key) {
-    return ucx_map_get_and_remove((UcxMap *)map, key, 0);
-}
-
-void *ucx_map_remove(UcxMap *map, UcxKey key) {
-    return ucx_map_get_and_remove(map, key, 1);
-}
-
-UcxKey ucx_key(const void *data, size_t len) {
-    UcxKey key;
-    key.data = data;
-    key.len = len;
-    key.hash = ucx_hash((const char*)data, len);
-    return key;
-}
-
-
-int ucx_hash(const char *data, size_t len) {
-    /* murmur hash 2 */
-
-    int m = 0x5bd1e995;
-    int r = 24;
-
-    int h = 25 ^ len;
-
-    int i = 0;
-    while (len >= 4) {
-        int k = data[i + 0] & 0xFF;
-        k |= (data[i + 1] & 0xFF) << 8;
-        k |= (data[i + 2] & 0xFF) << 16;
-        k |= (data[i + 3] & 0xFF) << 24;
-
-        k *= m;
-        k ^= k >> r;
-        k *= m;
-
-        h *= m;
-        h ^= k;
-
-        i += 4;
-        len -= 4;
-    }
-
-    switch (len) {
-        case 3: h ^= (data[i + 2] & 0xFF) << 16;
-        /* no break */
-        case 2: h ^= (data[i + 1] & 0xFF) << 8;
-        /* no break */
-        case 1: h ^= (data[i + 0] & 0xFF); h *= m;
-        /* no break */
-    }
-
-    h ^= h >> 13;
-    h *= m;
-    h ^= h >> 15;
-
-    return h;
-}
-
-UcxMapIterator ucx_map_iterator(UcxMap const *map) {
-    UcxMapIterator i;
-    i.map = map;
-    i.cur = NULL;
-    i.index = 0;
-    return i;
-}
-
-int ucx_map_iter_next(UcxMapIterator *i, UcxKey *key, void **elm) {
-    UcxMapElement *e = i->cur;
-    
-    if (e) {
-        e = e->next;
-    } else {
-        e = i->map->map[0];
-    }
-    
-    while (i->index < i->map->size) {
-        if (e) {
-            if (e->data) {
-                i->cur = e;
-                *elm = e->data;
-                key->data = e->key.data;
-                key->hash = e->key.hash;
-                key->len = e->key.len;
-                return 1;
-            }
-
-            e = e->next;
-        } else {
-            i->index++;
-            
-            if (i->index < i->map->size) {
-                e = i->map->map[i->index];
-            }
-        }
-    }
-    
-    return 0;
-}
-
-UcxMap* ucx_map_union(const UcxMap *first, const UcxMap *second,
-                      copy_func cpfnc, void* cpdata) {
-    return ucx_map_union_a(ucx_default_allocator(),
-            first, second, cpfnc, cpdata);
-}
-
-UcxMap* ucx_map_union_a(UcxAllocator *allocator,
-                        const UcxMap *first, const UcxMap *second,
-                        copy_func cpfnc, void* cpdata) {
-    UcxMap* result = ucx_map_clone_a(allocator, first, cpfnc, cpdata);
-    ucx_map_copy(second, result, cpfnc, cpdata);
-    return result;
-}
-
-UcxMap* ucx_map_intersection(const UcxMap *first, const UcxMap *second,
-                             copy_func cpfnc, void* cpdata) {
-    return ucx_map_intersection_a(ucx_default_allocator(),
-            first, second, cpfnc, cpdata);
-}
-
-UcxMap* ucx_map_intersection_a(UcxAllocator *allocator,
-                               const UcxMap *first, const UcxMap *second,
-                               copy_func cpfnc, void* cpdata) {
-    UcxMap *result = ucx_map_new_a(allocator, first->size < second->size ?
-            first->size : second->size);
-
-    UcxMapIterator iter = ucx_map_iterator(first);
-    void* value;
-    UCX_MAP_FOREACH(key, value, iter) {
-        if (ucx_map_get(second, key)) {
-            ucx_map_put(result, key, cpfnc ? cpfnc(value, cpdata) : value);
-        }
-    }
-
-    return result;
-}
-
-UcxMap* ucx_map_difference(const UcxMap *first, const UcxMap *second,
-                           copy_func cpfnc, void* cpdata) {
-    return ucx_map_difference_a(ucx_default_allocator(),
-            first, second, cpfnc, cpdata);
-}
-
-UcxMap* ucx_map_difference_a(UcxAllocator *allocator,
-                             const UcxMap *first, const UcxMap *second,
-                             copy_func cpfnc, void* cpdata) {
-
-    UcxMap *result = ucx_map_new_a(allocator, first->size - second->count);
-
-    UcxMapIterator iter = ucx_map_iterator(first);
-    void* value;
-    UCX_MAP_FOREACH(key, value, iter) {
-        if (!ucx_map_get(second, key)) {
-            ucx_map_put(result, key, cpfnc ? cpfnc(value, cpdata) : value);
-        }
-    }
-
-    ucx_map_rehash(result);
-    return result;
-}
\ No newline at end of file
--- a/src/mempool.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,237 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "ucx/mempool.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#ifdef __cplusplus
-#define __STDC_FORMAT_MACROS
-#endif
-#include <inttypes.h>
-
-/** Capsule for destructible memory chunks. */
-typedef struct {
-    /** The destructor for the memory chunk. */
-    ucx_destructor destructor;
-    /**
-     * First byte of the memory chunk.
-     * Note, that the address <code>&amp;c</code> is also the address
-     * of the whole memory chunk.
-     */
-    char c;
-} ucx_memchunk;
-
-/** Capsule for data and its destructor. */
-typedef struct {
-    /** The destructor for the data. */
-    ucx_destructor destructor;
-    /** A pointer to the data. */
-    void           *ptr;
-} ucx_regdestr;
-
-#ifdef __cplusplus
-extern "C"
-#endif
-void ucx_mempool_shared_destr(void* ptr) {
-    ucx_regdestr *rd = (ucx_regdestr*)ptr;
-    rd->destructor(rd->ptr);
-}
-
-UcxMempool *ucx_mempool_new(size_t n) {
-    size_t poolsz;
-    if(ucx_szmul(n, sizeof(void*), &poolsz)) {
-        return NULL;
-    }
-    
-    UcxMempool *pool = (UcxMempool*)malloc(sizeof(UcxMempool));
-    if (!pool) {
-        return NULL;
-    }
-    
-    pool->data = (void**) malloc(poolsz);
-    if (pool->data == NULL) {
-        free(pool);
-        return NULL;
-    }
-    
-    pool->ndata = 0;
-    pool->size = n;
-    
-    UcxAllocator *allocator = (UcxAllocator*)malloc(sizeof(UcxAllocator));
-    if(!allocator) {
-        free(pool->data);
-        free(pool);
-        return NULL;
-    }
-    allocator->malloc = (ucx_allocator_malloc)ucx_mempool_malloc;
-    allocator->calloc = (ucx_allocator_calloc)ucx_mempool_calloc;
-    allocator->realloc = (ucx_allocator_realloc)ucx_mempool_realloc;
-    allocator->free = (ucx_allocator_free)ucx_mempool_free;
-    allocator->pool = pool;
-    pool->allocator = allocator;
-    
-    return pool;
-}
-
-int ucx_mempool_chcap(UcxMempool *pool, size_t newcap) {
-    if (newcap < pool->ndata) {
-        return 1;
-    }
-    
-    size_t newcapsz;
-    if(ucx_szmul(newcap, sizeof(void*), &newcapsz)) {
-        return 1;
-    }
-    
-    void **data = (void**) realloc(pool->data, newcapsz);
-    if (data) {
-        pool->data = data; 
-        pool->size = newcap;
-        return 0;
-    } else {
-        return 1;
-    }
-}
-
-void *ucx_mempool_malloc(UcxMempool *pool, size_t n) {
-    if(((size_t)-1) - sizeof(ucx_destructor) < n) {
-        return NULL;
-    }
-    
-    if (pool->ndata >= pool->size) {
-        size_t newcap = pool->size*2;
-        if (newcap < pool->size || ucx_mempool_chcap(pool, newcap)) {
-            return NULL;
-        }
-    }
-
-    void *p = malloc(sizeof(ucx_destructor) + n);
-    ucx_memchunk *mem = (ucx_memchunk*)p;
-    if (!mem) {
-        return NULL;
-    }
-
-    mem->destructor = NULL;
-    pool->data[pool->ndata] = mem;
-    pool->ndata++;
-
-    return &(mem->c);
-}
-
-void *ucx_mempool_calloc(UcxMempool *pool, size_t nelem, size_t elsize) {
-    size_t msz;
-    if(ucx_szmul(nelem, elsize, &msz)) {
-        return NULL;
-    }
-    
-    void *ptr = ucx_mempool_malloc(pool, msz);
-    if (!ptr) {
-        return NULL;
-    }
-    memset(ptr, 0, nelem * elsize);
-    return ptr;
-}
-
-void *ucx_mempool_realloc(UcxMempool *pool, void *ptr, size_t n) {
-    if(((size_t)-1) - sizeof(ucx_destructor) < n) {
-        return NULL;
-    }
-    
-    char *mem = ((char*)ptr) - sizeof(ucx_destructor);
-    char *newm = (char*) realloc(mem, n + sizeof(ucx_destructor));
-    if (!newm) {
-        return NULL;
-    }
-    if (mem != newm) {
-        for(size_t i=0 ; i < pool->ndata ; i++) {
-            if(pool->data[i] == mem) {
-                pool->data[i] = newm;
-                return newm + sizeof(ucx_destructor);
-            }
-        }
-        fprintf(stderr, "FATAL: 0x%08" PRIxPTR" not in mpool 0x%08" PRIxPTR"\n",
-          (intptr_t)ptr, (intptr_t)pool);
-        abort();
-    } else {
-        return newm + sizeof(ucx_destructor);
-    }
-}
-
-void ucx_mempool_free(UcxMempool *pool, void *ptr) {
-    ucx_memchunk *chunk = (ucx_memchunk*)((char*)ptr-sizeof(ucx_destructor));
-    for(size_t i=0 ; i<pool->ndata ; i++) {
-        if(chunk == pool->data[i]) {
-            if(chunk->destructor != NULL) {
-                chunk->destructor(&(chunk->c));
-            }
-            free(chunk);
-            size_t last_index = pool->ndata - 1;
-            if(i != last_index) {
-                pool->data[i] = pool->data[last_index];
-                pool->data[last_index] = NULL;
-            }
-            pool->ndata--;
-            return;
-        }
-    }
-    fprintf(stderr, "FATAL: 0x%08" PRIxPTR" not in mpool 0x%08" PRIxPTR"\n",
-            (intptr_t)ptr, (intptr_t)pool);
-    abort();
-}
-
-void ucx_mempool_destroy(UcxMempool *pool) {
-    ucx_memchunk *chunk;
-    for(size_t i=0 ; i<pool->ndata ; i++) {
-        chunk = (ucx_memchunk*) pool->data[i];
-        if(chunk) {
-            if(chunk->destructor) {
-                chunk->destructor(&(chunk->c));
-            }
-            free(chunk);
-        }
-    }
-    free(pool->data);
-    free(pool->allocator);
-    free(pool);
-}
-
-void ucx_mempool_set_destr(void *ptr, ucx_destructor func) {
-    *(ucx_destructor*)((char*)ptr-sizeof(ucx_destructor)) = func;
-}
-
-void ucx_mempool_reg_destr(UcxMempool *pool, void *ptr, ucx_destructor destr) {
-    ucx_regdestr *rd = (ucx_regdestr*)ucx_mempool_malloc(
-            pool,
-            sizeof(ucx_regdestr));
-    rd->destructor = destr;
-    rd->ptr = ptr;
-    ucx_mempool_set_destr(rd, ucx_mempool_shared_destr);
-}
-
--- a/src/properties.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,264 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "ucx/properties.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-UcxProperties *ucx_properties_new() {
-    UcxProperties *parser = (UcxProperties*)malloc(
-            sizeof(UcxProperties));
-    if(!parser) {
-        return NULL;
-    }
-    
-    parser->buffer = NULL;
-    parser->buflen = 0;
-    parser->pos = 0;
-    parser->tmp = NULL;
-    parser->tmplen = 0;
-    parser->tmpcap = 0;
-    parser->error = 0;
-    parser->delimiter = '=';
-    parser->comment1 = '#';
-    parser->comment2 = 0;
-    parser->comment3 = 0;   
-    
-    return parser;
-}
-
-void ucx_properties_free(UcxProperties *parser) {
-    if(parser->tmp) {
-        free(parser->tmp);
-    }
-    free(parser);
-}
-
-void ucx_properties_fill(UcxProperties *parser, char *buf, size_t len) {
-    parser->buffer = buf;
-    parser->buflen = len;
-    parser->pos = 0;
-}
-
-static void parser_tmp_append(UcxProperties *parser, char *buf, size_t len) {
-    if(parser->tmpcap - parser->tmplen < len) {
-        size_t newcap = parser->tmpcap + len + 64;
-        parser->tmp = (char*)realloc(parser->tmp, newcap);
-        parser->tmpcap = newcap;
-    }
-    memcpy(parser->tmp + parser->tmplen, buf, len);
-    parser->tmplen += len;
-}
-
-int ucx_properties_next(UcxProperties *parser, sstr_t *name, sstr_t *value)  {   
-    if(parser->tmplen > 0) {
-        char *buf = parser->buffer + parser->pos;
-        size_t len = parser->buflen - parser->pos;
-        sstr_t str = sstrn(buf, len);
-        sstr_t nl = sstrchr(str, '\n');
-        if(nl.ptr) {
-            size_t newlen = (size_t)(nl.ptr - buf) + 1;
-            parser_tmp_append(parser, buf, newlen);
-            // the tmp buffer contains exactly one line now
-            
-            char *orig_buf = parser->buffer;
-            size_t orig_len = parser->buflen;
-            
-            parser->buffer = parser->tmp;
-            parser->buflen = parser->tmplen;
-            parser->pos = 0;    
-            parser->tmp = NULL;
-            parser->tmpcap = 0;
-            parser->tmplen = 0;
-            // run ucx_properties_next with the tmp buffer as main buffer
-            int ret = ucx_properties_next(parser, name, value);
-            
-            // restore original buffer
-            parser->tmp = parser->buffer;
-            parser->buffer = orig_buf;
-            parser->buflen = orig_len;
-            parser->pos = newlen;
-            
-            /*
-             * if ret == 0 the tmp buffer contained just space or a comment
-             * we parse again with the original buffer to get a name/value
-             * or a new tmp buffer
-             */
-            return ret ? ret : ucx_properties_next(parser, name, value);
-        } else {
-            parser_tmp_append(parser, buf, len);
-            return 0;
-        }
-    } else if(parser->tmp) {
-        free(parser->tmp);
-        parser->tmp = NULL;
-    }
-    
-    char comment1 = parser->comment1;
-    char comment2 = parser->comment2;
-    char comment3 = parser->comment3;
-    char delimiter = parser->delimiter;
-    
-    // get one line and parse it
-    while(parser->pos < parser->buflen) {
-        char *buf = parser->buffer + parser->pos;
-        size_t len = parser->buflen - parser->pos;
-        
-        /*
-         * First we check if we have at least one line. We also get indices of
-         * delimiter and comment chars
-         */
-        size_t delimiter_index = 0;
-        size_t comment_index = 0;
-        int has_comment = 0;
-
-        size_t i = 0;
-        char c = 0;
-        for(;i<len;i++) {
-            c = buf[i];
-            if(c == comment1 || c == comment2 || c == comment3) {
-                if(comment_index == 0) {
-                    comment_index = i;
-                    has_comment = 1;
-                }
-            } else if(c == delimiter) {
-                if(delimiter_index == 0 && !has_comment) {
-                    delimiter_index = i;
-                }
-            } else if(c == '\n') {
-                break;
-            }
-        }
-
-        if(c != '\n') {
-            // we don't have enough data for a line
-            // store remaining bytes in temporary buffer for next round
-            parser->tmpcap = len + 128;
-            parser->tmp = (char*)malloc(parser->tmpcap);
-            parser->tmplen = len;
-            memcpy(parser->tmp, buf, len);
-            return 0;
-        }
-        
-        sstr_t line = has_comment ? sstrn(buf, comment_index) : sstrn(buf, i);
-        // check line
-        if(delimiter_index == 0) {
-            line = sstrtrim(line);
-            if(line.length != 0) {
-                parser->error = 1;
-            }
-        } else {
-            sstr_t n = sstrn(buf, delimiter_index);
-            sstr_t v = sstrn(
-                    buf + delimiter_index + 1,
-                    line.length - delimiter_index - 1); 
-            n = sstrtrim(n);
-            v = sstrtrim(v);
-            if(n.length != 0 || v.length != 0) {
-                *name = n;
-                *value = v;
-                parser->pos += i + 1;
-                return 1;
-            } else {
-                parser->error = 1;
-            }
-        }
-        
-        parser->pos += i + 1;
-    }
-    
-    return 0;
-}
-
-int ucx_properties2map(UcxProperties *parser, UcxMap *map) {
-    sstr_t name;
-    sstr_t value;
-    while(ucx_properties_next(parser, &name, &value)) {
-        value = sstrdup_a(map->allocator, value);
-        if(!value.ptr) {
-            return 1;
-        }
-        if(ucx_map_sstr_put(map, name, value.ptr)) {
-            alfree(map->allocator, value.ptr);
-            return 1;
-        }
-    }
-    if (parser->error) {
-        return parser->error;
-    } else {
-        return 0;
-    }
-}
-
-// buffer size is documented - change doc, when you change bufsize!
-#define UCX_PROPLOAD_BUFSIZE  1024
-int ucx_properties_load(UcxMap *map, FILE *file) {
-    UcxProperties *parser = ucx_properties_new();
-    if(!(parser && map && file)) {
-        return 1;
-    }
-    
-    int error = 0;
-    size_t r;
-    char buf[UCX_PROPLOAD_BUFSIZE];
-    while((r = fread(buf, 1, UCX_PROPLOAD_BUFSIZE, file)) != 0) {
-        ucx_properties_fill(parser, buf, r);
-        error = ucx_properties2map(parser, map);
-        if (error) {
-            break;
-        }
-    }
-    ucx_properties_free(parser);
-    return error;
-}
-
-int ucx_properties_store(UcxMap *map, FILE *file) {
-    UcxMapIterator iter = ucx_map_iterator(map);
-    void *v;
-    sstr_t value;
-    size_t written;
-
-    UCX_MAP_FOREACH(k, v, iter) {
-        value = sstr((char*)v);
-
-        written = 0;
-        written += fwrite(k.data, 1, k.len, file);
-        written += fwrite(" = ", 1, 3, file);
-        written += fwrite(value.ptr, 1, value.length, file);
-        written += fwrite("\n", 1, 1, file);
-
-        if (written != k.len + value.length + 4) {
-            return 1;
-        }
-    }
-
-    return 0;
-}
-
--- a/src/stack.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,165 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "ucx/stack.h"
-
-#include <string.h>
-
-static size_t ucx_stack_align(size_t n) {
-    int align = n % sizeof(void*);
-    if (align) {
-        n += sizeof(void*) - align;
-    }
-    return n;
-}
-
-void ucx_stack_init(UcxStack *stack, char* space, size_t size) {
-    stack->size = size - size % sizeof(void*);
-    stack->space = space;
-    stack->top = NULL;
-    
-    stack->allocator.pool = stack;
-    stack->allocator.malloc = (ucx_allocator_malloc) ucx_stack_malloc;
-    stack->allocator.calloc = (ucx_allocator_calloc) ucx_stack_calloc;
-    stack->allocator.realloc = (ucx_allocator_realloc) ucx_stack_realloc;
-    stack->allocator.free = (ucx_allocator_free) ucx_stack_free;
-}
-
-void *ucx_stack_malloc(UcxStack *stack, size_t n) {
-
-    if (ucx_stack_avail(stack) < ucx_stack_align(n)) {
-        return NULL;
-    } else {
-        char *prev = stack->top;
-        if (stack->top) {
-            stack->top += ucx_stack_align(ucx_stack_topsize(stack));
-        } else {
-            stack->top = stack->space;
-        }
-        
-        ((struct ucx_stack_metadata*)stack->top)->prev = prev;
-        ((struct ucx_stack_metadata*)stack->top)->size = n;
-        stack->top += sizeof(struct ucx_stack_metadata);
-        
-        return stack->top;
-    }
-}
-
-void *ucx_stack_calloc(UcxStack *stack, size_t nelem, size_t elsize) {
-    void *mem = ucx_stack_malloc(stack, nelem*elsize);
-    memset(mem, 0, nelem*elsize);
-    return mem;
-}
-
-void *ucx_stack_realloc(UcxStack *stack, void *ptr, size_t n) {
-    if (ptr == stack->top) {
-        if (stack->size - (stack->top - stack->space) < ucx_stack_align(n)) {
-            return NULL;
-        } else {
-            ((struct ucx_stack_metadata*)stack->top - 1)->size = n;
-            return ptr;
-        }
-    } else {
-        if (ucx_stack_align(((struct ucx_stack_metadata*)ptr - 1)->size) <
-                ucx_stack_align(n)) {
-            void *nptr = ucx_stack_malloc(stack, n);
-            if (nptr) {
-                memcpy(nptr, ptr, n);
-                ucx_stack_free(stack, ptr);
-                
-                return nptr;
-            } else {
-                return NULL;
-            }
-        } else {
-            ((struct ucx_stack_metadata*)ptr - 1)->size = n;
-            return ptr;
-        }
-    }
-}
-
-void ucx_stack_free(UcxStack *stack, void *ptr) {
-    if (ptr == stack->top) {
-        stack->top = ((struct ucx_stack_metadata*) stack->top - 1)->prev;
-    } else {
-        struct ucx_stack_metadata *next = (struct ucx_stack_metadata*)(
-            (char*)ptr +
-            ucx_stack_align(((struct ucx_stack_metadata*) ptr - 1)->size)
-        );
-        next->prev = ((struct ucx_stack_metadata*) ptr - 1)->prev;
-    }
-}
-
-void ucx_stack_popn(UcxStack *stack, void *dest, size_t n) {
-    if (ucx_stack_empty(stack)) {
-        return;
-    }
-    
-    if (dest) {
-        size_t len = ucx_stack_topsize(stack);
-        if (len > n) {
-            len = n;
-        }
-
-        memcpy(dest, stack->top, len);
-    }
-    
-    ucx_stack_free(stack, stack->top);
-}
-
-size_t ucx_stack_avail(UcxStack *stack) {
-    size_t avail = ((stack->top ? (stack->size
-                    - (stack->top - stack->space)
-                    - ucx_stack_align(ucx_stack_topsize(stack)))
-                    : stack->size));
-    
-    if (avail > sizeof(struct ucx_stack_metadata)) {
-        return avail - sizeof(struct ucx_stack_metadata);
-    } else {
-        return 0;
-    }
-}
-
-void *ucx_stack_push(UcxStack *stack, size_t n, const void *data) {
-    void *space = ucx_stack_malloc(stack, n);
-    if (space) {
-        memcpy(space, data, n);
-    }
-    return space;
-}
-
-void *ucx_stack_pusharr(UcxStack *stack,
-        size_t nelem, size_t elsize, const void *data) {
-    
-    // skip the memset by using malloc
-    void *space = ucx_stack_malloc(stack, nelem*elsize);
-    if (space) {
-        memcpy(space, data, nelem*elsize);
-    }
-    return space;
-}
--- a/src/string.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,807 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "ucx/string.h"
-
-#include "ucx/allocator.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#include <stdint.h>
-#include <ctype.h>
-
-#ifndef _WIN32
-#include <strings.h> /* for strncasecmp() */
-#endif /* _WIN32 */
-
-sstr_t sstr(char *cstring) {
-    sstr_t string;
-    string.ptr = cstring;
-    string.length = strlen(cstring);
-    return string;
-}
-
-sstr_t sstrn(char *cstring, size_t length) {
-    sstr_t string;
-    string.ptr = cstring;
-    string.length = length;
-    return string;
-}
-
-scstr_t scstr(const char *cstring) {
-    scstr_t string;
-    string.ptr = cstring;
-    string.length = strlen(cstring);
-    return string;
-}
-
-scstr_t scstrn(const char *cstring, size_t length) {
-    scstr_t string;
-    string.ptr = cstring;
-    string.length = length;
-    return string;
-}
-
-
-size_t scstrnlen(size_t n, ...) {
-    if (n == 0) return 0;
-    
-    va_list ap;
-    va_start(ap, n);
-    
-    size_t size = 0;
-
-    for (size_t i = 0 ; i < n ; i++) {
-        scstr_t str = va_arg(ap, scstr_t);
-        if(SIZE_MAX - str.length < size) {
-            size = SIZE_MAX;
-            break;
-        }
-        size += str.length;
-    }
-    va_end(ap);
-
-    return size;
-}
-
-static sstr_t sstrvcat_a(
-        UcxAllocator *a,
-        size_t count,
-        scstr_t s1,
-        va_list ap) {
-    sstr_t str;
-    str.ptr = NULL;
-    str.length = 0;
-    if(count < 2) {
-        return str;
-    }
-    
-    scstr_t s2 = va_arg (ap, scstr_t);
-    
-    if(((size_t)-1) - s1.length < s2.length) {
-        return str;
-    }
-    
-    scstr_t *strings = (scstr_t*) calloc(count, sizeof(scstr_t));
-    if(!strings) {
-        return str;
-    }
-    
-    // get all args and overall length
-    strings[0] = s1;
-    strings[1] = s2;
-    size_t slen = s1.length + s2.length;
-    int error = 0;
-    for (size_t i=2;i<count;i++) {
-        scstr_t s = va_arg (ap, scstr_t);
-        strings[i] = s;
-        if(((size_t)-1) - s.length < slen) {
-            error = 1;
-            break;
-        }
-        slen += s.length;
-    }
-    if(error) {
-        free(strings);
-        return str;
-    }
-    
-    // create new string
-    str.ptr = (char*) almalloc(a, slen + 1);
-    str.length = slen;
-    if(!str.ptr) {
-        free(strings);
-        str.length = 0;
-        return str;
-    }
-    
-    // concatenate strings
-    size_t pos = 0;
-    for (size_t i=0;i<count;i++) {
-        scstr_t s = strings[i];
-        memcpy(str.ptr + pos, s.ptr, s.length);
-        pos += s.length;
-    }
-    
-    str.ptr[str.length] = '\0';
-    
-    free(strings);
-    
-    return str;
-}
-
-sstr_t scstrcat(size_t count, scstr_t s1, ...) {
-    va_list ap;
-    va_start(ap, s1);
-    sstr_t s = sstrvcat_a(ucx_default_allocator(), count, s1, ap);
-    va_end(ap);
-    return s;
-}
-
-sstr_t scstrcat_a(UcxAllocator *a, size_t count, scstr_t s1, ...) {
-    va_list ap;
-    va_start(ap, s1);
-    sstr_t s = sstrvcat_a(a, count, s1, ap);
-    va_end(ap);
-    return s;
-}
-
-static int ucx_substring(
-        size_t str_length,
-        size_t start,
-        size_t length,
-        size_t *newlen,
-        size_t *newpos)
-{
-    *newlen = 0;
-    *newpos = 0;
-    
-    if(start > str_length) {
-        return 0;
-    }
-    
-    if(length > str_length - start) {
-        length = str_length - start;
-    }
-    *newlen = length;
-    *newpos = start;
-    return 1;
-}
-
-sstr_t sstrsubs(sstr_t s, size_t start) {
-    return sstrsubsl (s, start, s.length-start);
-}
-
-sstr_t sstrsubsl(sstr_t s, size_t start, size_t length) {
-    size_t pos;
-    sstr_t ret = { NULL, 0 };
-    if(ucx_substring(s.length, start, length, &ret.length, &pos)) {
-        ret.ptr = s.ptr + pos;
-    }
-    return ret;
-}
-
-scstr_t scstrsubs(scstr_t string, size_t start) {
-    return scstrsubsl(string, start, string.length-start);
-}
-
-scstr_t scstrsubsl(scstr_t s, size_t start, size_t length) {
-    size_t pos;
-    scstr_t ret = { NULL, 0 };
-    if(ucx_substring(s.length, start, length, &ret.length, &pos)) {
-        ret.ptr = s.ptr + pos;
-    }
-    return ret;
-}
-
-
-static int ucx_strchr(const char *str, size_t length, int chr, size_t *pos) {
-    for(size_t i=0;i<length;i++) {
-        if(str[i] == chr) {
-            *pos = i;
-            return 1;
-        }
-    }
-    return 0;
-}
-
-static int ucx_strrchr(const char *str, size_t length, int chr, size_t *pos) {
-    if(length > 0) {
-        for(size_t i=length ; i>0 ; i--) {
-            if(str[i-1] == chr) {
-                *pos = i-1;
-                return 1;
-            }
-        }
-    }
-    return 0;
-}
-
-sstr_t sstrchr(sstr_t s, int c) {
-    size_t pos = 0;
-    if(ucx_strchr(s.ptr, s.length, c, &pos)) {
-        return sstrsubs(s, pos);
-    }
-    return sstrn(NULL, 0);
-}
-
-sstr_t sstrrchr(sstr_t s, int c) {
-    size_t pos = 0;
-    if(ucx_strrchr(s.ptr, s.length, c, &pos)) {
-        return sstrsubs(s, pos);
-    }
-    return sstrn(NULL, 0);
-}
-
-scstr_t scstrchr(scstr_t s, int c) {
-    size_t pos = 0;
-    if(ucx_strchr(s.ptr, s.length, c, &pos)) {
-        return scstrsubs(s, pos);
-    }
-    return scstrn(NULL, 0);
-}
-
-scstr_t scstrrchr(scstr_t s, int c) {
-    size_t pos = 0;
-    if(ucx_strrchr(s.ptr, s.length, c, &pos)) {
-        return scstrsubs(s, pos);
-    }
-    return scstrn(NULL, 0);
-}
-
-#define ptable_r(dest, useheap, ptable, index) (dest = useheap ? \
-    ((size_t*)ptable)[index] : (size_t) ((uint8_t*)ptable)[index])
-
-#define ptable_w(useheap, ptable, index, src) do {\
-    if (!useheap) ((uint8_t*)ptable)[index] = (uint8_t) src;\
-    else ((size_t*)ptable)[index] = src;\
-    } while (0);
-
-
-static const char* ucx_strstr(
-        const char *str,
-        size_t length,
-        const char *match,
-        size_t matchlen,
-        size_t *newlen)
-{
-    *newlen = length;
-    if (matchlen == 0) {
-        return str;
-    }
-    
-    const char *result = NULL;
-    size_t resultlen = 0;
-    
-    /*
-     * IMPORTANT:
-     * our prefix table contains the prefix length PLUS ONE
-     * this is our decision, because we want to use the full range of size_t
-     * the original algorithm needs a (-1) at one single place
-     * and we want to avoid that
-     */
-    
-    /* static prefix table */
-    static uint8_t s_prefix_table[256];
-    
-    /* check pattern length and use appropriate prefix table */
-    /* if the pattern exceeds static prefix table, allocate on the heap */
-    register int useheap = matchlen > 255;
-    register void* ptable = useheap ?
-        calloc(matchlen+1, sizeof(size_t)): s_prefix_table;
-    
-    /* keep counter in registers */
-    register size_t i, j;
-    
-    /* fill prefix table */
-    i = 0; j = 0;
-    ptable_w(useheap, ptable, i, j);
-    while (i < matchlen) {
-        while (j >= 1 && match[j-1] != match[i]) {
-            ptable_r(j, useheap, ptable, j-1);
-        }
-        i++; j++;
-        ptable_w(useheap, ptable, i, j);
-    }
-
-    /* search */
-    i = 0; j = 1;
-    while (i < length) {
-        while (j >= 1 && str[i] != match[j-1]) {
-            ptable_r(j, useheap, ptable, j-1);
-        }
-        i++; j++;
-        if (j-1 == matchlen) {
-            size_t start = i - matchlen;
-            result = str + start;
-            resultlen = length - start;
-            break;
-        }
-    }
-
-    /* if prefix table was allocated on the heap, free it */
-    if (ptable != s_prefix_table) {
-        free(ptable);
-    }
-    
-    *newlen = resultlen;
-    return result;
-}
-
-sstr_t scstrsstr(sstr_t string, scstr_t match) {
-    sstr_t result;
-    
-    size_t reslen;
-    const char *resstr = ucx_strstr(string.ptr, string.length, match.ptr, match.length, &reslen);
-    if(!resstr) {
-        result.ptr = NULL;
-        result.length = 0;
-        return result;
-    }
-    
-    size_t pos = resstr - string.ptr;
-    result.ptr = string.ptr + pos;
-    result.length = reslen;
-    
-    return result;
-}
-
-scstr_t scstrscstr(scstr_t string, scstr_t match) {
-    scstr_t result;
-    
-    size_t reslen;
-    const char *resstr = ucx_strstr(string.ptr, string.length, match.ptr, match.length, &reslen);
-    if(!resstr) {
-        result.ptr = NULL;
-        result.length = 0;
-        return result;
-    }
-    
-    size_t pos = resstr - string.ptr;
-    result.ptr = string.ptr + pos;
-    result.length = reslen;
-    
-    return result;
-}
-
-#undef ptable_r
-#undef ptable_w
-
-sstr_t* scstrsplit(scstr_t s, scstr_t d, ssize_t *n) {
-    return scstrsplit_a(ucx_default_allocator(), s, d, n);
-}
-
-sstr_t* scstrsplit_a(UcxAllocator *allocator, scstr_t s, scstr_t d, ssize_t *n) {
-    if (s.length == 0 || d.length == 0) {
-        *n = -1;
-        return NULL;
-    }
-    
-    /* special cases: delimiter is at least as large as the string */
-    if (d.length >= s.length) {
-        /* exact match */
-        if (sstrcmp(s, d) == 0) {
-            *n = 0;
-            return NULL;
-        } else /* no match possible */ {
-            *n = 1;
-            sstr_t *result = (sstr_t*) almalloc(allocator, sizeof(sstr_t));
-            if(result) {
-                *result = sstrdup_a(allocator, s);
-            } else {
-                *n = -2;
-            }
-            return result;
-        }
-    }
-    
-    ssize_t nmax = *n;
-    size_t arrlen = 16;
-    sstr_t* result = (sstr_t*) alcalloc(allocator, arrlen, sizeof(sstr_t));
-
-    if (result) {
-        scstr_t curpos = s;
-        ssize_t j = 1;
-        while (1) {
-            scstr_t match;
-            /* optimize for one byte delimiters */
-            if (d.length == 1) {
-                match = curpos;
-                for (size_t i = 0 ; i < curpos.length ; i++) {
-                    if (curpos.ptr[i] == *(d.ptr)) {
-                        match.ptr = curpos.ptr + i;
-                        break;
-                    }
-                    match.length--;
-                }
-            } else {
-                match = scstrscstr(curpos, d);
-            }
-            if (match.length > 0) {
-                /* is this our last try? */
-                if (nmax == 0 || j < nmax) {
-                    /* copy the current string to the array */
-                    scstr_t item = scstrn(curpos.ptr, match.ptr - curpos.ptr);
-                    result[j-1] = sstrdup_a(allocator, item);
-                    size_t processed = item.length + d.length;
-                    curpos.ptr += processed;
-                    curpos.length -= processed;
-
-                    /* allocate memory for the next string */
-                    j++;
-                    if (j > arrlen) {
-                        arrlen *= 2;
-                        size_t reallocsz;
-                        sstr_t* reallocated = NULL;
-                        if(!ucx_szmul(arrlen, sizeof(sstr_t), &reallocsz)) {
-                            reallocated = (sstr_t*) alrealloc(
-                                    allocator, result, reallocsz);
-                        }
-                        if (reallocated) {
-                            result = reallocated;
-                        } else {
-                            for (ssize_t i = 0 ; i < j-1 ; i++) {
-                                alfree(allocator, result[i].ptr);
-                            }
-                            alfree(allocator, result);
-                            *n = -2;
-                            return NULL;
-                        }
-                    }
-                } else {
-                    /* nmax reached, copy the _full_ remaining string */
-                    result[j-1] = sstrdup_a(allocator, curpos);
-                    break;
-                }
-            } else {
-                /* no more matches, copy last string */
-                result[j-1] = sstrdup_a(allocator, curpos);
-                break;
-            }
-        }
-        *n = j;
-    } else {
-        *n = -2;
-    }
-
-    return result;
-}
-
-int scstrcmp(scstr_t s1, scstr_t s2) {
-    if (s1.length == s2.length) {
-        return memcmp(s1.ptr, s2.ptr, s1.length);
-    } else if (s1.length > s2.length) {
-        return 1;
-    } else {
-        return -1;
-    }
-}
-
-int scstrcasecmp(scstr_t s1, scstr_t s2) {
-    if (s1.length == s2.length) {
-#ifdef _WIN32
-        return _strnicmp(s1.ptr, s2.ptr, s1.length);
-#else
-        return strncasecmp(s1.ptr, s2.ptr, s1.length);
-#endif
-    } else if (s1.length > s2.length) {
-        return 1;
-    } else {
-        return -1;
-    }
-}
-
-sstr_t scstrdup(scstr_t s) {
-    return sstrdup_a(ucx_default_allocator(), s);
-}
-
-sstr_t scstrdup_a(UcxAllocator *allocator, scstr_t s) {
-    sstr_t newstring;
-    newstring.ptr = (char*)almalloc(allocator, s.length + 1);
-    if (newstring.ptr) {
-        newstring.length = s.length;
-        newstring.ptr[newstring.length] = 0;
-        
-        memcpy(newstring.ptr, s.ptr, s.length);
-    } else {
-        newstring.length = 0;
-    }
-    
-    return newstring;
-}
-
-
-static size_t ucx_strtrim(const char *s, size_t len, size_t *newlen) {
-    const char *newptr = s;
-    size_t length = len;
-    
-    while(length > 0 && isspace(*newptr)) {
-        newptr++;
-        length--;
-    }
-    while(length > 0 && isspace(newptr[length-1])) {
-        length--;
-    }
-    
-    *newlen = length;
-    return newptr - s;
-}
-
-sstr_t sstrtrim(sstr_t string) {
-    sstr_t newstr;
-    newstr.ptr = string.ptr
-                 + ucx_strtrim(string.ptr, string.length, &newstr.length);
-    return newstr;
-}
-
-scstr_t scstrtrim(scstr_t string) {
-    scstr_t newstr;
-    newstr.ptr = string.ptr
-                 + ucx_strtrim(string.ptr, string.length, &newstr.length);
-    return newstr;
-}
-
-int scstrprefix(scstr_t string, scstr_t prefix) {
-    if (string.length == 0) {
-        return prefix.length == 0;
-    }
-    if (prefix.length == 0) {
-        return 1;
-    }
-    
-    if (prefix.length > string.length) {
-        return 0;
-    } else {
-        return memcmp(string.ptr, prefix.ptr, prefix.length) == 0;
-    }
-}
-
-int scstrsuffix(scstr_t string, scstr_t suffix) {
-    if (string.length == 0) {
-        return suffix.length == 0;
-    }
-    if (suffix.length == 0) {
-        return 1;
-    }
-    
-    if (suffix.length > string.length) {
-        return 0;
-    } else {
-        return memcmp(string.ptr+string.length-suffix.length,
-            suffix.ptr, suffix.length) == 0;
-    }
-}
-
-int scstrcaseprefix(scstr_t string, scstr_t prefix) {
-    if (string.length == 0) {
-        return prefix.length == 0;
-    }
-    if (prefix.length == 0) {
-        return 1;
-    }
-    
-    if (prefix.length > string.length) {
-        return 0;
-    } else {
-        scstr_t subs = scstrsubsl(string, 0, prefix.length);
-        return scstrcasecmp(subs, prefix) == 0;
-    }
-}
-
-int scstrcasesuffix(scstr_t string, scstr_t suffix) {
-    if (string.length == 0) {
-        return suffix.length == 0;
-    }
-    if (suffix.length == 0) {
-        return 1;
-    }
-    
-    if (suffix.length > string.length) {
-        return 0;
-    } else {
-        scstr_t subs = scstrsubs(string, string.length-suffix.length);
-        return scstrcasecmp(subs, suffix) == 0;
-    }
-}
-
-sstr_t scstrlower(scstr_t string) {
-    sstr_t ret = sstrdup(string);
-    for (size_t i = 0; i < ret.length ; i++) {
-        ret.ptr[i] = tolower(ret.ptr[i]);
-    }
-    return ret;
-}
-
-sstr_t scstrlower_a(UcxAllocator *allocator, scstr_t string) {
-    sstr_t ret = sstrdup_a(allocator, string);
-    for (size_t i = 0; i < ret.length ; i++) {
-        ret.ptr[i] = tolower(ret.ptr[i]);
-    }
-    return ret;
-}
-
-sstr_t scstrupper(scstr_t string) {
-    sstr_t ret = sstrdup(string);
-    for (size_t i = 0; i < ret.length ; i++) {
-        ret.ptr[i] = toupper(ret.ptr[i]);
-    }
-    return ret;
-}
-
-sstr_t scstrupper_a(UcxAllocator *allocator, scstr_t string) {
-    sstr_t ret = sstrdup_a(allocator, string);
-    for (size_t i = 0; i < ret.length ; i++) {
-        ret.ptr[i] = toupper(ret.ptr[i]);
-    }
-    return ret;
-}
-
-#define REPLACE_INDEX_BUFFER_MAX 100
-
-struct scstrreplace_ibuf {
-    size_t* buf;
-    unsigned int len; /* small indices */
-    struct scstrreplace_ibuf* next;
-};
-
-static void scstrrepl_free_ibuf(struct scstrreplace_ibuf *buf) {
-    while (buf) {
-        struct scstrreplace_ibuf *next = buf->next;
-        free(buf->buf);
-        free(buf);
-        buf = next;
-    }
-}
-
-sstr_t scstrreplacen_a(UcxAllocator *allocator, scstr_t str,
-                     scstr_t pattern, scstr_t replacement, size_t replmax) {
-
-    if (pattern.length == 0 || pattern.length > str.length || replmax == 0)
-        return sstrdup(str);
-
-    /* Compute expected buffer length */
-    size_t ibufmax = str.length / pattern.length;
-    size_t ibuflen = replmax < ibufmax ? replmax : ibufmax;
-    if (ibuflen > REPLACE_INDEX_BUFFER_MAX) {
-        ibuflen = REPLACE_INDEX_BUFFER_MAX;
-    }
-
-    /* Allocate first index buffer */
-    struct scstrreplace_ibuf *firstbuf, *curbuf;
-    firstbuf = curbuf = calloc(1, sizeof(struct scstrreplace_ibuf));
-    if (!firstbuf) return sstrn(NULL, 0);
-    firstbuf->buf = calloc(ibuflen, sizeof(size_t));
-    if (!firstbuf->buf) {
-        free(firstbuf);
-        return sstrn(NULL, 0);
-    }
-
-    /* Search occurrences */
-    scstr_t searchstr = str;
-    size_t found = 0;
-    do {
-        scstr_t match = scstrscstr(searchstr, pattern);
-        if (match.length > 0) {
-            /* Allocate next buffer in chain, if required */
-            if (curbuf->len == ibuflen) {
-                struct scstrreplace_ibuf *nextbuf =
-                        calloc(1, sizeof(struct scstrreplace_ibuf));
-                if (!nextbuf) {
-                    scstrrepl_free_ibuf(firstbuf);
-                    return sstrn(NULL, 0);
-                }
-                nextbuf->buf = calloc(ibuflen, sizeof(size_t));
-                if (!nextbuf->buf) {
-                    free(nextbuf);
-                    scstrrepl_free_ibuf(firstbuf);
-                    return sstrn(NULL, 0);
-                }
-                curbuf->next = nextbuf;
-                curbuf = nextbuf;
-            }
-
-            /* Record match index */
-            found++;
-            size_t idx = match.ptr - str.ptr;
-            curbuf->buf[curbuf->len++] = idx;
-            searchstr.ptr = match.ptr + pattern.length;
-            searchstr.length = str.length - idx - pattern.length;
-        } else {
-            break;
-        }
-    } while (searchstr.length > 0 && found < replmax);
-
-    /* Allocate result string */
-    sstr_t result;
-    {
-        ssize_t adjlen = (ssize_t) replacement.length - (ssize_t) pattern.length;
-        size_t rcount = 0;
-        curbuf = firstbuf;
-        do {
-            rcount += curbuf->len;
-            curbuf = curbuf->next;
-        } while (curbuf);
-        result.length = str.length + rcount * adjlen;
-        result.ptr = almalloc(allocator, result.length);
-        if (!result.ptr) {
-            scstrrepl_free_ibuf(firstbuf);
-            return sstrn(NULL, 0);
-        }
-    }
-
-    /* Build result string */
-    curbuf = firstbuf;
-    size_t srcidx = 0;
-    char* destptr = result.ptr;
-    do {
-        for (size_t i = 0; i < curbuf->len; i++) {
-            /* Copy source part up to next match*/
-            size_t idx = curbuf->buf[i];
-            size_t srclen = idx - srcidx;
-            if (srclen > 0) {
-                memcpy(destptr, str.ptr+srcidx, srclen);
-                destptr += srclen;
-                srcidx += srclen;
-            }
-
-            /* Copy the replacement and skip the source pattern */
-            srcidx += pattern.length;
-            memcpy(destptr, replacement.ptr, replacement.length);
-            destptr += replacement.length;
-        }
-        curbuf = curbuf->next;
-    } while (curbuf);
-    memcpy(destptr, str.ptr+srcidx, str.length-srcidx);
-
-    /* Free index buffer */
-    scstrrepl_free_ibuf(firstbuf);
-
-    return result;
-}
-
-sstr_t scstrreplacen(scstr_t str, scstr_t pattern,
-        scstr_t replacement, size_t replmax) {
-    return scstrreplacen_a(ucx_default_allocator(),
-            str, pattern, replacement, replmax);
-}
-
-
-// type adjustment functions
-scstr_t ucx_sc2sc(scstr_t str) {
-    return str;
-}
-scstr_t ucx_ss2sc(sstr_t str) {
-    scstr_t cs;
-    cs.ptr = str.ptr;
-    cs.length = str.length;
-    return cs;
-}
-scstr_t ucx_ss2c_s(scstr_t c) {
-    return c;
-}
--- a/src/test.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,91 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "ucx/test.h"
-
-UcxTestSuite* ucx_test_suite_new() {
-    UcxTestSuite* suite = (UcxTestSuite*) malloc(sizeof(UcxTestSuite));
-    if (suite != NULL) {
-        suite->success = 0;
-        suite->failure = 0;
-        suite->tests = NULL;
-    }
-
-    return suite;
-}
-
-void ucx_test_suite_free(UcxTestSuite* suite) {
-    UcxTestList *l = suite->tests;
-    while (l != NULL) {
-        UcxTestList *e = l;
-        l = l->next;
-        free(e);
-    }
-    free(suite);
-}
-
-int ucx_test_register(UcxTestSuite* suite, UcxTest test) {
-    if (suite->tests) {
-        UcxTestList *newelem = (UcxTestList*) malloc(sizeof(UcxTestList));
-        if (newelem) {
-            newelem->test = test;
-            newelem->next = NULL;
-            
-            UcxTestList *last = suite->tests;
-            while (last->next) {
-                last = last->next;
-            }
-            last->next = newelem;
-            
-            return EXIT_SUCCESS;
-        } else {
-            return EXIT_FAILURE;
-        }
-    } else {
-        suite->tests = (UcxTestList*) malloc(sizeof(UcxTestList));
-        if (suite->tests) {
-            suite->tests->test = test;
-            suite->tests->next = NULL;
-            
-            return EXIT_SUCCESS;
-        } else {
-            return EXIT_FAILURE;
-        }
-    }
-}
-
-void ucx_test_run(UcxTestSuite* suite, FILE* output) {
-    suite->success = 0;
-    suite->failure = 0;
-    for (UcxTestList* elem = suite->tests ; elem ; elem = elem->next) {
-        elem->test(suite, output);
-    }
-    fwrite("\nAll test completed.\n", 1, 21, output);
-    fprintf(output, "  Total:   %u\n  Success: %u\n  Failure: %u\n",
-            suite->success+suite->failure, suite->success, suite->failure);
-}
--- a/src/ucx.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-/**
- * @mainpage UAP Common Extensions
- * Library with common and useful functions, macros and data structures.
- * <p>
- * Latest available source:<br>
- * <a href="https://sourceforge.net/projects/ucx/files/">
- * https://sourceforge.net/projects/ucx/files/</a>
- * </p>
- * 
- * <p>
- * Repositories:<br>
- * <a href="https://sourceforge.net/p/ucx/code">
- * https://sourceforge.net/p/ucx/code</a>
- * -&nbsp;or&nbsp;-
- * <a href="https://develop.uap-core.de/hg/ucx">
- * https://develop.uap-core.de/hg/ucx</a>
- * </p>
- * 
- * <h2>LICENCE</h2>
- * 
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "ucx/ucx.h"
-
-int ucx_szmul_impl(size_t a, size_t b, size_t *result) {
-    if(a == 0 || b == 0) {
-        *result = 0;
-        return 0;
-    }
-    size_t r = a * b;
-    if(r / b == a) {
-        *result = r;
-        return 0;
-    } else {
-        *result = 0;
-        return 1;
-    }
-}
-
--- a/src/ucx/allocator.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,206 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-/**
- * Allocator for custom memory management.
- * 
- * A UCX allocator consists of a pointer to the memory area / pool and four
- * function pointers to memory management functions operating on this memory
- * area / pool. These functions shall behave equivalent to the standard libc
- * functions <code>malloc(), calloc(), realloc()</code> and <code>free()</code>.
- * 
- * The signature of the memory management functions is based on the signature
- * of the respective libc function but each of them takes the pointer to the
- * memory area / pool as first argument.
- * 
- * As the pointer to the memory area / pool can be arbitrarily chosen, any data
- * can be provided to the memory management functions. A UcxMempool is just
- * one example.
- * 
- * @see mempool.h
- * @see UcxMap
- * 
- * @file   allocator.h
- * @author Mike Becker
- * @author Olaf Wintermann
- */
-
-#ifndef UCX_ALLOCATOR_H
-#define	UCX_ALLOCATOR_H
-
-#include "ucx.h"
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-/**
- * A function pointer to the allocators <code>malloc()</code> function.
- * @see UcxAllocator
- */
-typedef void*(*ucx_allocator_malloc)(void *pool, size_t n);
-
-/**
- * A function pointer to the allocators <code>calloc()</code> function.
- * @see UcxAllocator
- */
-typedef void*(*ucx_allocator_calloc)(void *pool, size_t n, size_t size);
-
-/**
- * A function pointer to the allocators <code>realloc()</code> function.
- * @see UcxAllocator
- */
-typedef void*(*ucx_allocator_realloc)(void *pool, void *data, size_t n);
-
-/**
- * A function pointer to the allocators <code>free()</code> function.
- * @see UcxAllocator
- */
-typedef void(*ucx_allocator_free)(void *pool, void *data);
-
-/**
- * UCX allocator data structure containing memory management functions.
- */
-typedef struct {
-    /** Pointer to an area of memory or a complex memory pool.
-     * This pointer will be passed to any memory management function as first
-     * argument.
-     */
-    void *pool;
-    /**
-     * The <code>malloc()</code> function for this allocator.
-     */
-    ucx_allocator_malloc  malloc;
-    /**
-     * The <code>calloc()</code> function for this allocator.
-     */
-    ucx_allocator_calloc  calloc;
-    /**
-     * The <code>realloc()</code> function for this allocator.
-     */
-    ucx_allocator_realloc realloc;
-    /**
-     * The <code>free()</code> function for this allocator.
-     */
-    ucx_allocator_free    free;
-} UcxAllocator;
-
-/**
- * Returns a pointer to the default allocator.
- * 
- * The default allocator contains wrappers to the standard libc memory
- * management functions. Use this function to get a pointer to a globally
- * available allocator. You may also define an own UcxAllocator by assigning
- * #UCX_ALLOCATOR_DEFAULT to a variable and pass the address of this variable
- * to any function that takes a UcxAllocator as argument. Note that using
- * this function is the recommended way of passing a default allocator, thus
- * it never runs out of scope.
- * 
- * @return a pointer to the default allocator
- * 
- * @see UCX_ALLOCATOR_DEFAULT
- */
-UcxAllocator *ucx_default_allocator();
-
-/**
- * A wrapper for the standard libc <code>malloc()</code> function.
- * @param ignore ignored (may be used by allocators for pooled memory)
- * @param n argument passed to <code>malloc()</code>
- * @return return value of <code>malloc()</code>
- */
-void *ucx_default_malloc(void *ignore, size_t n);
-/**
- * A wrapper for the standard libc <code>calloc()</code> function.
- * @param ignore ignored (may be used by allocators for pooled memory)
- * @param n argument passed to <code>calloc()</code>
- * @param size  argument passed to <code>calloc()</code>
- * @return return value of <code>calloc()</code>
- */
-void *ucx_default_calloc(void *ignore, size_t n, size_t size);
-/**
- * A wrapper for the standard libc <code>realloc()</code> function.
- * @param ignore ignored (may be used by allocators for pooled memory)
- * @param data argumend passed to <code>realloc()</code>
- * @param n argument passed to <code>realloc()</code>
- * @return return value of <code>realloc()</code>
- */
-void *ucx_default_realloc(void *ignore, void *data, size_t n);
-/**
- * A wrapper for the standard libc <code>free()</code> function.
- * @param ignore ignored (may be used by allocators for pooled memory)
- * @param data argument passed to <code>free()</code>
- */
-void ucx_default_free(void *ignore, void *data);
-
-/**
- * Shorthand for calling an allocators malloc function.
- * @param allocator the allocator to use
- * @param n size of space to allocate
- * @return a pointer to the allocated memory area
- */
-#define almalloc(allocator, n) ((allocator)->malloc((allocator)->pool, n))
-
-/**
- * Shorthand for calling an allocators calloc function.
- * @param allocator the allocator to use
- * @param n the count of elements the space should be allocated for
- * @param size the size of each element
- * @return a pointer to the allocated memory area
- */
-#define alcalloc(allocator, n, size) \
-        ((allocator)->calloc((allocator)->pool, n, size))
-
-/**
- * Shorthand for calling an allocators realloc function.
- * @param allocator the allocator to use
- * @param ptr the pointer to the memory area that shall be reallocated
- * @param n the new size of the allocated memory area
- * @return a pointer to the reallocated memory area
- */
-#define alrealloc(allocator, ptr, n) \
-        ((allocator)->realloc((allocator)->pool, ptr, n))
-
-/**
- * Shorthand for calling an allocators free function.
- * @param allocator the allocator to use
- * @param ptr the pointer to the memory area that shall be freed
- */
-#define alfree(allocator, ptr) ((allocator)->free((allocator)->pool, ptr))
-
-/**
- * Convenient macro for a default allocator <code>struct</code> definition.
- */
-#define UCX_ALLOCATOR_DEFAULT {NULL, \
-        ucx_default_malloc, ucx_default_calloc, ucx_default_realloc, \
-        ucx_default_free }
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* UCX_ALLOCATOR_H */
-
--- a/src/ucx/array.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,460 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2019 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-/**
- * Dynamically allocated array implementation.
- * 
- * @file   array.h
- * @author Mike Becker
- * @author Olaf Wintermann
- */
-
-#ifndef UCX_ARRAY_H
-#define	UCX_ARRAY_H
-
-#include "ucx.h"
-#include "allocator.h"
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-/**
- * UCX array type.
- */
-typedef struct {
-    /**
-     * The current capacity of the array.
-     */
-    size_t capacity;
-    /**
-     * The actual number of elements in the array.
-     */
-    size_t size;
-    /**
-     * The size of an individual element in bytes.
-     */
-    size_t elemsize;
-    /**
-     * A pointer to the data.
-     */
-    void* data;
-    /**
-     * The allocator used for the data.
-     */
-    UcxAllocator* allocator;
-} UcxArray;
-
-/**
- * Sets an element in an arbitrary user defined array.
- * The data is copied from the specified data location.
- * 
- * If the capacity is insufficient, the array is automatically reallocated and
- * the possibly new pointer is stored in the <code>array</code> argument.
- * 
- * On reallocation the capacity of the array is doubled until it is sufficient.
- * The new capacity is stored back to <code>capacity</code>.
- *  
- * @param array a pointer to location of the array pointer
- * @param capacity a pointer to the capacity
- * @param elmsize the size of each element
- * @param idx the index of the element to set
- * @param data a pointer to the element data
- * @return zero on success or non-zero on error (errno will be set)
- */
-#define ucx_array_util_set(array, capacity, elmsize, idx, data) \
-    ucx_array_util_set_a(ucx_default_allocator(), (void**)(array), capacity, \
-                         elmsize, idx, data)
-
-/**
- * Sets an element in an arbitrary user defined array.
- * The data is copied from the specified data location.
- * 
- * If the capacity is insufficient, the array is automatically reallocated
- * using the specified allocator and the possibly new pointer is stored in
- * the <code>array</code> argument.
- * 
- * On reallocation the capacity of the array is doubled until it is sufficient.
- * The new capacity is stored back to <code>capacity</code>. 
- * 
- * @param alloc the allocator that shall be used to reallocate the array
- * @param array a pointer to location of the array pointer
- * @param capacity a pointer to the capacity
- * @param elmsize the size of each element
- * @param idx the index of the element to set
- * @param data a pointer to the element data
- * @return zero on success or non-zero on error (errno will be set)
- */
-int ucx_array_util_set_a(UcxAllocator* alloc, void** array, size_t* capacity,
-    size_t elmsize, size_t idx, void* data);
-
-/**
- * Stores a pointer in an arbitrary user defined array.
- * The element size of the array must be sizeof(void*).
- * 
- * If the capacity is insufficient, the array is automatically reallocated and
- * the possibly new pointer is stored in the <code>array</code> argument.
- * 
- * On reallocation the capacity of the array is doubled until it is sufficient.
- * The new capacity is stored back to <code>capacity</code>.
- *  
- * @param array a pointer to location of the array pointer
- * @param capacity a pointer to the capacity
- * @param idx the index of the element to set
- * @param ptr the pointer to store
- * @return zero on success or non-zero on error (errno will be set)
- */
-#define ucx_array_util_setptr(array, capacity, idx, ptr) \
-    ucx_array_util_setptr_a(ucx_default_allocator(), (void**)(array), \
-                            capacity, idx, ptr)
-
-/**
- * Stores a pointer in an arbitrary user defined array.
- * The element size of the array must be sizeof(void*).
- * 
- * If the capacity is insufficient, the array is automatically reallocated
- * using the specified allocator and the possibly new pointer is stored in
- * the <code>array</code> argument.
- * 
- * On reallocation the capacity of the array is doubled until it is sufficient.
- * The new capacity is stored back to <code>capacity</code>. 
- * 
- * @param alloc the allocator that shall be used to reallocate the array
- * @param array a pointer to location of the array pointer
- * @param capacity a pointer to the capacity
- * @param idx the index of the element to set
- * @param ptr the pointer to store
- * @return zero on success or non-zero on error (errno will be set)
- */
-int ucx_array_util_setptr_a(UcxAllocator* alloc, void** array, size_t* capacity,
-    size_t idx, void* ptr);
-
-
-/**
- * Creates a new UCX array with the given capacity and element size.
- * @param capacity the initial capacity
- * @param elemsize the element size
- * @return a pointer to a new UCX array structure
- */
-UcxArray* ucx_array_new(size_t capacity, size_t elemsize);
-
-/**
- * Creates a new UCX array using the specified allocator.
- * 
- * @param capacity the initial capacity
- * @param elemsize the element size
- * @param allocator the allocator to use
- * @return a pointer to new UCX array structure
- */
-UcxArray* ucx_array_new_a(size_t capacity, size_t elemsize,
-        UcxAllocator* allocator);
-
-/**
- * Initializes a UCX array structure with the given capacity and element size.
- * The structure must be uninitialized as the data pointer will be overwritten.
- * 
- * @param array the structure to initialize
- * @param capacity the initial capacity
- * @param elemsize the element size
- */
-void ucx_array_init(UcxArray* array, size_t capacity, size_t elemsize);
-
-/**
- * Initializes a UCX array structure using the specified allocator.
- * The structure must be uninitialized as the data pointer will be overwritten.
- * 
- * @param array the structure to initialize
- * @param capacity the initial capacity
- * @param elemsize the element size
- * @param allocator the allocator to use
- */
-void ucx_array_init_a(UcxArray* array, size_t capacity, size_t elemsize,
-        UcxAllocator* allocator);
-
-/**
- * Creates an shallow copy of an array.
- * 
- * This function clones the specified array by using memcpy().
- * If the destination capacity is insufficient, an automatic reallocation is
- * attempted.
- * 
- * Note: if the destination array is uninitialized, the behavior is undefined.
- * 
- * @param dest the array to copy to
- * @param src the array to copy from
- * @return zero on success, non-zero on reallocation failure.
- */
-int ucx_array_clone(UcxArray* dest, UcxArray const* src);
-
-
-/**
- * Compares two UCX arrays element-wise by using a compare function.
- *
- * Elements of the two specified arrays are compared by using the specified
- * compare function and the additional data. The type and content of this
- * additional data depends on the cmp_func() used.
- * 
- * This function always returns zero, if the element sizes of the arrays do
- * not match and performs no comparisons in this case.
- * 
- * @param array1 the first array
- * @param array2 the second array
- * @param cmpfnc the compare function
- * @param data additional data for the compare function
- * @return 1, if and only if the two arrays equal element-wise, 0 otherwise
- */
-int ucx_array_equals(UcxArray const *array1, UcxArray const *array2,
-        cmp_func cmpfnc, void* data);
-
-/**
- * Destroys the array.
- * 
- * The data is freed and both capacity and count are reset to zero.
- * If the array structure itself has been dynamically allocated, it has to be
- * freed separately.
- * 
- * @param array the array to destroy
- */
-void ucx_array_destroy(UcxArray *array);
-
-/**
- * Destroys and frees the array.
- * 
- * @param array the array to free
- */
-void ucx_array_free(UcxArray *array);
-
-/**
- * Inserts elements at the end of the array.
- * 
- * This is an O(1) operation.
- * The array will automatically grow, if the capacity is exceeded.
- * If a pointer to data is provided, the data is copied into the array with
- * memcpy(). Otherwise the new elements are completely zeroed.
- * 
- * @param array a pointer the array where to append the data
- * @param data a pointer to the data to insert (may be <code>NULL</code>)
- * @param count number of elements to copy from data (if data is
- * <code>NULL</code>, zeroed elements are appended)
- * @return zero on success, non-zero if a reallocation was necessary but failed
- * @see ucx_array_set_from()
- * @see ucx_array_append()
- */
-int ucx_array_append_from(UcxArray *array, void *data, size_t count);
-
-
-/**
- * Inserts elements at the beginning of the array.
- * 
- * This is an expensive operation, because the contents must be moved.
- * If there is no particular reason to prepend data, you should use
- * ucx_array_append_from() instead.
- * 
- * @param array a pointer the array where to prepend the data
- * @param data a pointer to the data to insert (may be <code>NULL</code>)
- * @param count number of elements to copy from data (if data is
- * <code>NULL</code>, zeroed elements are inserted)
- * @return zero on success, non-zero if a reallocation was necessary but failed
- * @see ucx_array_append_from()
- * @see ucx_array_set_from()
- * @see ucx_array_prepend()
- */
-int ucx_array_prepend_from(UcxArray *array, void *data, size_t count);
-
-
-/**
- * Sets elements starting at the specified index.
- * 
- * If the any index is out of bounds, the array automatically grows.
- * The pointer to the data may be NULL, in which case the elements are zeroed. 
- * 
- * @param array a pointer the array where to set the data
- * @param index the index of the element to set
- * @param data a pointer to the data to insert (may be <code>NULL</code>)
- * @param count number of elements to copy from data (if data is
- * <code>NULL</code>, the memory in the array is zeroed)
- * @return zero on success, non-zero if a reallocation was necessary but failed
- * @see ucx_array_append_from()
- * @see ucx_array_set()
- */
-int ucx_array_set_from(UcxArray *array, size_t index, void *data, size_t count);
-
-/**
- * Concatenates two arrays.
- * 
- * The contents of the second array are appended to the first array in one
- * single operation. The second array is otherwise left untouched.
- * 
- * The first array may grow automatically. If this fails, both arrays remain
- * unmodified.
- * 
- * @param array1 first array
- * @param array2 second array
- * @return zero on success, non-zero if reallocation was necessary but failed 
- * or the element size does not match
- */
-int ucx_array_concat(UcxArray *array1, const UcxArray *array2);
-
-/**
- * Returns a pointer to the array element at the specified index.
- * 
- * @param array the array to retrieve the element from
- * @param index index of the element to return
- * @return a pointer to the element at the specified index or <code>NULL</code>,
- * if the index is greater than the array size
- */
-void *ucx_array_at(UcxArray const* array, size_t index);
-
-/**
- * Returns the index of an element containing the specified data.
- *
- * This function uses a cmp_func() to compare the data of each list element
- * with the specified data. If no cmp_func is provided, memcmp() is used.
- * 
- * If the array contains the data more than once, the index of the first
- * occurrence is returned.
- * If the array does not contain the data, the size of array is returned.
- *  
- * @param array the array where to search for the data
- * @param elem the element data
- * @param cmpfnc the compare function
- * @param data additional data for the compare function
- * @return the index of the element containing the specified data or the size of
- * the array, if the data is not found in this array
- */
-size_t ucx_array_find(UcxArray const *array, void *elem,
-    cmp_func cmpfnc, void *data);
-
-/**
- * Checks, if an array contains a specific element.
- * 
- * An element is found, if ucx_array_find() returns a value less than the size.
- * 
- * @param array the array where to search for the data
- * @param elem the element data
- * @param cmpfnc the compare function
- * @param data additional data for the compare function
- * @return 1, if and only if the array contains the specified element data
- * @see ucx_array_find()
- */
-int ucx_array_contains(UcxArray const *array, void *elem,
-    cmp_func cmpfnc, void *data);
-
-/**
- * Sorts a UcxArray with the best available sort algorithm.
- * 
- * The qsort_r() function is used, if available (glibc, FreeBSD or MacOS).
- * The order of arguments is automatically adjusted for the FreeBSD and MacOS
- * version of qsort_r().
- * 
- * If qsort_r() is not available, a merge sort algorithm is used, which is
- * guaranteed to use no more additional memory than for exactly one element.
- * 
- * @param array the array to sort
- * @param cmpfnc the function that shall be used to compare the element data
- * @param data additional data for the cmp_func() or <code>NULL</code>
- */
-void ucx_array_sort(UcxArray* array, cmp_func cmpfnc, void *data);
-
-/**
- * Removes an element from the array.
- * 
- * This is in general an expensive operation, because several elements may
- * be moved. If the order of the elements is not relevant, use
- * ucx_array_remove_fast() instead.
- * 
- * @param array pointer to the array from which the element shall be removed
- * @param index the index of the element to remove
- */
-void ucx_array_remove(UcxArray *array, size_t index);
-
-/**
- * Removes an element from the array.
- * 
- * This is an O(1) operation, but does not maintain the order of the elements.
- * The last element in the array is moved to the location of the removed
- * element.
- * 
- * @param array pointer to the array from which the element shall be removed
- * @param index the index of the element to remove
- */
-void ucx_array_remove_fast(UcxArray *array, size_t index);
-
-/**
- * Shrinks the memory to exactly fit the contents.
- * 
- * After this operation, the capacity equals the size.
- * 
- * @param array a pointer to the array
- * @return zero on success, non-zero if reallocation failed
- */
-int ucx_array_shrink(UcxArray* array);
-
-/**
- * Sets the capacity of the array.
- * 
- * If the new capacity is smaller than the size of the array, the elements
- * are removed and the size is adjusted accordingly.
- * 
- * @param array a pointer to the array
- * @param capacity the new capacity
- * @return zero on success, non-zero if reallocation failed
- */
-int ucx_array_resize(UcxArray* array, size_t capacity);
-
-/**
- * Resizes the array only, if the capacity is insufficient.
- * 
- * If the requested capacity is smaller than the current capacity, this
- * function does nothing.
- * 
- * @param array a pointer to the array
- * @param capacity the guaranteed capacity
- * @return zero on success, non-zero if reallocation failed
- */
-int ucx_array_reserve(UcxArray* array, size_t capacity);
-
-/**
- * Resizes the capacity, if the specified number of elements would not fit.
- * 
- * A call to ucx_array_grow(array, count) is effectively the same as
- * ucx_array_reserve(array, array->size+count).
- * 
- * @param array a pointer to the array
- * @param count the number of elements that should additionally fit
- * into the array
- * @return zero on success, non-zero if reallocation failed
- */
-int ucx_array_grow(UcxArray* array, size_t count);
-
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* UCX_ARRAY_H */
-
--- a/src/ucx/avl.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,353 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-/**
- * @file avl.h
- * 
- * AVL tree implementation.
- * 
- * This binary search tree implementation allows average O(1) insertion and
- * removal of elements (excluding binary search time).
- * 
- * @author Mike Becker
- * @author Olaf Wintermann
- */
-
-#ifndef UCX_AVL_H
-#define UCX_AVL_H
-
-#include "ucx.h"
-#include "allocator.h"
-#include <inttypes.h>
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-/**
- * UCX AVL Node type.
- * 
- * @see UcxAVLNode
- */
-typedef struct UcxAVLNode UcxAVLNode;
-
-/**
- * UCX AVL Node.
- */
-struct UcxAVLNode {
-    /**
-     * The key for this node.
-     */
-    intptr_t key;
-    /**
-     * Data contained by this node.
-     */
-    void *value;
-    /**
-     * The height of this (sub)-tree.
-     */
-    size_t height;
-    /**
-     * Parent node.
-     */
-    UcxAVLNode *parent;
-    /**
-     * Root node of left subtree.
-     */
-    UcxAVLNode *left;
-    /**
-     * Root node of right subtree.
-     */
-    UcxAVLNode *right;
-};
-
-/**
- * UCX AVL Tree.
- */
-typedef struct {
-    /**
-     * The UcxAllocator that shall be used to manage the memory for node data.
-     */
-    UcxAllocator *allocator;
-    /**
-     * Root node of the tree.
-     */
-    UcxAVLNode *root;
-    /**
-     * Compare function that shall be used to compare the UcxAVLNode keys.
-     * @see UcxAVLNode.key
-     */
-    cmp_func cmpfunc;
-    /**
-     * Custom user data.
-     * This data will also be provided to the cmpfunc.
-     */
-    void *userdata;
-} UcxAVLTree;
-
-/**
- * Initializes a new UcxAVLTree with a default allocator.
- * 
- * @param cmpfunc the compare function that shall be used
- * @return a new UcxAVLTree object
- * @see ucx_avl_new_a()
- */
-UcxAVLTree *ucx_avl_new(cmp_func cmpfunc);
-
-/**
- * Initializes a new UcxAVLTree with the specified allocator.
- * 
- * The cmpfunc should be capable of comparing two keys within this AVL tree.
- * So if you want to use null terminated strings as keys, you could use the
- * ucx_cmp_str() function here.
- * 
- * @param cmpfunc the compare function that shall be used
- * @param allocator the UcxAllocator that shall be used
- * @return a new UcxAVLTree object
- */
-UcxAVLTree *ucx_avl_new_a(cmp_func cmpfunc, UcxAllocator *allocator);
-
-/**
- * Destroys a UcxAVLTree.
- * 
- * Note, that the contents are not automatically freed.
- * Use may use #ucx_avl_free_content() before calling this function.
- * 
- * @param tree the tree to destroy
- * @see ucx_avl_free_content()
- */
-void ucx_avl_free(UcxAVLTree *tree);
-
-/**
- * Frees the contents of a UcxAVLTree.
- * 
- * This is a convenience function that iterates over the tree and passes all
- * values to the specified destructor function.
- * 
- * If no destructor is specified (<code>NULL</code>), the free() function of
- * the tree's own allocator is used.
- * 
- * You must ensure, that it is valid to pass each value in the map to the same
- * destructor function.
- * 
- * You should free the entire tree afterwards, as the contents will be invalid.
- * 
- * @param tree for which the contents shall be freed
- * @param destr optional pointer to a destructor function
- * @see ucx_avl_free()
- */
-void ucx_avl_free_content(UcxAVLTree *tree, ucx_destructor destr);
-
-/**
- * Macro for initializing a new UcxAVLTree with the default allocator and a
- * ucx_cmp_ptr() compare function.
- * 
- * @return a new default UcxAVLTree object
- */
-#define ucx_avl_default_new() \
-    ucx_avl_new_a(ucx_cmp_ptr, ucx_default_allocator())
-
-/**
- * Gets the node from the tree, that is associated with the specified key.
- * @param tree the UcxAVLTree
- * @param key the key
- * @return the node (or <code>NULL</code>, if the key is not present)
- */
-UcxAVLNode *ucx_avl_get_node(UcxAVLTree *tree, intptr_t key);
-
-/**
- * Gets the value from the tree, that is associated with the specified key.
- * @param tree the UcxAVLTree
- * @param key the key
- * @return the value (or <code>NULL</code>, if the key is not present)
- */
-void *ucx_avl_get(UcxAVLTree *tree, intptr_t key);
-
-/**
- * A mode for #ucx_avl_find_node() with the same behavior as
- * #ucx_avl_get_node().
- */
-#define UCX_AVL_FIND_EXACT         0
-/**
- * A mode for #ucx_avl_find_node() finding the node whose key is at least
- * as large as the specified key.
- */
-#define UCX_AVL_FIND_LOWER_BOUNDED 1
-/**
- * A mode for #ucx_avl_find_node() finding the node whose key is at most
- * as large as the specified key.
- */
-#define UCX_AVL_FIND_UPPER_BOUNDED 2
-/**
- * A mode for #ucx_avl_find_node() finding the node with a key that is as close
- * to the specified key as possible. If the key is present, the behavior is
- * like #ucx_avl_get_node(). This mode only returns <code>NULL</code> on
- * empty trees.
- */
-#define UCX_AVL_FIND_CLOSEST       3
-
-/**
- * Finds a node within the tree. The following modes are supported:
- * <ul>
- * <li>#UCX_AVL_FIND_EXACT: the same behavior as #ucx_avl_get_node()</li>
- * <li>#UCX_AVL_FIND_LOWER_BOUNDED: finds the node whose key is at least
- * as large as the specified key</li>
- * <li>#UCX_AVL_FIND_UPPER_BOUNDED: finds the node whose key is at most
- * as large as the specified key</li>
- * <li>#UCX_AVL_FIND_CLOSEST: finds the node with a key that is as close to
- * the specified key as possible. If the key is present, the behavior is
- * like #ucx_avl_get_node(). This mode only returns <code>NULL</code> on
- * empty trees.</li> 
- * </ul>
- * 
- * The distance function provided MUST agree with the compare function of
- * the AVL tree.
- * 
- * @param tree the UcxAVLTree
- * @param key the key
- * @param dfnc the distance function
- * @param mode the find mode
- * @return the node (or <code>NULL</code>, if no node can be found)
- */
-UcxAVLNode *ucx_avl_find_node(UcxAVLTree *tree, intptr_t key,
-        distance_func dfnc, int mode);
-
-/**
- * Finds a value within the tree.
- * See #ucx_avl_find_node() for details.
- * 
- * @param tree the UcxAVLTree
- * @param key the key
- * @param dfnc the distance function
- * @param mode the find mode
- * @return the value (or <code>NULL</code>, if no value can be found)
- */
-void *ucx_avl_find(UcxAVLTree *tree, intptr_t key,
-        distance_func dfnc, int mode);
-
-/**
- * Puts a key/value pair into the tree.
- * 
- * Attention: use this function only, if a possible old value does not need
- * to be preserved.
- * 
- * @param tree the UcxAVLTree
- * @param key the key
- * @param value the new value
- * @return zero, if and only if the operation succeeded
- */
-int ucx_avl_put(UcxAVLTree *tree, intptr_t key, void *value);
-
-/**
- * Puts a key/value pair into the tree.
- * 
- * This is a secure function which saves the old value to the variable pointed
- * at by oldvalue.
- * 
- * @param tree the UcxAVLTree
- * @param key the key
- * @param value the new value
- * @param oldvalue optional: a pointer to the location where a possible old
- * value shall be stored
- * @return zero, if and only if the operation succeeded
- */
-int ucx_avl_put_s(UcxAVLTree *tree, intptr_t key, void *value, void **oldvalue);
-
-/**
- * Removes a node from the AVL tree.
- * 
- * Note: the specified node is logically removed. The tree implementation
- * decides which memory area is freed. In most cases the here provided node
- * is freed, so its further use is generally undefined.
- * 
- * @param tree the UcxAVLTree
- * @param node the node to remove
- * @return zero, if and only if an element has been removed
- */
-int ucx_avl_remove_node(UcxAVLTree *tree, UcxAVLNode *node);
-
-/**
- * Removes an element from the AVL tree.
- * 
- * @param tree the UcxAVLTree
- * @param key the key
- * @return zero, if and only if an element has been removed
- */
-int ucx_avl_remove(UcxAVLTree *tree, intptr_t key);
-
-/**
- * Removes an element from the AVL tree.
- * 
- * This is a secure function which saves the old key and value data from node
- * to the variables at the location of oldkey and oldvalue (if specified), so
- * they can be freed afterwards (if necessary).
- * 
- * Note: the returned key in oldkey is possibly not the same as the provided
- * key for the lookup (in terms of memory location).
- * 
- * @param tree the UcxAVLTree
- * @param key the key of the element to remove
- * @param oldkey optional: a pointer to the location where the old key shall be
- * stored
- * @param oldvalue optional: a pointer to the location where the old value
- * shall be stored
- * @return zero, if and only if an element has been removed
- */
-int ucx_avl_remove_s(UcxAVLTree *tree, intptr_t key,
-        intptr_t *oldkey, void **oldvalue);
-
-/**
- * Counts the nodes in the specified UcxAVLTree.
- * @param tree the AVL tree
- * @return the node count
- */
-size_t ucx_avl_count(UcxAVLTree *tree);
-
-/**
- * Finds the in-order predecessor of the given node.
- * @param node an AVL node
- * @return the in-order predecessor of the given node, or <code>NULL</code> if
- * the given node is the in-order minimum
- */
-UcxAVLNode* ucx_avl_pred(UcxAVLNode* node);
-
-/**
- * Finds the in-order successor of the given node.
- * @param node an AVL node
- * @return the in-order successor of the given node, or <code>NULL</code> if
- * the given node is the in-order maximum
- */
-UcxAVLNode* ucx_avl_succ(UcxAVLNode* node);
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* UCX_AVL_H */
-
--- a/src/ucx/buffer.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,339 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * @file buffer.h
- * 
- * Advanced buffer implementation.
- * 
- * Instances of UcxBuffer can be used to read from or to write to like one
- * would do with a stream. This allows the use of ucx_stream_copy() to copy
- * contents from one buffer to another.
- * 
- * Some features for convenient use of the buffer
- * can be enabled. See the documentation of the macro constants for more
- * information.
- * 
- * @author Mike Becker
- * @author Olaf Wintermann
- */
-
-#ifndef UCX_BUFFER_H
-#define	UCX_BUFFER_H
-
-#include "ucx.h"
-#include <sys/types.h>
-#include <stdio.h>
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-/**
- * No buffer features enabled (all flags cleared).
- */
-#define UCX_BUFFER_DEFAULT      0x00
-
-/**
- * If this flag is enabled, the buffer will automatically free its contents.
- */
-#define UCX_BUFFER_AUTOFREE     0x01
-
-/**
- * If this flag is enabled, the buffer will automatically extends its capacity.
- */
-#define UCX_BUFFER_AUTOEXTEND   0x02
-
-/** UCX Buffer. */
-typedef struct {
-    /** A pointer to the buffer contents. */
-    char *space;
-    /** Current position of the buffer. */
-    size_t pos;
-    /** Current capacity (i.e. maximum size) of the buffer. */
-    size_t capacity;
-    /** Current size of the buffer content. */
-    size_t size;
-    /**
-     * Flag register for buffer features.
-     * @see #UCX_BUFFER_DEFAULT
-     * @see #UCX_BUFFER_AUTOFREE
-     * @see #UCX_BUFFER_AUTOEXTEND
-     */
-    int flags;
-} UcxBuffer;
-
-/**
- * Creates a new buffer.
- * 
- * <b>Note:</b> you may provide <code>NULL</code> as argument for
- * <code>space</code>. Then this function will allocate the space and enforce
- * the #UCX_BUFFER_AUTOFREE flag.
- * 
- * @param space pointer to the memory area, or <code>NULL</code> to allocate
- * new memory
- * @param capacity the capacity of the buffer
- * @param flags buffer features (see UcxBuffer.flags)
- * @return the new buffer
- */
-UcxBuffer *ucx_buffer_new(void *space, size_t capacity, int flags);
-
-/**
- * Destroys a buffer.
- * 
- * If the #UCX_BUFFER_AUTOFREE feature is enabled, the contents of the buffer
- * are also freed.
- * 
- * @param buffer the buffer to destroy
- */
-void ucx_buffer_free(UcxBuffer* buffer);
-
-/**
- * Creates a new buffer and fills it with extracted content from another buffer.
- * 
- * <b>Note:</b> the #UCX_BUFFER_AUTOFREE feature is enforced for the new buffer.
- * 
- * @param src the source buffer
- * @param start the start position of extraction
- * @param length the count of bytes to extract (must not be zero)
- * @param flags feature mask for the new buffer
- * @return a new buffer containing the extraction
- */
-UcxBuffer* ucx_buffer_extract(UcxBuffer *src,
-        size_t start, size_t length, int flags);
-
-/**
- * A shorthand macro for the full extraction of the buffer.
- * 
- * @param src the source buffer
- * @param flags feature mask for the new buffer
- * @return a new buffer with the extracted content
- */
-#define ucx_buffer_clone(src,flags) \
-    ucx_buffer_extract(src, 0, (src)->capacity, flags)
-
-
-/**
- * Shifts the contents of the buffer by the given offset.
- * 
- * If the offset is positive, the contents are shifted to the right.
- * If auto extension is enabled, the buffer grows, if necessary.
- * In case the auto extension fails, this function returns a non-zero value and
- * no contents are changed.
- * If auto extension is disabled, the contents that do not fit into the buffer
- * are discarded.
- * 
- * If the offset is negative, the contents are shifted to the left where the
- * first <code>shift</code> bytes are discarded.
- * The new size of the buffer is the old size minus
- * the absolute shift value.
- * If this value is larger than the buffer size, the buffer is emptied (but
- * not cleared, see the security note below).
- * 
- * The buffer position gets shifted alongside with the content but is kept
- * within the boundaries of the buffer.
- * 
- * <b>Security note:</b> the shifting operation does <em>not</em> erase the
- * previously occupied memory cells. You can easily do that manually, e.g. by
- * calling <code>memset(buffer->space, 0, shift)</code> for a right shift or
- * <code>memset(buffer->size, 0, buffer->capacity-buffer->size)</code>
- * for a left shift.
- * 
- * @param buffer the buffer
- * @param shift the shift offset (negative means left shift)
- * @return 0 on success, non-zero if a required auto-extension fails
- */
-int ucx_buffer_shift(UcxBuffer* buffer, off_t shift);
-
-/**
- * Shifts the buffer to the right.
- * See ucx_buffer_shift() for details.
- * 
- * @param buffer the buffer
- * @param shift the shift offset
- * @return 0 on success, non-zero if a required auto-extension fails
- * @see ucx_buffer_shift()
- */
-int ucx_buffer_shift_right(UcxBuffer* buffer, size_t shift);
-
-/**
- * Shifts the buffer to the left.
- * 
- * See ucx_buffer_shift() for details. Note, however, that this method expects
- * a positive shift offset.
- * 
- * Since a left shift cannot fail due to memory allocation problems, this
- * function always returns zero.
- * 
- * @param buffer the buffer
- * @param shift the shift offset
- * @return always zero
- * @see ucx_buffer_shift()
- */
-int ucx_buffer_shift_left(UcxBuffer* buffer, size_t shift);
-
-
-/**
- * Moves the position of the buffer.
- * 
- * The new position is relative to the <code>whence</code> argument.
- *
- * SEEK_SET marks the start of the buffer.
- * SEEK_CUR marks the current position.
- * SEEK_END marks the end of the buffer.
- * 
- * With an offset of zero, this function sets the buffer position to zero
- * (SEEK_SET), the buffer size (SEEK_END) or leaves the buffer position
- * unchanged (SEEK_CUR).
- * 
- * @param buffer
- * @param offset position offset relative to <code>whence</code>
- * @param whence one of SEEK_SET, SEEK_CUR or SEEK_END
- * @return 0 on success, non-zero if the position is invalid
- *
- */
-int ucx_buffer_seek(UcxBuffer *buffer, off_t offset, int whence);
-
-/**
- * Clears the buffer by resetting the position and deleting the data.
- * 
- * The data is deleted by a zeroing it with call to <code>memset()</code>.
- * 
- * @param buffer the buffer to be cleared
- */
-#define ucx_buffer_clear(buffer) memset((buffer)->space, 0, (buffer)->size); \
-        (buffer)->size = 0; (buffer)->pos = 0;
-
-/**
- * Tests, if the buffer position has exceeded the buffer capacity.
- * 
- * @param buffer the buffer to test
- * @return non-zero, if the current buffer position has exceeded the last
- * available byte of the buffer.
- */
-int ucx_buffer_eof(UcxBuffer *buffer);
-
-
-/**
- * Extends the capacity of the buffer.
- * 
- * <b>Note:</b> The buffer capacity increased by a power of two. I.e.
- * the buffer capacity is doubled, as long as it would not hold the current
- * content plus the additional required bytes.
- * 
- * <b>Attention:</b> the argument provided is the number of <i>additional</i>
- * bytes the buffer shall hold. It is <b>NOT</b> the total number of bytes the
- * buffer shall hold.
- * 
- * @param buffer the buffer to extend
- * @param additional_bytes the number of additional bytes the buffer shall
- * <i>at least</i> hold
- * @return 0 on success or a non-zero value on failure
- */
-int ucx_buffer_extend(UcxBuffer *buffer, size_t additional_bytes);
-
-/**
- * Writes data to a UcxBuffer.
- * 
- * The position of the buffer is increased by the number of bytes written.
- * 
- * @param ptr a pointer to the memory area containing the bytes to be written
- * @param size the length of one element
- * @param nitems the element count
- * @param buffer the UcxBuffer to write to
- * @return the total count of bytes written
- */
-size_t ucx_buffer_write(const void *ptr, size_t size, size_t nitems,
-        UcxBuffer *buffer);
-
-/**
- * Reads data from a UcxBuffer.
- * 
- * The position of the buffer is increased by the number of bytes read.
- * 
- * @param ptr a pointer to the memory area where to store the read data
- * @param size the length of one element
- * @param nitems the element count
- * @param buffer the UcxBuffer to read from
- * @return the total number of elements read
- */
-size_t ucx_buffer_read(void *ptr, size_t size, size_t nitems,
-        UcxBuffer *buffer);
-
-/**
- * Writes a character to a buffer.
- * 
- * The least significant byte of the argument is written to the buffer. If the
- * end of the buffer is reached and #UCX_BUFFER_AUTOEXTEND feature is enabled,
- * the buffer capacity is extended by ucx_buffer_extend(). If the feature is
- * disabled or buffer extension fails, <code>EOF</code> is returned.
- * 
- * On successful write the position of the buffer is increased.
- * 
- * @param buffer the buffer to write to
- * @param c the character to write as <code>int</code> value
- * @return the byte that has bean written as <code>int</code> value or
- * <code>EOF</code> when the end of the stream is reached and automatic
- * extension is not enabled or not possible
- */
-int ucx_buffer_putc(UcxBuffer *buffer, int c);
-
-/**
- * Gets a character from a buffer.
- * 
- * The current position of the buffer is increased after a successful read.
- * 
- * @param buffer the buffer to read from
- * @return the character as <code>int</code> value or <code>EOF</code>, if the
- * end of the buffer is reached
- */
-int ucx_buffer_getc(UcxBuffer *buffer);
-
-/**
- * Writes a string to a buffer.
- * 
- * @param buffer the buffer
- * @param str the string
- * @return the number of bytes written
- */
-size_t ucx_buffer_puts(UcxBuffer *buffer, const char *str);
-
-/**
- * Returns the complete buffer content as sstr_t.
- * @param buffer the buffer
- * @return the result of <code>sstrn()</code> with the buffer space and size
- * as arguments
- */
-#define ucx_buffer_to_sstr(buffer) sstrn((buffer)->space, (buffer)->size)
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* UCX_BUFFER_H */
-
--- a/src/ucx/list.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,512 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-/**
- * Doubly linked list implementation.
- * 
- * @file   list.h
- * @author Mike Becker
- * @author Olaf Wintermann
- */
-
-#ifndef UCX_LIST_H
-#define	UCX_LIST_H
-
-#include "ucx.h"
-#include "allocator.h"
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-/**
- * Loop statement for UCX lists.
- * 
- * The first argument is the name of the iteration variable. The scope of
- * this variable is limited to the <code>UCX_FOREACH</code> statement.
- * 
- * The second argument is a pointer to the list. In most cases this will be the
- * pointer to the first element of the list, but it may also be an arbitrary
- * element of the list. The iteration will then start with that element.
- * 
- * @param list The first element of the list
- * @param elem The variable name of the element
- */
-#define UCX_FOREACH(elem,list) \
-        for (UcxList* elem = (UcxList*) list ; elem != NULL ; elem = elem->next)
-
-/**
- * UCX list type.
- * @see UcxList
- */
-typedef struct UcxList UcxList;
-
-/**
- * UCX list structure.
- */
-struct UcxList {
-    /**
-     * List element payload.
-     */
-    void    *data;
-    /**
-     * Pointer to the next list element or <code>NULL</code>, if this is the
-     * last element.
-     */
-    UcxList *next;
-    /**
-     * Pointer to the previous list element or <code>NULL</code>, if this is
-     * the first element.
-     */
-    UcxList *prev;
-};
-
-/**
- * Creates an element-wise copy of a list.
- * 
- * This function clones the specified list by creating new list elements and
- * copying the data with the specified copy_func(). If no copy_func() is
- * specified, a shallow copy is created and the new list will reference the
- * same data as the source list.
- * 
- * @param list the list to copy
- * @param cpyfnc a pointer to the function that shall copy an element (may be
- * <code>NULL</code>)
- * @param data additional data for the copy_func()
- * @return a pointer to the copy
- */
-UcxList *ucx_list_clone(const UcxList *list, copy_func cpyfnc, void* data);
-
-/**
- * Creates an element-wise copy of a list using a UcxAllocator.
- * 
- * See ucx_list_clone() for details.
- * 
- * You might want to pass the allocator via the <code>data</code> parameter,
- * to access it within the copy function for making deep copies.
- * 
- * @param allocator the allocator to use
- * @param list the list to copy
- * @param cpyfnc a pointer to the function that shall copy an element (may be
- * <code>NULL</code>)
- * @param data additional data for the copy_func()
- * @return a pointer to the copy
- * @see ucx_list_clone()
- */
-UcxList *ucx_list_clone_a(UcxAllocator *allocator, const UcxList *list,
-        copy_func cpyfnc, void* data);
-
-/**
- * Compares two UCX lists element-wise by using a compare function.
- * 
- * Each element of the two specified lists are compared by using the specified
- * compare function and the additional data. The type and content of this
- * additional data depends on the cmp_func() used.
- * 
- * If the list pointers denote elements within a list, the lists are compared
- * starting with the denoted elements. Thus any previous elements are not taken
- * into account. This might be useful to check, if certain list tails match
- * each other.
- * 
- * @param list1 the first list
- * @param list2 the second list
- * @param cmpfnc the compare function
- * @param data additional data for the compare function
- * @return 1, if and only if the two lists equal element-wise, 0 otherwise
- */
-int ucx_list_equals(const UcxList *list1, const UcxList *list2,
-        cmp_func cmpfnc, void* data);
-
-/**
- * Destroys the entire list.
- * 
- * The members of the list are not automatically freed, so ensure they are
- * otherwise referenced or destroyed by ucx_list_free_contents().
- * Otherwise, a memory leak is likely to occur.
- * 
- * <b>Caution:</b> the argument <b>MUST</b> denote an entire list (i.e. a call
- * to ucx_list_first() on the argument must return the argument itself)
- * 
- * @param list the list to free
- * @see ucx_list_free_contents()
- */
-void ucx_list_free(UcxList *list);
-
-/**
- * Destroys the entire list using a UcxAllocator.
- * 
- * See ucx_list_free() for details.
- * 
- * @param allocator the allocator to use
- * @param list the list to free
- * @see ucx_list_free()
- */
-void ucx_list_free_a(UcxAllocator *allocator, UcxList *list);
-
-/**
- * Destroys the contents of the specified list by calling the specified
- * destructor on each of them.
- * 
- * Note, that the contents are not usable afterwards and the list should be
- * destroyed with ucx_list_free().
- *
- * If no destructor is specified (<code>NULL</code>), stdlib's free() is used.
- * 
- * @param list the list for which the contents shall be freed
- * @param destr optional destructor function
- * @see ucx_list_free()
- */
-void ucx_list_free_content(UcxList* list, ucx_destructor destr);
-
-
-/**
- * Inserts an element at the end of the list.
- * 
- * This is generally an O(n) operation, as the end of the list is retrieved with
- * ucx_list_last().
- * 
- * @param list the list where to append the data, or <code>NULL</code> to
- * create a new list
- * @param data the data to insert
- * @return <code>list</code>, if it is not <code>NULL</code> or a pointer to
- * the newly created list otherwise
- */
-UcxList *ucx_list_append(UcxList *list, void *data);
-
-/**
- * Inserts an element at the end of the list using a UcxAllocator.
- * 
- * See ucx_list_append() for details.
- * 
- * @param allocator the allocator to use
- * @param list the list where to append the data, or <code>NULL</code> to
- * create a new list
- * @param data the data to insert
- * @return <code>list</code>, if it is not <code>NULL</code> or a pointer to
- * the newly created list otherwise
- * @see ucx_list_append()
- */
-UcxList *ucx_list_append_a(UcxAllocator *allocator, UcxList *list, void *data);
-
-
-/**
- * Inserts an element at the beginning of the list.
- * 
- * You <i>should</i> overwrite the old list pointer by calling
- * <code>mylist = ucx_list_prepend(mylist, mydata);</code>. However, you may
- * also perform successive calls of ucx_list_prepend() on the same list pointer,
- * as this function always searchs for the head of the list with
- * ucx_list_first().
- * 
- * @param list the list where to insert the data or <code>NULL</code> to create
- * a new list
- * @param data the data to insert
- * @return a pointer to the new list head
- */
-UcxList *ucx_list_prepend(UcxList *list, void *data);
-
-/**
- * Inserts an element at the beginning of the list using a UcxAllocator.
- * 
- * See ucx_list_prepend() for details.
- * 
- * @param allocator the allocator to use
- * @param list the list where to insert the data or <code>NULL</code> to create
- * a new list
- * @param data the data to insert
- * @return a pointer to the new list head
- * @see ucx_list_prepend()
- */
-UcxList *ucx_list_prepend_a(UcxAllocator *allocator, UcxList *list, void *data);
-
-/**
- * Concatenates two lists.
- * 
- * Either of the two arguments may be <code>NULL</code>.
- * 
- * This function modifies the references to the next/previous element of
- * the last/first element of <code>list1</code>/<code>
- * list2</code>.
- * 
- * @param list1 first list
- * @param list2 second list
- * @return if <code>list1</code> is <code>NULL</code>, <code>list2</code> is
- * returned, otherwise <code>list1</code> is returned
- */
-UcxList *ucx_list_concat(UcxList *list1, UcxList *list2);
-
-/**
- * Returns the first element of a list.
- * 
- * If the argument is the list pointer, it is directly returned. Otherwise
- * this function traverses to the first element of the list and returns the
- * list pointer.
- * 
- * @param elem one element of the list
- * @return the first element of the list, the specified element is a member of
- */
-UcxList *ucx_list_first(const UcxList *elem);
-
-/**
- * Returns the last element of a list.
- * 
- * If the argument has no successor, it is the last element and therefore
- * directly returned. Otherwise this function traverses to the last element of
- * the list and returns it.
- * 
- * @param elem one element of the list
- * @return the last element of the list, the specified element is a member of
- */
-UcxList *ucx_list_last(const UcxList *elem);
-
-/**
- * Returns the list element at the specified index.
- * 
- * @param list the list to retrieve the element from
- * @param index index of the element to return
- * @return the element at the specified index or <code>NULL</code>, if the
- * index is greater than the list size
- */
-UcxList *ucx_list_get(const UcxList *list, size_t index);
-
-/**
- * Returns the index of an element.
- * 
- * @param list the list where to search for the element
- * @param elem the element to find
- * @return the index of the element or -1 if the list does not contain the
- * element
- */
-ssize_t ucx_list_indexof(const UcxList *list, const UcxList *elem);
-
-/**
- * Returns the element count of the list.
- * 
- * @param list the list whose elements are counted
- * @return the element count
- */
-size_t ucx_list_size(const UcxList *list);
-
-/**
- * Returns the index of an element containing the specified data.
- *
- * This function uses a cmp_func() to compare the data of each list element
- * with the specified data. If no cmp_func is provided, the pointers are
- * compared.
- * 
- * If the list contains the data more than once, the index of the first
- * occurrence is returned.
- *  
- * @param list the list where to search for the data
- * @param elem the element data
- * @param cmpfnc the compare function
- * @param data additional data for the compare function
- * @return the index of the element containing the specified data or -1 if the
- * data is not found in this list
- */
-ssize_t ucx_list_find(const UcxList *list, void *elem,
-    cmp_func cmpfnc, void *data);
-
-/**
- * Checks, if a list contains a specific element.
- * 
- * An element is found, if ucx_list_find() returns a value greater than -1.
- * 
- * @param list the list where to search for the data
- * @param elem the element data
- * @param cmpfnc the compare function
- * @param data additional data for the compare function
- * @return 1, if and only if the list contains the specified element data
- * @see ucx_list_find()
- */
-int ucx_list_contains(const UcxList *list, void *elem,
-    cmp_func cmpfnc, void *data);
-
-/**
- * Sorts a UcxList with natural merge sort.
- * 
- * This function uses O(n) additional temporary memory for merge operations
- * that is automatically freed after each merge.
- * 
- * As the head of the list might change, you <b>MUST</b> call this function
- * as follows: <code>mylist = ucx_list_sort(mylist, mycmpfnc, mydata);</code>.
- * 
- * @param list the list to sort
- * @param cmpfnc the function that shall be used to compare the element data
- * @param data additional data for the cmp_func()
- * @return the sorted list
- */
-UcxList *ucx_list_sort(UcxList *list, cmp_func cmpfnc, void *data);
-
-/**
- * Removes an element from the list.
- * 
- * If the first element is removed, the list pointer changes. So it is
- * <i>highly recommended</i> to <i>always</i> update the pointer by calling
- * <code>mylist = ucx_list_remove(mylist, myelem);</code>.
- * 
- * @param list the list from which the element shall be removed
- * @param element the element to remove
- * @return returns the updated list pointer or <code>NULL</code>, if the list
- * is now empty
- */
-UcxList *ucx_list_remove(UcxList *list, UcxList *element);
-
-/**
- * Removes an element from the list using a UcxAllocator.
- * 
- * See ucx_list_remove() for details.
- * 
- * @param allocator the allocator to use
- * @param list the list from which the element shall be removed
- * @param element the element to remove
- * @return returns the updated list pointer or <code>NULL</code>, if the list
- * @see ucx_list_remove()
- */
-UcxList *ucx_list_remove_a(UcxAllocator *allocator, UcxList *list,
-        UcxList *element);
-
-/**
- * Returns the union of two lists.
- * 
- * The union is a list of unique elements regarding cmpfnc obtained from
- * both source lists.
- * 
- * @param left the left source list
- * @param right the right source list
- * @param cmpfnc a function to compare elements
- * @param cmpdata additional data for the compare function
- * @param cpfnc a function to copy the elements
- * @param cpdata additional data for the copy function
- * @return a new list containing the union
- */
-UcxList* ucx_list_union(const UcxList *left, const UcxList *right,
-    cmp_func cmpfnc, void* cmpdata,
-    copy_func cpfnc, void* cpdata);
-
-/**
- * Returns the union of two lists.
- * 
- * The union is a list of unique elements regarding cmpfnc obtained from
- * both source lists.
- * 
- * @param allocator allocates the new list elements
- * @param left the left source list
- * @param right the right source list
- * @param cmpfnc a function to compare elements
- * @param cmpdata additional data for the compare function
- * @param cpfnc a function to copy the elements
- * @param cpdata additional data for the copy function
- * @return a new list containing the union
- */
-UcxList* ucx_list_union_a(UcxAllocator *allocator,
-    const UcxList *left, const UcxList *right,
-    cmp_func cmpfnc, void* cmpdata,
-    copy_func cpfnc, void* cpdata);
-
-/**
- * Returns the intersection of two lists.
- * 
- * The intersection contains all elements of the left list
- * (including duplicates) that can be found in the right list.
- * 
- * @param left the left source list
- * @param right the right source list
- * @param cmpfnc a function to compare elements
- * @param cmpdata additional data for the compare function
- * @param cpfnc a function to copy the elements
- * @param cpdata additional data for the copy function
- * @return a new list containing the intersection
- */
-UcxList* ucx_list_intersection(const UcxList *left, const UcxList *right,
-    cmp_func cmpfnc, void* cmpdata,
-    copy_func cpfnc, void* cpdata);
-
-/**
- * Returns the intersection of two lists.
- * 
- * The intersection contains all elements of the left list
- * (including duplicates) that can be found in the right list.
- * 
- * @param allocator allocates the new list elements
- * @param left the left source list
- * @param right the right source list
- * @param cmpfnc a function to compare elements
- * @param cmpdata additional data for the compare function
- * @param cpfnc a function to copy the elements
- * @param cpdata additional data for the copy function
- * @return a new list containing the intersection
- */
-UcxList* ucx_list_intersection_a(UcxAllocator *allocator,
-    const UcxList *left, const UcxList *right,
-    cmp_func cmpfnc, void* cmpdata,
-    copy_func cpfnc, void* cpdata);
-
-/**
- * Returns the difference of two lists.
- * 
- * The difference contains all elements of the left list
- * (including duplicates) that are not equal to any element of the right list.
- * 
- * @param left the left source list
- * @param right the right source list
- * @param cmpfnc a function to compare elements
- * @param cmpdata additional data for the compare function
- * @param cpfnc a function to copy the elements
- * @param cpdata additional data for the copy function
- * @return a new list containing the difference
- */
-UcxList* ucx_list_difference(const UcxList *left, const UcxList *right,
-    cmp_func cmpfnc, void* cmpdata,
-    copy_func cpfnc, void* cpdata);
-
-/**
- * Returns the difference of two lists.
- * 
- * The difference contains all elements of the left list
- * (including duplicates) that are not equal to any element of the right list.
- * 
- * @param allocator allocates the new list elements
- * @param left the left source list
- * @param right the right source list
- * @param cmpfnc a function to compare elements
- * @param cmpdata additional data for the compare function
- * @param cpfnc a function to copy the elements
- * @param cpdata additional data for the copy function
- * @return a new list containing the difference
- */
-UcxList* ucx_list_difference_a(UcxAllocator *allocator,
-    const UcxList *left, const UcxList *right,
-    cmp_func cmpfnc, void* cmpdata,
-    copy_func cpfnc, void* cpdata);
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* UCX_LIST_H */
-
--- a/src/ucx/logging.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,253 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-/**
- * Logging API.
- * 
- * @file   logging.h
- * @author Mike Becker, Olaf Wintermann
- */
-#ifndef UCX_LOGGING_H
-#define UCX_LOGGING_H
-
-#include "ucx.h"
-#include "map.h"
-#include "string.h"
-#include <stdio.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* leave enough space for custom log levels */
-
-/** Log level for error messages. */
-#define UCX_LOGGER_ERROR        0x00
-    
-/** Log level for warning messages. */
-#define UCX_LOGGER_WARN         0x10
-
-/** Log level for information messages. */
-#define UCX_LOGGER_INFO         0x20
-
-/** Log level for debug messages. */
-#define UCX_LOGGER_DEBUG        0x30
-
-/** Log level for trace messages. */
-#define UCX_LOGGER_TRACE        0x40
-
-/**
- * Output flag for the log level. 
- * If this flag is set, the log message will contain the log level.
- * @see UcxLogger.mask
- */
-#define UCX_LOGGER_LEVEL        0x01
-
-/**
- * Output flag for the timestmap.
- * If this flag is set, the log message will contain the timestmap.
- * @see UcxLogger.mask
- */
-#define UCX_LOGGER_TIMESTAMP    0x02
-
-/**
- * Output flag for the source.
- * If this flag is set, the log message will contain the source file and line
- * number.
- * @see UcxLogger.mask
- */
-#define UCX_LOGGER_SOURCE       0x04
-
-/**
- * The UCX Logger object.
- */
-typedef struct {
-    /** The stream this logger writes its messages to.*/
-    void *stream;
-
-    /**
-     * The write function that shall be used.
-     * For standard file or stdout loggers this might be standard fwrite
-     * (default).
-     */
-    write_func writer;
-
-    /**
-     * The date format for timestamp outputs including the delimiter
-     * (default: <code>"%F %T %z "</code>).
-     * @see UCX_LOGGER_TIMESTAMP
-     */
-    char *dateformat;
-
-    /**
-     * The level, this logger operates on.
-     * If a log command is issued, the message will only be logged, if the log
-     * level of the message is less or equal than the log level of the logger.
-     */
-    unsigned int level;
-
-    /**
-     * A configuration mask for automatic output. 
-     * For each flag that is set, the logger automatically outputs some extra
-     * information like the timestamp or the source file and line number.
-     * See the documentation for the flags for details.
-     */
-    unsigned int mask;
-
-    /**
-     * A map of valid log levels for this logger.
-     * 
-     * The keys represent all valid log levels and the values provide string
-     * representations, that are used, if the UCX_LOGGER_LEVEL flag is set.
-     * 
-     * The exact data types are <code>unsigned int</code> for the key and
-     * <code>const char*</code> for the value.
-     * 
-     * @see UCX_LOGGER_LEVEL
-     */
-    UcxMap* levels;
-} UcxLogger;
-
-/**
- * Creates a new logger.
- * @param stream the stream, which the logger shall write to
- * @param level the level on which the logger shall operate
- * @param mask configuration mask (cf. UcxLogger.mask)
- * @return a new logger object
- */
-UcxLogger *ucx_logger_new(void *stream, unsigned int level, unsigned int mask);
-
-/**
- * Destroys the logger.
- * 
- * The map containing the valid log levels is also automatically destroyed.
- * 
- * @param logger the logger to destroy
- */
-void ucx_logger_free(UcxLogger* logger);
-
-/**
- * Internal log function - use macros instead.
- * 
- * This function uses the <code>format</code> and variadic arguments for a
- * printf()-style output of the log message.
- * 
- * Dependent on the UcxLogger.mask some information is prepended. The complete
- * format is:
- * 
- * <code>[LEVEL] [TIMESTAMP] [SOURCEFILE]:[LINENO] message</code>
- *
- * The source file name is reduced to the actual file name. This is necessary to
- * get consistent behavior over different definitions of the __FILE__ macro.
- *
- * <b>Attention:</b> the message (including automatically generated information)
- * is limited to 4096 characters. The level description is limited to
- * 256 characters and the timestamp string is limited to 128 characters.
- * 
- * @param logger the logger to use
- * @param level the level to log on
- * @param file information about the source file
- * @param line information about the source line number
- * @param format format string
- * @param ... arguments
- * @see ucx_logger_log()
- */
-void ucx_logger_logf(UcxLogger *logger, unsigned int level, const char* file,
-        const unsigned int line, const char* format, ...);
-
-/**
- * Registers a custom log level.
- * @param logger the logger
- * @param level the log level as unsigned integer
- * @param name a string literal describing the level
- */
-#define ucx_logger_register_level(logger, level, name) {\
-        unsigned int l; \
-            l = level; \
-            ucx_map_int_put(logger->levels, l, (void*) "[" name "]"); \
-        } while (0);
-
-/**
- * Logs a message at the specified level.
- * @param logger the logger to use
- * @param level the level to log the message on
- * @param ... format string and arguments
- * @see ucx_logger_logf()
- */
-#define ucx_logger_log(logger, level, ...) \
-    ucx_logger_logf(logger, level, __FILE__, __LINE__, __VA_ARGS__)
-
-/**
- * Shortcut for logging an error message.
- * @param logger the logger to use
- * @param ... format string and arguments
- * @see ucx_logger_logf()
- */
-#define ucx_logger_error(logger, ...) \
-    ucx_logger_log(logger, UCX_LOGGER_ERROR, __VA_ARGS__)
-
-/**
- * Shortcut for logging an information message.
- * @param logger the logger to use
- * @param ... format string and arguments
- * @see ucx_logger_logf()
- */
-#define ucx_logger_info(logger, ...) \
-    ucx_logger_log(logger, UCX_LOGGER_INFO, __VA_ARGS__)
-
-/**
- * Shortcut for logging a warning message.
- * @param logger the logger to use
- * @param ... format string and arguments
- * @see ucx_logger_logf()
- */
-#define ucx_logger_warn(logger, ...) \
-    ucx_logger_log(logger, UCX_LOGGER_WARN, __VA_ARGS__)
-
-/**
- * Shortcut for logging a debug message.
- * @param logger the logger to use
- * @param ... format string and arguments
- * @see ucx_logger_logf()
- */
-#define ucx_logger_debug(logger, ...) \
-    ucx_logger_log(logger, UCX_LOGGER_DEBUG, __VA_ARGS__)
-
-/**
- * Shortcut for logging a trace message.
- * @param logger the logger to use
- * @param ... format string and arguments
- * @see ucx_logger_logf()
- */
-#define ucx_logger_trace(logger, ...) \
-    ucx_logger_log(logger, UCX_LOGGER_TRACE, __VA_ARGS__)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* UCX_LOGGING_H */
--- a/src/ucx/map.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,549 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * @file map.h
- * 
- * Hash map implementation.
- * 
- * This implementation uses murmur hash 2 and separate chaining with linked
- * lists.
- * 
- * @author Mike Becker
- * @author Olaf Wintermann
- */
-
-#ifndef UCX_MAP_H
-#define	UCX_MAP_H
-
-#include "ucx.h"
-#include "string.h"
-#include "allocator.h"
-#include <stdio.h>
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-/**
- * Loop statement for UCX maps.
- * 
- * The <code>key</code> variable is implicitly defined, but the
- * <code>value</code> variable must be already declared as type information
- * cannot be inferred.
- * 
- * @param key the variable name for the key
- * @param value the variable name for the value
- * @param iter a UcxMapIterator
- * @see ucx_map_iterator()
- */
-#define UCX_MAP_FOREACH(key,value,iter) \
-        for(UcxKey key;ucx_map_iter_next(&iter,&key, (void**)&value);)
-
-/** Type for the UCX map. @see UcxMap */
-typedef struct UcxMap          UcxMap;
-
-/** Type for a key of a UcxMap. @see UcxKey */
-typedef struct UcxKey          UcxKey;
-
-/** Type for an element of a UcxMap. @see UcxMapElement */
-typedef struct UcxMapElement   UcxMapElement;
-
-/** Type for an iterator over a UcxMap. @see UcxMapIterator */
-typedef struct UcxMapIterator  UcxMapIterator;
-
-/** Structure for the UCX map. */
-struct UcxMap {
-    /** An allocator that is used for the map elements. */
-    UcxAllocator  *allocator;
-    /** The array of map element lists. */
-    UcxMapElement **map;
-    /** The size of the map is the length of the element list array. */
-    size_t        size;
-    /** The count of elements currently stored in this map. */
-    size_t        count;
-};
-
-/** Structure to publicly denote a key of a UcxMap. */
-struct UcxKey {
-    /** The key data. */
-    const void *data;
-    /** The length of the key data. */
-    size_t     len;
-    /** A cache for the hash value of the key data. */
-    int        hash;
-};
-
-/** Internal structure for a key of a UcxMap. */
-struct UcxMapKey {
-    /** The key data. */
-    void    *data;
-    /** The length of the key data. */
-    size_t  len;
-    /** The hash value of the key data. */
-    int     hash;
-};
-
-/** Structure for an element of a UcxMap. */
-struct UcxMapElement {
-    /** The value data. */
-    void              *data;
-    
-    /** A pointer to the next element in the current list. */
-    UcxMapElement     *next;
-    
-    /** The corresponding key. */
-    struct UcxMapKey  key;
-};
-
-/** Structure for an iterator over a UcxMap. */
-struct UcxMapIterator {
-    /** The map to iterate over. */
-    UcxMap const  *map;
-    
-    /** The current map element. */
-    UcxMapElement *cur;
-    
-    /**
-     * The current index of the element list array.
-     * <b>Attention: </b> this is <b>NOT</b> the element index! Do <b>NOT</b>
-     * manually iterate over the map by increasing this index. Use
-     * ucx_map_iter_next().
-     * @see UcxMap.map*/
-    size_t        index;
-};
-
-/**
- * Creates a new hash map with the specified size.
- * @param size the size of the hash map
- * @return a pointer to the new hash map
- */
-UcxMap *ucx_map_new(size_t size);
-
-/**
- * Creates a new hash map with the specified size using a UcxAllocator.
- * @param allocator the allocator to use
- * @param size the size of the hash map
- * @return a pointer to the new hash map
- */
-UcxMap *ucx_map_new_a(UcxAllocator *allocator, size_t size);
-
-/**
- * Frees a hash map.
- * 
- * <b>Note:</b> the contents are <b>not</b> freed, use ucx_map_free_content()
- * before calling this function to achieve that.
- * 
- * @param map the map to be freed
- * @see ucx_map_free_content()
- */
-void ucx_map_free(UcxMap *map);
-
-/**
- * Frees the contents of a hash map.
- * 
- * This is a convenience function that iterates over the map and passes all
- * values to the specified destructor function.
- * 
- * If no destructor is specified (<code>NULL</code>), the free() function of
- * the map's own allocator is used.
- * 
- * You must ensure, that it is valid to pass each value in the map to the same
- * destructor function.
- * 
- * You should free or clear the map afterwards, as the contents will be invalid.
- * 
- * @param map for which the contents shall be freed
- * @param destr optional pointer to a destructor function
- * @see ucx_map_free()
- * @see ucx_map_clear()
- */
-void ucx_map_free_content(UcxMap *map, ucx_destructor destr);
-
-/**
- * Clears a hash map.
- * 
- * <b>Note:</b> the contents are <b>not</b> freed, use ucx_map_free_content()
- * before calling this function to achieve that.
- * 
- * @param map the map to be cleared
- * @see ucx_map_free_content()
- */
-void ucx_map_clear(UcxMap *map);
-
-
-/**
- * Copies contents from a map to another map using a copy function.
- * 
- * <b>Note:</b> The destination map does not need to be empty. However, if it
- * contains data with keys that are also present in the source map, the contents
- * are overwritten.
- * 
- * @param from the source map
- * @param to the destination map
- * @param fnc the copy function or <code>NULL</code> if the pointer address
- * shall be copied
- * @param data additional data for the copy function
- * @return 0 on success or a non-zero value on memory allocation errors
- */
-int ucx_map_copy(UcxMap const *from, UcxMap *to, copy_func fnc, void *data);
-
-/**
- * Clones the map and rehashes if necessary.
- * 
- * <b>Note:</b> In contrast to ucx_map_rehash() the load factor is irrelevant.
- * This function <i>always</i> ensures a new UcxMap.size of at least
- * 2.5*UcxMap.count.
- * 
- * @param map the map to clone
- * @param fnc the copy function to use or <code>NULL</code> if the new and
- * the old map shall share the data pointers
- * @param data additional data for the copy function
- * @return the cloned map
- * @see ucx_map_copy()
- */
-UcxMap *ucx_map_clone(UcxMap const *map, copy_func fnc, void *data);
-
-/**
- * Clones the map and rehashes if necessary.
- *
- * <b>Note:</b> In contrast to ucx_map_rehash() the load factor is irrelevant.
- * This function <i>always</i> ensures a new UcxMap.size of at least
- * 2.5*UcxMap.count.
- *
- * @param allocator the allocator to use for the cloned map
- * @param map the map to clone
- * @param fnc the copy function to use or <code>NULL</code> if the new and
- * the old map shall share the data pointers
- * @param data additional data for the copy function
- * @return the cloned map
- * @see ucx_map_copy()
- */
-UcxMap *ucx_map_clone_a(UcxAllocator *allocator,
-                        UcxMap const *map, copy_func fnc, void *data);
-
-/**
- * Increases size of the hash map, if necessary.
- * 
- * The load value is 0.75*UcxMap.size. If the element count exceeds the load
- * value, the map needs to be rehashed. Otherwise no action is performed and
- * this function simply returns 0.
- * 
- * The rehashing process ensures, that the UcxMap.size is at least
- * 2.5*UcxMap.count. So there is enough room for additional elements without
- * the need of another soon rehashing.
- * 
- * You can use this function to dramatically increase access performance.
- * 
- * @param map the map to rehash
- * @return 1, if a memory allocation error occurred, 0 otherwise
- */
-int ucx_map_rehash(UcxMap *map);
-
-/**
- * Puts a key/value-pair into the map.
- * 
- * @param map the map
- * @param key the key
- * @param value the value
- * @return 0 on success, non-zero value on failure
- */
-int ucx_map_put(UcxMap *map, UcxKey key, void *value);
-
-/**
- * Retrieves a value by using a key.
- * 
- * @param map the map
- * @param key the key
- * @return the value
- */
-void* ucx_map_get(UcxMap const *map, UcxKey key);
-
-/**
- * Removes a key/value-pair from the map by using the key.
- * 
- * @param map the map
- * @param key the key
- * @return the removed value
- */
-void* ucx_map_remove(UcxMap *map, UcxKey key);
-
-/**
- * Shorthand for putting data with a sstr_t key into the map.
- * @param map the map
- * @param key the key
- * @param value the value
- * @return 0 on success, non-zero value on failure
- * @see ucx_map_put()
- */
-#define ucx_map_sstr_put(map, key, value) \
-    ucx_map_put(map, ucx_key(key.ptr, key.length), (void*)value)
-
-/**
- * Shorthand for putting data with a C string key into the map.
- * @param map the map
- * @param key the key
- * @param value the value
- * @return 0 on success, non-zero value on failure
- * @see ucx_map_put()
- */
-#define ucx_map_cstr_put(map, key, value) \
-    ucx_map_put(map, ucx_key(key, strlen(key)), (void*)value)
-
-/**
- * Shorthand for putting data with an integer key into the map.
- * @param map the map
- * @param key the key
- * @param value the value
- * @return 0 on success, non-zero value on failure
- * @see ucx_map_put()
- */
-#define ucx_map_int_put(map, key, value) \
-    ucx_map_put(map, ucx_key(&key, sizeof(key)), (void*)value)
-
-/**
- * Shorthand for getting data from the map with a sstr_t key.
- * @param map the map
- * @param key the key
- * @return the value
- * @see ucx_map_get()
- */
-#define ucx_map_sstr_get(map, key) \
-    ucx_map_get(map, ucx_key(key.ptr, key.length))
-
-/**
- * Shorthand for getting data from the map with a C string key.
- * @param map the map
- * @param key the key
- * @return the value
- * @see ucx_map_get()
- */
-#define ucx_map_cstr_get(map, key) \
-    ucx_map_get(map, ucx_key(key, strlen(key)))
-
-/**
- * Shorthand for getting data from the map with an integer key.
- * @param map the map
- * @param key the key
- * @return the value
- * @see ucx_map_get()
- */
-#define ucx_map_int_get(map, key) \
-    ucx_map_get(map, ucx_key(&key, sizeof(int)))
-
-/**
- * Shorthand for removing data from the map with a sstr_t key.
- * @param map the map
- * @param key the key
- * @return the removed value
- * @see ucx_map_remove()
- */
-#define ucx_map_sstr_remove(map, key) \
-    ucx_map_remove(map, ucx_key(key.ptr, key.length))
-
-/**
- * Shorthand for removing data from the map with a C string key.
- * @param map the map
- * @param key the key
- * @return the removed value
- * @see ucx_map_remove()
- */
-#define ucx_map_cstr_remove(map, key) \
-    ucx_map_remove(map, ucx_key(key, strlen(key)))
-
-/**
- * Shorthand for removing data from the map with an integer key.
- * @param map the map
- * @param key the key
- * @return the removed value
- * @see ucx_map_remove()
- */
-#define ucx_map_int_remove(map, key) \
-    ucx_map_remove(map, ucx_key(&key, sizeof(key)))
-
-/**
- * Creates a UcxKey based on the given data.
- * 
- * This function implicitly computes the hash.
- * 
- * @param data the data for the key
- * @param len the length of the data
- * @return a UcxKey with implicitly computed hash
- * @see ucx_hash()
- */
-UcxKey ucx_key(const void *data, size_t len);
-
-/**
- * Computes a murmur hash-2.
- * 
- * @param data the data to hash
- * @param len the length of the data
- * @return the murmur hash-2 of the data
- */
-int ucx_hash(const char *data, size_t len);
-
-/**
- * Creates an iterator for a map.
- * 
- * <b>Note:</b> A UcxMapIterator iterates over all elements in all element
- * lists successively. Therefore the order highly depends on the key hashes and
- * may vary under different map sizes. So generally you may <b>NOT</b> rely on
- * the iteration order.
- * 
- * <b>Note:</b> The iterator is <b>NOT</b> initialized. You need to call
- * ucx_map_iter_next() at least once before accessing any information. However,
- * it is not recommended to access the fields of a UcxMapIterator directly.
- * 
- * @param map the map to create the iterator for
- * @return an iterator initialized on the first element of the
- * first element list
- * @see ucx_map_iter_next()
- */
-UcxMapIterator ucx_map_iterator(UcxMap const *map);
-
-/**
- * Proceeds to the next element of the map (if any).
- * 
- * Subsequent calls on the same iterator proceed to the next element and
- * store the key/value-pair into the memory specified as arguments of this
- * function.
- * 
- * If no further elements are found, this function returns zero and leaves the
- * last found key/value-pair in memory.
- * 
- * @param iterator the iterator to use
- * @param key a pointer to the memory where to store the key
- * @param value a pointer to the memory where to store the value
- * @return 1, if another element was found, 0 if all elements has been processed
- * @see ucx_map_iterator()
- */
-int ucx_map_iter_next(UcxMapIterator *iterator, UcxKey *key, void **value);
-
-/**
- * Returns the union of two maps.
- *
- * The union is a fresh map which is filled by two successive calls of
- * ucx_map_copy() on the two input maps.
- *
- * @param first the first source map
- * @param second the second source map
- * @param cpfnc a function to copy the elements
- * @param cpdata additional data for the copy function
- * @return a new map containing the union
- */
-UcxMap* ucx_map_union(const UcxMap *first, const UcxMap *second,
-                      copy_func cpfnc, void* cpdata);
-
-/**
- * Returns the union of two maps.
- *
- * The union is a fresh map which is filled by two successive calls of
- * ucx_map_copy() on the two input maps.
- *
- * @param allocator the allocator that shall be used by the new map
- * @param first the first source map
- * @param second the second source map
- * @param cpfnc a function to copy the elements
- * @param cpdata additional data for the copy function
- * @return a new map containing the union
- */
-UcxMap* ucx_map_union_a(UcxAllocator *allocator,
-                        const UcxMap *first, const UcxMap *second,
-                        copy_func cpfnc, void* cpdata);
-
-/**
- * Returns the intersection of two maps.
- *
- * The intersection is defined as a copy of the first map with every element
- * removed that has no valid key in the second map.
- *
- * @param first the first source map
- * @param second the second source map
- * @param cpfnc a function to copy the elements
- * @param cpdata additional data for the copy function
- * @return a new map containing the intersection
- */
-UcxMap* ucx_map_intersection(const UcxMap *first, const UcxMap *second,
-                             copy_func cpfnc, void* cpdata);
-
-/**
- * Returns the intersection of two maps.
- *
- * The intersection is defined as a copy of the first map with every element
- * removed that has no valid key in the second map.
- *
- * @param allocator the allocator that shall be used by the new map
- * @param first the first source map
- * @param second the second source map
- * @param cpfnc a function to copy the elements
- * @param cpdata additional data for the copy function
- * @return a new map containing the intersection
- */
-UcxMap* ucx_map_intersection_a(UcxAllocator *allocator,
-                               const UcxMap *first, const UcxMap *second,
-                               copy_func cpfnc, void* cpdata);
-
-/**
- * Returns the difference of two maps.
- *
- * The difference contains a copy of all elements of the first map
- * for which the corresponding keys cannot be found in the second map.
- *
- * @param first the first source map
- * @param second the second source map
- * @param cpfnc a function to copy the elements
- * @param cpdata additional data for the copy function
- * @return a new list containing the difference
- */
-UcxMap* ucx_map_difference(const UcxMap *first, const UcxMap *second,
-                           copy_func cpfnc, void* cpdata);
-
-/**
- * Returns the difference of two maps.
- *
- * The difference contains a copy of all elements of the first map
- * for which the corresponding keys cannot be found in the second map.
- *
- * @param allocator the allocator that shall be used by the new map
- * @param first the first source map
- * @param second the second source map
- * @param cpfnc a function to copy the elements
- * @param cpdata additional data for the copy function
- * @return a new list containing the difference
- */
-UcxMap* ucx_map_difference_a(UcxAllocator *allocator,
-                             const UcxMap *first, const UcxMap *second,
-                             copy_func cpfnc, void* cpdata);
-
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* UCX_MAP_H */
-
--- a/src/ucx/mempool.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,209 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * @file mempool.h
- * 
- * Memory pool implementation.
- * 
- * @author Mike Becker
- * @author Olaf Wintermann
- */
-
-#ifndef UCX_MEMPOOL_H
-#define	UCX_MEMPOOL_H
-
-#include "ucx.h"
-#include "allocator.h"
-#include <stddef.h>
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-/**
- * UCX mempool structure.
- */
-typedef struct {
-    /** UcxAllocator based on this pool */
-    UcxAllocator *allocator;
-    
-    /** List of pointers to pooled memory. */
-    void         **data;
-    
-    /** Count of pooled memory items. */
-    size_t       ndata;
-    
-    /** Memory pool size. */
-    size_t       size;
-} UcxMempool;
-
-/** Shorthand for a new default memory pool with a capacity of 16 elements. */
-#define ucx_mempool_new_default() ucx_mempool_new(16)
-
-
-/**
- * Creates a memory pool with the specified initial size.
- * 
- * As the created memory pool automatically grows in size by factor two when
- * trying to allocate memory on a full pool, it is recommended that you use
- * a power of two for the initial size.
- * 
- * @param n initial pool size (should be a power of two, e.g. 16)
- * @return a pointer to the new memory pool
- * @see ucx_mempool_new_default()
- */
-UcxMempool *ucx_mempool_new(size_t n);
-
-/**
- * Resizes a memory pool.
- * 
- * This function will fail if the new capacity is not sufficient for the
- * present data.
- * 
- * @param pool the pool to resize
- * @param newcap the new capacity
- * @return zero on success or non-zero on failure
- */
-int ucx_mempool_chcap(UcxMempool *pool, size_t newcap);
-
-/**
- * Allocates pooled memory.
- * 
- * @param pool the memory pool
- * @param n amount of memory to allocate
- * @return a pointer to the allocated memory
- * @see ucx_allocator_malloc()
- */
-void *ucx_mempool_malloc(UcxMempool *pool, size_t n);
-/**
- * Allocates a pooled memory array.
- * 
- * The content of the allocated memory is set to zero.
- * 
- * @param pool the memory pool
- * @param nelem amount of elements to allocate
- * @param elsize amount of memory per element
- * @return a pointer to the allocated memory
- * @see ucx_allocator_calloc()
- */
-void *ucx_mempool_calloc(UcxMempool *pool, size_t nelem, size_t elsize);
-
-/**
- * Reallocates pooled memory.
- * 
- * If the memory to be reallocated is not contained by the specified pool, the
- * behavior is undefined.
- * 
- * @param pool the memory pool
- * @param ptr a pointer to the memory that shall be reallocated
- * @param n the new size of the memory
- * @return a pointer to the new location of the memory
- * @see ucx_allocator_realloc()
- */
-void *ucx_mempool_realloc(UcxMempool *pool, void *ptr, size_t n);
-
-/**
- * Frees pooled memory.
- * 
- * Before freeing the memory, the specified destructor function (if any)
- * is called.
- * 
- * If you specify memory, that is not pooled by the specified memory pool, the
- * program will terminate with a call to <code>abort()</code>.
- * 
- * @param pool the memory pool
- * @param ptr a pointer to the memory that shall be freed
- * @see ucx_mempool_set_destr()
- */
-void ucx_mempool_free(UcxMempool *pool, void *ptr);
-
-/**
- * Destroys a memory pool.
- * 
- * For each element the destructor function (if any) is called and the element
- * is freed.
- * 
- * Each of the registered destructor function that has no corresponding element
- * within the pool (namely those registered by ucx_mempool_reg_destr) is
- * called interleaving with the element destruction, but with guarantee to the
- * order in which they were registered (FIFO order).
- * 
- * 
- * @param pool the mempool to destroy
- */
-void ucx_mempool_destroy(UcxMempool *pool);
-
-/**
- * Sets a destructor function for the specified memory.
- * 
- * The destructor is automatically called when the memory is freed or the
- * pool is destroyed.
- * A destructor for pooled memory <b>MUST NOT</b> free the memory itself,
- * as this is done by the pool. Use a destructor to free any resources
- * managed by the pooled object.
- * 
- * The only requirement for the specified memory is, that it <b>MUST</b> be
- * pooled memory by a UcxMempool or an element-compatible mempool. The pointer
- * to the destructor function is saved in a reserved area before the actual
- * memory.
- * 
- * @param ptr pooled memory
- * @param func a pointer to the destructor function
- * @see ucx_mempool_free()
- * @see ucx_mempool_destroy()
- */
-void ucx_mempool_set_destr(void *ptr, ucx_destructor func);
-
-/**
- * Registers a destructor function for the specified (non-pooled) memory.
- *
- * This is useful, if you have memory that has not been allocated by a mempool,
- * but shall be managed by a mempool.
- * 
- * This function creates an entry in the specified mempool and the memory will
- * therefore (logically) convert to pooled memory.
- * <b>However, this does not cause the memory to be freed automatically!</b>.
- * If you want to use this function, make the memory pool free non-pooled
- * memory, the specified destructor function must call <code>free()</code>
- * by itself. But keep in mind, that you then MUST NOT use this destructor
- * function with pooled memory (e.g. in ucx_mempool_set_destr()), as it
- * would cause a double-free.
- * 
- * @param pool the memory pool
- * @param ptr data the destructor is registered for
- * @param destr a pointer to the destructor function
- */
-void ucx_mempool_reg_destr(UcxMempool *pool, void *ptr, ucx_destructor destr);
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* UCX_MEMPOOL_H */
-
--- a/src/ucx/properties.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,221 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-/**
- * @file properties.h
- * 
- * Load / store utilities for properties files.
- * 
- * @author Mike Becker
- * @author Olaf Wintermann
- */
-
-#ifndef UCX_PROPERTIES_H
-#define	UCX_PROPERTIES_H
-
-#include "ucx.h"
-#include "map.h"
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-/**
- * UcxProperties object for parsing properties data.
- * Most of the fields are for internal use only. You may configure the
- * properties parser, e.g. by changing the used delimiter or specifying 
- * up to three different characters that shall introduce comments.
- */
-typedef struct {
-    /**
-     * Input buffer (don't set manually).
-     * Automatically set by calls to ucx_properties_fill().
-     */
-    char   *buffer;
-    
-    /**
-     * Length of the input buffer (don't set manually).
-     * Automatically set by calls to ucx_properties_fill().
-     */
-    size_t buflen;
-    
-    /**
-     * Current buffer position (don't set manually).
-     * Used by ucx_properties_next().
-     */
-    size_t pos;
-    
-    /**
-     * Internal temporary buffer (don't set manually).
-     * Used by ucx_properties_next().
-     */
-    char   *tmp;
-    
-    /**
-     * Internal temporary buffer length (don't set manually).
-     * Used by ucx_properties_next().
-     */
-    size_t tmplen;
-    
-    /**
-     * Internal temporary buffer capacity (don't set manually).
-     * Used by ucx_properties_next().
-     */
-    size_t tmpcap;
-    
-    /**
-     * Parser error code.
-     * This is always 0 on success and a nonzero value on syntax errors.
-     * The value is set by ucx_properties_next().
-     */
-    int    error;
-    
-    /**
-     * The delimiter that shall be used.
-     * This is '=' by default.
-     */
-    char   delimiter;
-    
-    /**
-     * The first comment character.
-     * This is '#' by default.
-     */
-    char   comment1;
-    
-    /**
-     * The second comment character.
-     * This is not set by default.
-     */
-    char   comment2;
-    
-    /**
-     * The third comment character.
-     * This is not set by default.
-     */
-    char   comment3;
-} UcxProperties;
-
-
-/**
- * Constructs a new UcxProperties object.
- * @return a pointer to the new UcxProperties object
- */
-UcxProperties *ucx_properties_new();
-
-/**
- * Destroys a UcxProperties object.
- * @param prop the UcxProperties object to destroy
- */
-void ucx_properties_free(UcxProperties *prop);
-
-/**
- * Sets the input buffer for the properties parser.
- * 
- * After calling this function, you may parse the data by calling
- * ucx_properties_next() until it returns 0. The function ucx_properties2map()
- * is a convenience function that reads as much data as possible by using this
- * function.
- * 
- * 
- * @param prop the UcxProperties object
- * @param buf a pointer to the new buffer
- * @param len the payload length of the buffer
- * @see ucx_properties_next()
- * @see ucx_properties2map()
- */
-void ucx_properties_fill(UcxProperties *prop, char *buf, size_t len);
-
-/**
- * Retrieves the next key/value-pair.
- * 
- * This function returns a nonzero value as long as there are key/value-pairs
- * found. If no more key/value-pairs are found, you may refill the input buffer
- * with ucx_properties_fill().
- * 
- * <b>Attention:</b> the sstr_t.ptr pointers of the output parameters point to
- * memory within the input buffer of the parser and will get invalid some time.
- * If you want long term copies of the key/value-pairs, use sstrdup() after
- * calling this function.
- * 
- * @param prop the UcxProperties object
- * @param name a pointer to the sstr_t that shall contain the property name
- * @param value a pointer to the sstr_t that shall contain the property value
- * @return Nonzero, if a key/value-pair was successfully retrieved
- * @see ucx_properties_fill()
- */
-int ucx_properties_next(UcxProperties *prop, sstr_t *name, sstr_t *value);
-
-/**
- * Retrieves all available key/value-pairs and puts them into a UcxMap.
- * 
- * This is done by successive calls to ucx_properties_next() until no more
- * key/value-pairs can be retrieved.
- * 
- * The memory for the map values is allocated by the map's own allocator.
- * 
- * @param prop the UcxProperties object
- * @param map the target map
- * @return The UcxProperties.error code (i.e. 0 on success).
- * @see ucx_properties_fill()
- * @see UcxMap.allocator
- */
-int ucx_properties2map(UcxProperties *prop, UcxMap *map);
-
-/**
- * Loads a properties file to a UcxMap.
- * 
- * This is a convenience function that reads data from an input
- * stream until the end of the stream is reached.
- * 
- * @param map the map object to write the key/value-pairs to
- * @param file the <code>FILE*</code> stream to read from
- * @return 0 on success, or a non-zero value on error
- * 
- * @see ucx_properties_fill()
- * @see ucx_properties2map()
- */
-int ucx_properties_load(UcxMap *map, FILE *file);
-
-/**
- * Stores a UcxMap to a file.
- * 
- * The key/value-pairs are written by using the following format:
- * 
- * <code>[key] = [value]\\n</code>
- * 
- * @param map the map to store
- * @param file the <code>FILE*</code> stream to write to
- * @return 0 on success, or a non-zero value on error
- */
-int ucx_properties_store(UcxMap *map, FILE *file);
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* UCX_PROPERTIES_H */
-
--- a/src/ucx/stack.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,240 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * @file stack.h
- * 
- * Default stack memory allocation implementation.
- * 
- * @author Mike Becker
- * @author Olaf Wintermann
- */
-
-#ifndef UCX_STACK_H
-#define	UCX_STACK_H
-
-#include "ucx.h"
-#include "allocator.h"
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-
-/**
- * UCX stack structure.
- */
-typedef struct {
-    /** UcxAllocator based on this stack */
-    UcxAllocator allocator;
-    
-    /** Stack size. */
-    size_t size;
-    
-    /** Pointer to the bottom of the stack */
-    char *space;
-    
-    /** Pointer to the top of the stack */
-    char *top;
-} UcxStack;
-
-/**
- * Metadata for each UCX stack element.
- */
-struct ucx_stack_metadata {
-    /**
-     * Location of the previous element (<code>NULL</code> if this is the first)
-     */
-    char *prev;
-    
-    /** Size of this element */
-    size_t size;
-};
-
-/**
- * Initializes UcxStack structure with memory.
- * 
- * @param stack a pointer to an uninitialized stack structure
- * @param space the memory area that shall be managed
- * @param size size of the memory area
- * @return a new UcxStack structure
- */
-void ucx_stack_init(UcxStack *stack, char* space, size_t size);
-
-/**
- * Allocates stack memory.
- * 
- * @param stack a pointer to the stack
- * @param n amount of memory to allocate
- * @return a pointer to the allocated memory or <code>NULL</code> on stack
- * overflow
- * @see ucx_allocator_malloc()
- */
-void *ucx_stack_malloc(UcxStack *stack, size_t n);
-
-/**
- * Allocates memory with #ucx_stack_malloc() and copies the specified data if
- * the allocation was successful.
- * 
- * @param stack a pointer to the stack
- * @param n amount of memory to allocate
- * @param data a pointer to the data to copy
- * @return a pointer to the allocated memory
- * @see ucx_stack_malloc
- */
-void *ucx_stack_push(UcxStack *stack, size_t n, const void *data);
-
-/**
- * Allocates an array of stack memory
- * 
- * The content of the allocated memory is set to zero.
- * 
- * @param stack a pointer to the stack
- * @param nelem amount of elements to allocate
- * @param elsize amount of memory per element
- * @return a pointer to the allocated memory
- * @see ucx_allocator_calloc()
- */
-void *ucx_stack_calloc(UcxStack *stack, size_t nelem, size_t elsize);
-
-/**
- * Allocates memory with #ucx_stack_calloc() and copies the specified data if
- * the allocation was successful.
- * 
- * @param stack a pointer to the stack
- * @param nelem amount of elements to allocate
- * @param elsize amount of memory per element
- * @param data a pointer to the data
- * @return a pointer to the allocated memory
- * @see ucx_stack_calloc
- */
-void *ucx_stack_pusharr(UcxStack *stack,
-        size_t nelem, size_t elsize, const void *data);
-
-/**
- * Reallocates memory on the stack.
- * 
- * Shrinking memory is always safe. Extending memory can be very expensive. 
- * 
- * @param stack the stack
- * @param ptr a pointer to the memory that shall be reallocated
- * @param n the new size of the memory
- * @return a pointer to the new location of the memory
- * @see ucx_allocator_realloc()
- */
-void *ucx_stack_realloc(UcxStack *stack, void *ptr, size_t n);
-
-/**
- * Frees memory on the stack.
- * 
- * Freeing stack memory behaves in a special way.
- * 
- * If the element, that should be freed, is the top most element of the stack,
- * it is removed from the stack. Otherwise it is marked as freed. Marked
- * elements are removed, when they become the top most elements of the stack.
- * 
- * @param stack a pointer to the stack
- * @param ptr a pointer to the memory that shall be freed
- */
-void ucx_stack_free(UcxStack *stack, void *ptr);
-
-
-/**
- * Returns the size of the top most element.
- * @param stack a pointer to the stack
- * @return the size of the top most element
- */
-#define ucx_stack_topsize(stack) ((stack)->top ? ((struct ucx_stack_metadata*)\
-                                  (stack)->top - 1)->size : 0)
-
-/**
- * Removes the top most element from the stack and copies the content to <code>
- * dest</code>, if specified.
- * 
- * Use #ucx_stack_topsize()# to get the amount of memory that must be available
- * at the location of <code>dest</code>.
- * 
- * @param stack a pointer to the stack
- * @param dest the location where the contents shall be written to, or <code>
- * NULL</code>, if the element shall only be removed.
- * @see ucx_stack_free
- * @see ucx_stack_popn
- */
-#define ucx_stack_pop(stack, dest) ucx_stack_popn(stack, dest, (size_t)-1)
-
-/**
- * Removes the top most element from the stack and copies the content to <code>
- * dest</code>.
- * 
- * This function copies at most <code>n</code> bytes to the destination, but
- * the element is always freed as a whole.
- * If the element was larger than <code>n</code>, the remaining data is lost.
- * 
- * @param stack a pointer to the stack
- * @param dest the location where the contents shall be written to
- * @param n copies at most n bytes to <code>dest</code>
- * @see ucx_stack_pop
- */
-void ucx_stack_popn(UcxStack *stack, void *dest, size_t n);
-
-/**
- * Returns the remaining available memory on the specified stack.
- * 
- * @param stack a pointer to the stack
- * @return the remaining available memory
- */
-size_t ucx_stack_avail(UcxStack *stack);
-
-/**
- * Checks, if the stack is empty.
- * 
- * @param stack a pointer to the stack
- * @return nonzero, if the stack is empty, zero otherwise
- */
-#define ucx_stack_empty(stack) (!(stack)->top)
-
-/**
- * Computes a recommended size for the stack memory area. Note, that
- * reallocations have not been taken into account, so you might need to reserve
- * twice as much memory to allow many reallocations.
- * 
- * @param size the approximate payload
- * @param elems the approximate count of element allocations
- * @return a recommended size for the stack space based on the information
- * provided
- */
-#define ucx_stack_dim(size, elems) (size+sizeof(struct ucx_stack_metadata) * \
-                                    (elems + 1))
-
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* UCX_STACK_H */
-
--- a/src/ucx/string.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1201 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-/**
- * Bounded string implementation.
- * 
- * The UCX strings (<code>sstr_t</code>) provide an alternative to C strings.
- * The main difference to C strings is, that <code>sstr_t</code> does <b>not
- * need to be <code>NULL</code>-terminated</b>. Instead the length is stored
- * within the structure.
- * 
- * When using <code>sstr_t</code>, developers must be full aware of what type
- * of string (<code>NULL</code>-terminated) or not) they are using, when 
- * accessing the <code>char* ptr</code> directly.
- * 
- * The UCX string module provides some common string functions, known from
- * standard libc, working with <code>sstr_t</code>.
- * 
- * @file   string.h
- * @author Mike Becker
- * @author Olaf Wintermann
- */
-
-#ifndef UCX_STRING_H
-#define	UCX_STRING_H
-
-#include "ucx.h"
-#include "allocator.h"
-#include <stddef.h>
-
-/*
- * Use this macro to disable the shortcuts if you experience macro collision.
- */
-#ifndef UCX_NO_SSTR_SHORTCUTS
-/**
- * Shortcut for a <code>sstr_t struct</code>
- * or <code>scstr_t struct</code> literal.
- */
-#define ST(s) { s, sizeof(s)-1 }
-
-/** Shortcut for the conversion of a C string to a <code>sstr_t</code>. */
-#define S(s) sstrn(s, sizeof(s)-1)
-
-/** Shortcut for the conversion of a C string to a <code>scstr_t</code>. */
-#define SC(s) scstrn(s, sizeof(s)-1)
-#endif /* UCX_NO_SSTR_SHORTCUTS */
-
-/*
- * Use this macro to disable the format macros.
- */
-#ifndef UCX_NO_SSTR_FORMAT_MACROS
-/** Expands a sstr_t or scstr_t to printf arguments. */
-#define SFMT(s) (int) (s).length, (s).ptr
-
-/** Format specifier for a sstr_t or scstr_t. */
-#define PRIsstr ".*s"
-#endif /* UCX_NO_SSTR_FORMAT_MACROS */
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-  
-/**
- * The UCX string structure.
- */
-typedef struct {
-   /** A pointer to the string
-    * (<b>not necessarily <code>NULL</code>-terminated</b>) */
-    char *ptr;
-    /** The length of the string */
-    size_t length;
-} sstr_t;
-
-/**
- * The UCX string structure for immutable (constant) strings.
- */
-typedef struct {
-    /** A constant pointer to the immutable string
-     * (<b>not necessarily <code>NULL</code>-terminated</b>) */
-    const char *ptr;
-    /** The length of the string */
-    size_t length;
-} scstr_t;
-
-#ifdef	__cplusplus
-}
-#endif
-
-
-#ifdef __cplusplus
-/**
- * One of two type adjustment functions that return an scstr_t.
- * 
- * Used <b>internally</b> to convert a UCX string to an immutable UCX string.
- * 
- * <b>Do not use this function manually.</b>
- * 
- * @param str some sstr_t
- * @return an immutable (scstr_t) version of the provided string.
- */
-inline scstr_t s2scstr(sstr_t s) {
-    scstr_t c;
-    c.ptr = s.ptr;
-    c.length = s.length;
-    return c;
-}
-
-/**
- * One of two type adjustment functions that return an scstr_t.
- * 
- * Used <b>internally</b> to convert a UCX string to an immutable UCX string.
- * This variant is used, when the string is already immutable and no operation
- * needs to be performed.
- * 
- * <b>Do not use this function manually.</b>
- * 
- * @param str some scstr_t
- * @return the argument itself
- */
-inline scstr_t s2scstr(scstr_t str) {
-    return str;
-}
-
-/**
- * Converts a UCX string to an immutable UCX string (scstr_t).
- * @param str some UCX string
- * @return an immutable version of the provided string
- */
-#define SCSTR(s) s2scstr(s)
-#else
-
-/**
- * One of two type adjustment functions that return an scstr_t.
- * 
- * Used <b>internally</b> to convert a UCX string to an immutable UCX string.
- * This variant is used, when the string is already immutable and no operation
- * needs to be performed.
- * 
- * <b>Do not use this function manually.</b>
- * 
- * @param str some scstr_t
- * @return the argument itself
- */
-scstr_t ucx_sc2sc(scstr_t str);
-
-/**
- * One of two type adjustment functions that return an scstr_t.
- * 
- * Used <b>internally</b> to convert a UCX string to an immutable UCX string.
- * 
- * <b>Do not use this function manually.</b>
- * 
- * @param str some sstr_t
- * @return an immutable (scstr_t) version of the provided string.
- */
-scstr_t ucx_ss2sc(sstr_t str);
-
-#if __STDC_VERSION__ >= 201112L
-/**
- * Converts a UCX string to an immutable UCX string (scstr_t).
- * @param str some UCX string
- * @return an immutable version of the provided string
- */
-#define SCSTR(str) _Generic(str, sstr_t: ucx_ss2sc, scstr_t: ucx_sc2sc)(str)
-
-#elif defined(__GNUC__) || defined(__clang__)
-
-/**
- * Converts a UCX string to an immutable UCX string (scstr_t).
- * @param str some UCX string
- * @return an immutable version of the provided string
- */
-#define SCSTR(str) __builtin_choose_expr( \
-        __builtin_types_compatible_p(typeof(str), sstr_t), \
-        ucx_ss2sc, \
-        ucx_sc2sc)(str)
-
-#elif defined(__sun)
-
-/**
- * Converts a UCX string to an immutable UCX string (scstr_t).
- * @param str some UCX string
- * @return the an immutable version of the provided string
- */
-#define SCSTR(str) ({typeof(str) ucx_tmp_var_str = str; \
-	scstr_t ucx_tmp_var_c; \
-	ucx_tmp_var_c.ptr = ucx_tmp_var_str.ptr;\
-	ucx_tmp_var_c.length = ucx_tmp_var_str.length;\
-	ucx_tmp_var_c; })
-#else /* no generics and no builtins */
-
-/**
- * Converts a UCX string to an immutable UCX string (scstr_t).
- * 
- * This <b>internal</b> function (ab)uses the C standard an expects one single
- * argument which is then implicitly converted to scstr_t without a warning.
- * 
- * <b>Do not use this function manually.</b>
- * 
- * @return the an immutable version of the provided string
- */
-scstr_t ucx_ss2c_s();
-
-/**
- * Converts a UCX string to an immutable UCX string (scstr_t).
- * @param str some UCX string
- * @return the an immutable version of the provided string
- */
-#define SCSTR(str) ucx_ss2c_s(str)
-#endif /* C11 feature test */
-
-#endif /* C++ */
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-
-/**
- * Creates a new sstr_t based on a C string.
- * 
- * The length is implicitly inferred by using a call to <code>strlen()</code>.
- *
- * <b>Note:</b> the sstr_t will share the specified pointer to the C string.
- * If you do want a copy, use sstrdup() on the return value of this function.
- * 
- * If you need to wrap a constant string, use scstr().
- * 
- * @param cstring the C string to wrap
- * @return a new sstr_t containing the C string
- * 
- * @see sstrn()
- */
-sstr_t sstr(char *cstring);
-
-/**
- * Creates a new sstr_t of the specified length based on a C string.
- *
- * <b>Note:</b> the sstr_t will share the specified pointer to the C string.
- * If you do want a copy, use sstrdup() on the return value of this function.
- * 
- * If you need to wrap a constant string, use scstrn().
- * 
- * @param cstring  the C string to wrap
- * @param length   the length of the string
- * @return a new sstr_t containing the C string
- * 
- * @see sstr()
- * @see S()
- */
-sstr_t sstrn(char *cstring, size_t length);
-
-/**
- * Creates a new scstr_t based on a constant C string.
- * 
- * The length is implicitly inferred by using a call to <code>strlen()</code>.
- *
- * <b>Note:</b> the scstr_t will share the specified pointer to the C string.
- * If you do want a copy, use scstrdup() on the return value of this function.
- * 
- * @param cstring the C string to wrap
- * @return a new scstr_t containing the C string
- * 
- * @see scstrn()
- */
-scstr_t scstr(const char *cstring);
-
-
-/**
- * Creates a new scstr_t of the specified length based on a constant C string.
- *
- * <b>Note:</b> the scstr_t will share the specified pointer to the C string.
- * If you do want a copy, use scstrdup() on the return value of this function. * 
- * 
- * @param cstring  the C string to wrap
- * @param length   the length of the string
- * @return a new scstr_t containing the C string
- * 
- * @see scstr()
- */
-scstr_t scstrn(const char *cstring, size_t length);
-
-/**
- * Returns the accumulated length of all specified strings.
- * 
- * <b>Attention:</b> if the count argument is larger than the count of the
- * specified strings, the behavior is undefined.
- *
- * @param count    the total number of specified strings
- * @param ...      all strings
- * @return the accumulated length of all strings
- */
-size_t scstrnlen(size_t count, ...);
-
-/**
- * Returns the accumulated length of all specified strings.
- * 
- * <b>Attention:</b> if the count argument is larger than the count of the
- * specified strings, the behavior is undefined.
- * 
- * @param count    the total number of specified strings
- * @param ...      all strings
- * @return the cumulated length of all strings
- */
-#define sstrnlen(count, ...) scstrnlen(count, __VA_ARGS__)
-
-/**
- * Concatenates two or more strings.
- * 
- * The resulting string will be allocated by standard <code>malloc()</code>. 
- * So developers <b>MUST</b> pass the sstr_t.ptr to <code>free()</code>.
- * 
- * The sstr_t.ptr of the return value will <i>always</i> be <code>NULL</code>-
- * terminated.
- *
- * @param count   the total number of strings to concatenate
- * @param s1      first string
- * @param ...     all remaining strings
- * @return the concatenated string
- */
-sstr_t scstrcat(size_t count, scstr_t s1, ...);
-
-/**
- * Concatenates two or more strings.
- * 
- * The resulting string will be allocated by standard <code>malloc()</code>. 
- * So developers <b>MUST</b> pass the sstr_t.ptr to <code>free()</code>.
- * 
- * The sstr_t.ptr of the return value will <i>always</i> be <code>NULL</code>-
- * terminated.
- * 
- * @param count   the total number of strings to concatenate
- * @param s1      first string
- * @param ...     all remaining strings
- * @return the concatenated string
- */
-#define sstrcat(count, s1, ...) scstrcat(count, SCSTR(s1), __VA_ARGS__)
-
-/**
- * Concatenates two or more strings using a UcxAllocator.
- * 
- * The resulting string must be freed by the allocators <code>free()</code>
- * implementation.
- * 
- * The sstr_t.ptr of the return value will <i>always</i> be <code>NULL</code>-
- * terminated.
- *
- * @param alloc   the allocator to use
- * @param count   the total number of strings to concatenate
- * @param s1      first string
- * @param ...     all remaining strings
- * @return the concatenated string
- * 
- * @see scstrcat()
- */
-sstr_t scstrcat_a(UcxAllocator *alloc, size_t count, scstr_t s1, ...);
-
-/**
- * Concatenates two or more strings using a UcxAllocator.
- * 
- * The resulting string must be freed by the allocators <code>free()</code>
- * implementation.
- * 
- * The sstr_t.ptr of the return value will <i>always</i> be <code>NULL</code>-
- * terminated.
- *
- * @param alloc   the allocator to use
- * @param count   the total number of strings to concatenate
- * @param s1      first string
- * @param ...     all remaining strings
- * @return the concatenated string
- * 
- * @see sstrcat()
- */
-#define sstrcat_a(alloc, count, s1, ...) \
-    scstrcat_a(alloc, count, SCSTR(s1), __VA_ARGS__)
-
-/**
- * Returns a substring starting at the specified location.
- * 
- * <b>Attention:</b> the new string references the same memory area as the
- * input string and is <b>NOT</b> required to be <code>NULL</code>-terminated.
- * Use sstrdup() to get a copy.
- * 
- * @param string input string
- * @param start  start location of the substring
- * @return a substring of <code>string</code> starting at <code>start</code>
- * 
- * @see sstrsubsl()
- * @see sstrchr()
- */
-sstr_t sstrsubs(sstr_t string, size_t start);
-
-/**
- * Returns a substring with the given length starting at the specified location.
- * 
- * <b>Attention:</b> the new string references the same memory area as the
- * input string and is <b>NOT</b> required to be <code>NULL</code>-terminated.
- * Use sstrdup() to get a copy.
- * 
- * @param string input string
- * @param start  start location of the substring
- * @param length the maximum length of the substring
- * @return a substring of <code>string</code> starting at <code>start</code>
- * with a maximum length of <code>length</code>
- * 
- * @see sstrsubs()
- * @see sstrchr()
- */
-sstr_t sstrsubsl(sstr_t string, size_t start, size_t length);
-
-/**
- * Returns a substring of an immutable string starting at the specified
- * location.
- * 
- * <b>Attention:</b> the new string references the same memory area as the
-* input string and is <b>NOT</b> required to be <code>NULL</code>-terminated.
- * Use scstrdup() to get a copy.
- * 
- * @param string input string
- * @param start  start location of the substring
- * @return a substring of <code>string</code> starting at <code>start</code>
- * 
- * @see scstrsubsl()
- * @see scstrchr()
- */
-scstr_t scstrsubs(scstr_t string, size_t start);
-
-/**
- * Returns a substring of an immutable string with a maximum length starting
- * at the specified location.
- * 
- * <b>Attention:</b> the new string references the same memory area as the
- * input string and is <b>NOT</b> required to be <code>NULL</code>-terminated.
- * Use scstrdup() to get a copy.
- * 
- * @param string input string
- * @param start  start location of the substring
- * @param length the maximum length of the substring
- * @return a substring of <code>string</code> starting at <code>start</code>
- * with a maximum length of <code>length</code>
- * 
- * @see scstrsubs()
- * @see scstrchr()
- */
-scstr_t scstrsubsl(scstr_t string, size_t start, size_t length);
-
-/**
- * Returns a substring starting at the location of the first occurrence of the
- * specified character.
- * 
- * If the string does not contain the character, an empty string is returned.
- * 
- * @param string the string where to locate the character
- * @param chr    the character to locate
- * @return       a substring starting at the first location of <code>chr</code>
- * 
- * @see sstrsubs()
- */
-sstr_t sstrchr(sstr_t string, int chr);
-
-/**
- * Returns a substring starting at the location of the last occurrence of the
- * specified character.
- * 
- * If the string does not contain the character, an empty string is returned.
- * 
- * @param string the string where to locate the character
- * @param chr    the character to locate
- * @return       a substring starting at the last location of <code>chr</code>
- * 
- * @see sstrsubs()
- */
-sstr_t sstrrchr(sstr_t string, int chr);
-
-/**
- * Returns an immutable substring starting at the location of the first
- * occurrence of the specified character.
- * 
- * If the string does not contain the character, an empty string is returned.
- * 
- * @param string the string where to locate the character
- * @param chr    the character to locate
- * @return       a substring starting at the first location of <code>chr</code>
- * 
- * @see scstrsubs()
- */
-scstr_t scstrchr(scstr_t string, int chr);
-
-/**
- * Returns an immutable substring starting at the location of the last
- * occurrence of the specified character.
- * 
- * If the string does not contain the character, an empty string is returned.
- * 
- * @param string the string where to locate the character
- * @param chr    the character to locate
- * @return       a substring starting at the last location of <code>chr</code>
- * 
- * @see scstrsubs()
- */
-scstr_t scstrrchr(scstr_t string, int chr);
-
-/**
- * Returns a substring starting at the location of the first occurrence of the
- * specified string.
- * 
- * If the string does not contain the other string, an empty string is returned.
- * 
- * If <code>match</code> is an empty string, the complete <code>string</code> is
- * returned.
- * 
- * @param string the string to be scanned
- * @param match  string containing the sequence of characters to match
- * @return       a substring starting at the first occurrence of
- *               <code>match</code>, or an empty string, if the sequence is not
- *               present in <code>string</code>
- */
-sstr_t scstrsstr(sstr_t string, scstr_t match);
-
-/**
- * Returns a substring starting at the location of the first occurrence of the
- * specified string.
- * 
- * If the string does not contain the other string, an empty string is returned.
- * 
- * If <code>match</code> is an empty string, the complete <code>string</code> is
- * returned.
- * 
- * @param string the string to be scanned
- * @param match  string containing the sequence of characters to match
- * @return       a substring starting at the first occurrence of
- *               <code>match</code>, or an empty string, if the sequence is not
- *               present in <code>string</code>
- */
-#define sstrstr(string, match) scstrsstr(string, SCSTR(match))
-
-/**
- * Returns an immutable substring starting at the location of the
- * first occurrence of the specified immutable string.
- * 
- * If the string does not contain the other string, an empty string is returned.
- * 
- * If <code>match</code> is an empty string, the complete <code>string</code> is
- * returned.
- * 
- * @param string the string to be scanned
- * @param match  string containing the sequence of characters to match
- * @return       a substring starting at the first occurrence of
- *               <code>match</code>, or an empty string, if the sequence is not
- *               present in <code>string</code>
- */
-scstr_t scstrscstr(scstr_t string, scstr_t match);
-
-/**
- * Returns an immutable substring starting at the location of the
- * first occurrence of the specified immutable string.
- * 
- * If the string does not contain the other string, an empty string is returned.
- * 
- * If <code>match</code> is an empty string, the complete <code>string</code> is
- * returned.
- * 
- * @param string the string to be scanned
- * @param match  string containing the sequence of characters to match
- * @return       a substring starting at the first occurrence of
- *               <code>match</code>, or an empty string, if the sequence is not
- *               present in <code>string</code>
- */
-#define sstrscstr(string, match) scstrscstr(string, SCSTR(match))
-
-/**
- * Splits a string into parts by using a delimiter string.
- * 
- * This function will return <code>NULL</code>, if one of the following happens:
- * <ul>
- *   <li>the string length is zero</li>
- *   <li>the delimeter length is zero</li>
- *   <li>the string equals the delimeter</li>
- *   <li>memory allocation fails</li>
- * </ul>
- * 
- * The integer referenced by <code>count</code> is used as input and determines
- * the maximum size of the resulting array, i.e. the maximum count of splits to
- * perform + 1.
- * 
- * The integer referenced by <code>count</code> is also used as output and is
- * set to
- * <ul>
- *   <li>-2, on memory allocation errors</li>
- *   <li>-1, if either the string or the delimiter is an empty string</li>
- *   <li>0, if the string equals the delimiter</li>
- *   <li>1, if the string does not contain the delimiter</li>
- *   <li>the count of array items, otherwise</li>
- * </ul>
- * 
- * If the string starts with the delimiter, the first item of the resulting
- * array will be an empty string.
- * 
- * If the string ends with the delimiter and the maximum list size is not
- * exceeded, the last array item will be an empty string.
- * In case the list size would be exceeded, the last array item will be the
- * remaining string after the last split, <i>including</i> the terminating
- * delimiter.
- * 
- * <b>Attention:</b> The array pointer <b>AND</b> all sstr_t.ptr of the array
- * items must be manually passed to <code>free()</code>. Use scstrsplit_a() with
- * an allocator to managed memory, to avoid this.
- *
- * @param string the string to split
- * @param delim  the delimiter string
- * @param count  IN: the maximum size of the resulting array (0 = no limit),
- *               OUT: the actual size of the array
- * @return a sstr_t array containing the split strings or
- * <code>NULL</code> on error
- * 
- * @see scstrsplit_a()
- */
-sstr_t* scstrsplit(scstr_t string, scstr_t delim, ssize_t *count);
-
-/**
- * Splits a string into parts by using a delimiter string.
- * 
- * This function will return <code>NULL</code>, if one of the following happens:
- * <ul>
- *   <li>the string length is zero</li>
- *   <li>the delimeter length is zero</li>
- *   <li>the string equals the delimeter</li>
- *   <li>memory allocation fails</li>
- * </ul>
- * 
- * The integer referenced by <code>count</code> is used as input and determines
- * the maximum size of the resulting array, i.e. the maximum count of splits to
- * perform + 1.
- * 
- * The integer referenced by <code>count</code> is also used as output and is
- * set to
- * <ul>
- *   <li>-2, on memory allocation errors</li>
- *   <li>-1, if either the string or the delimiter is an empty string</li>
- *   <li>0, if the string equals the delimiter</li>
- *   <li>1, if the string does not contain the delimiter</li>
- *   <li>the count of array items, otherwise</li>
- * </ul>
- * 
- * If the string starts with the delimiter, the first item of the resulting
- * array will be an empty string.
- * 
- * If the string ends with the delimiter and the maximum list size is not
- * exceeded, the last array item will be an empty string.
- * In case the list size would be exceeded, the last array item will be the
- * remaining string after the last split, <i>including</i> the terminating
- * delimiter.
- * 
- * <b>Attention:</b> The array pointer <b>AND</b> all sstr_t.ptr of the array
- * items must be manually passed to <code>free()</code>. Use sstrsplit_a() with
- * an allocator to managed memory, to avoid this.
- *
- * @param string the string to split
- * @param delim  the delimiter string
- * @param count  IN: the maximum size of the resulting array (0 = no limit),
- *               OUT: the actual size of the array
- * @return a sstr_t array containing the split strings or
- * <code>NULL</code> on error
- * 
- * @see sstrsplit_a()
- */
-#define sstrsplit(string, delim, count) \
-    scstrsplit(SCSTR(string), SCSTR(delim), count)
-
-/**
- * Performing scstrsplit() using a UcxAllocator.
- * 
- * <i>Read the description of scstrsplit() for details.</i>
- * 
- * The memory for the sstr_t.ptr pointers of the array items and the memory for
- * the sstr_t array itself are allocated by using the UcxAllocator.malloc()
- * function.
- * 
- * @param allocator the UcxAllocator used for allocating memory
- * @param string the string to split
- * @param delim  the delimiter string
- * @param count  IN: the maximum size of the resulting array (0 = no limit),
- *               OUT: the actual size of the array
- * @return a sstr_t array containing the split strings or
- * <code>NULL</code> on error
- * 
- * @see scstrsplit()
- */
-sstr_t* scstrsplit_a(UcxAllocator *allocator, scstr_t string, scstr_t delim,
-        ssize_t *count);
-
-/**
- * Performing sstrsplit() using a UcxAllocator.
- * 
- * <i>Read the description of sstrsplit() for details.</i>
- * 
- * The memory for the sstr_t.ptr pointers of the array items and the memory for
- * the sstr_t array itself are allocated by using the UcxAllocator.malloc()
- * function.
- * 
- * @param allocator the UcxAllocator used for allocating memory
- * @param string the string to split
- * @param delim  the delimiter string
- * @param count  IN: the maximum size of the resulting array (0 = no limit),
- *               OUT: the actual size of the array
- * @return a sstr_t array containing the split strings or
- * <code>NULL</code> on error
- * 
- * @see sstrsplit()
- */
-#define sstrsplit_a(allocator, string, delim, count) \
-    scstrsplit_a(allocator, SCSTR(string), SCSTR(delim), count)
-
-/**
- * Compares two UCX strings with standard <code>memcmp()</code>.
- * 
- * At first it compares the scstr_t.length attribute of the two strings. The
- * <code>memcmp()</code> function is called, if and only if the lengths match.
- * 
- * @param s1 the first string
- * @param s2 the second string
- * @return -1, if the length of s1 is less than the length of s2 or 1, if the 
- * length of s1 is greater than the length of s2 or the result of
- * <code>memcmp()</code> otherwise (i.e. 0 if the strings match)
- */
-int scstrcmp(scstr_t s1, scstr_t s2);
-
-/**
- * Compares two UCX strings with standard <code>memcmp()</code>.
- * 
- * At first it compares the sstr_t.length attribute of the two strings. The
- * <code>memcmp()</code> function is called, if and only if the lengths match.
- * 
- * @param s1 the first string
- * @param s2 the second string
- * @return -1, if the length of s1 is less than the length of s2 or 1, if the 
- * length of s1 is greater than the length of s2 or the result of
- * <code>memcmp()</code> otherwise (i.e. 0 if the strings match)
- */
-#define sstrcmp(s1, s2) scstrcmp(SCSTR(s1), SCSTR(s2))
-
-/**
- * Compares two UCX strings ignoring the case.
- * 
- * At first it compares the scstr_t.length attribute of the two strings. If and
- * only if the lengths match, both strings are compared char by char ignoring
- * the case.
- * 
- * @param s1 the first string
- * @param s2 the second string
- * @return -1, if the length of s1 is less than the length of s2 or 1, if the 
- * length of s1 is greater than the length of s2 or the result of the platform
- * specific string comparison function ignoring the case.
- */
-int scstrcasecmp(scstr_t s1, scstr_t s2);
-
-/**
- * Compares two UCX strings ignoring the case.
- * 
- * At first it compares the sstr_t.length attribute of the two strings. If and
- * only if the lengths match, both strings are compared char by char ignoring
- * the case.
- * 
- * @param s1 the first string
- * @param s2 the second string
- * @return -1, if the length of s1 is less than the length of s2 or 1, if the 
- * length of s1 is greater than the length of s2 or the result of the platform
- * specific string comparison function ignoring the case.
- */
-#define sstrcasecmp(s1, s2) scstrcasecmp(SCSTR(s1), SCSTR(s2))
-
-/**
- * Creates a duplicate of the specified string.
- * 
- * The new sstr_t will contain a copy allocated by standard
- * <code>malloc()</code>. So developers <b>MUST</b> pass the sstr_t.ptr to
- * <code>free()</code>.
- * 
- * The sstr_t.ptr of the return value will <i>always</i> be <code>NULL</code>-
- * terminated and mutable, regardless of the argument.
- * 
- * @param string the string to duplicate
- * @return a duplicate of the string
- * @see scstrdup_a()
- */
-sstr_t scstrdup(scstr_t string);
-
-/**
- * Creates a duplicate of the specified string.
- * 
- * The new sstr_t will contain a copy allocated by standard
- * <code>malloc()</code>. So developers <b>MUST</b> pass the sstr_t.ptr to
- * <code>free()</code>.
- * 
- * The sstr_t.ptr of the return value will <i>always</i> be <code>NULL</code>-
- * terminated, regardless of the argument.
- * 
- * @param string the string to duplicate
- * @return a duplicate of the string
- * @see sstrdup_a()
- */
-#define sstrdup(string) scstrdup(SCSTR(string))
-
-/**
- * Creates a duplicate of the specified string using a UcxAllocator.
- * 
- * The new sstr_t will contain a copy allocated by the allocators
- * UcxAllocator.malloc() function. So it is implementation depended, whether the
- * returned sstr_t.ptr pointer must be passed to the allocators
- * UcxAllocator.free() function manually.
- * 
- * The sstr_t.ptr of the return value will <i>always</i> be <code>NULL</code>-
- * terminated and mutable, regardless of the argument.
- * 
- * @param allocator a valid instance of a UcxAllocator
- * @param string the string to duplicate
- * @return a duplicate of the string
- * @see scstrdup()
- */
-sstr_t scstrdup_a(UcxAllocator *allocator, scstr_t string);
-
-/**
- * Creates a duplicate of the specified string using a UcxAllocator.
- * 
- * The new sstr_t will contain a copy allocated by the allocators
- * UcxAllocator.malloc() function. So it is implementation depended, whether the
- * returned sstr_t.ptr pointer must be passed to the allocators
- * UcxAllocator.free() function manually.
- * 
- * The sstr_t.ptr of the return value will <i>always</i> be <code>NULL</code>-
- * terminated, regardless of the argument.
- * 
- * @param allocator a valid instance of a UcxAllocator
- * @param string the string to duplicate
- * @return a duplicate of the string
- * @see scstrdup()
- */
-#define sstrdup_a(allocator, string) scstrdup_a(allocator, SCSTR(string))
-
-
-/**
- * Omits leading and trailing spaces.
- * 
- * This function returns a new sstr_t containing a trimmed version of the
- * specified string.
- * 
- * <b>Note:</b> the new sstr_t references the same memory, thus you
- * <b>MUST NOT</b> pass the sstr_t.ptr of the return value to
- * <code>free()</code>. It is also highly recommended to avoid assignments like
- * <code>mystr = sstrtrim(mystr);</code> as you lose the reference to the
- * source string. Assignments of this type are only permitted, if the
- * sstr_t.ptr of the source string does not need to be freed or if another
- * reference to the source string exists.
- * 
- * @param string the string that shall be trimmed
- * @return a new sstr_t containing the trimmed string
- */
-sstr_t sstrtrim(sstr_t string);
-
-/**
- * Omits leading and trailing spaces.
- * 
- * This function returns a new scstr_t containing a trimmed version of the
- * specified string.
- * 
- * <b>Note:</b> the new scstr_t references the same memory, thus you
- * <b>MUST NOT</b> pass the scstr_t.ptr of the return value to
- * <code>free()</code>. It is also highly recommended to avoid assignments like
- * <code>mystr = scstrtrim(mystr);</code> as you lose the reference to the
- * source string. Assignments of this type are only permitted, if the
- * scstr_t.ptr of the source string does not need to be freed or if another
- * reference to the source string exists.
- * 
- * @param string the string that shall be trimmed
- * @return a new scstr_t containing the trimmed string
- */
-scstr_t scstrtrim(scstr_t string);
-
-/**
- * Checks, if a string has a specific prefix.
- * 
- * @param string the string to check
- * @param prefix the prefix the string should have
- * @return 1, if and only if the string has the specified prefix, 0 otherwise
- */
-int scstrprefix(scstr_t string, scstr_t prefix);
-
-/**
- * Checks, if a string has a specific prefix.
- * 
- * @param string the string to check
- * @param prefix the prefix the string should have
- * @return 1, if and only if the string has the specified prefix, 0 otherwise
- */
-#define sstrprefix(string, prefix) scstrprefix(SCSTR(string), SCSTR(prefix))
-
-/**
- * Checks, if a string has a specific suffix.
- * 
- * @param string the string to check
- * @param suffix the suffix the string should have
- * @return 1, if and only if the string has the specified suffix, 0 otherwise
- */
-int scstrsuffix(scstr_t string, scstr_t suffix);
-
-/**
- * Checks, if a string has a specific suffix.
- *
- * @param string the string to check
- * @param suffix the suffix the string should have
- * @return 1, if and only if the string has the specified suffix, 0 otherwise
- */
-#define sstrsuffix(string, suffix) scstrsuffix(SCSTR(string), SCSTR(suffix))
-
-/**
- * Checks, if a string has a specific prefix, ignoring the case.
- * 
- * @param string the string to check
- * @param prefix the prefix the string should have
- * @return 1, if and only if the string has the specified prefix, 0 otherwise
- */
-int scstrcaseprefix(scstr_t string, scstr_t prefix);
-
-/**
- * Checks, if a string has a specific prefix, ignoring the case.
- * 
- * @param string the string to check
- * @param prefix the prefix the string should have
- * @return 1, if and only if the string has the specified prefix, 0 otherwise
- */
-#define sstrcaseprefix(string, prefix) \
-  scstrcaseprefix(SCSTR(string), SCSTR(prefix))
-
-/**
- * Checks, if a string has a specific suffix, ignoring the case.
- * 
- * @param string the string to check
- * @param suffix the suffix the string should have
- * @return 1, if and only if the string has the specified suffix, 0 otherwise
- */
-int scstrcasesuffix(scstr_t string, scstr_t suffix);
-
-/**
- * Checks, if a string has a specific suffix, ignoring the case.
- *
- * @param string the string to check
- * @param suffix the suffix the string should have
- * @return 1, if and only if the string has the specified suffix, 0 otherwise
- */
-#define sstrcasesuffix(string, suffix) \
-  scstrcasesuffix(SCSTR(string), SCSTR(suffix))
-
-/**
- * Returns a lower case version of a string.
- * 
- * This function creates a duplicate of the input string, first
- * (see scstrdup()).
- * 
- * @param string the input string
- * @return the resulting lower case string
- * @see scstrdup()
- */
-sstr_t scstrlower(scstr_t string);
-
-/**
- * Returns a lower case version of a string.
- * 
- * This function creates a duplicate of the input string, first
- * (see sstrdup()).
- * 
- * @param string the input string
- * @return the resulting lower case string
- */
-#define sstrlower(string) scstrlower(SCSTR(string))
-
-/**
- * Returns a lower case version of a string.
- * 
-  * This function creates a duplicate of the input string, first
- * (see scstrdup_a()).
- * 
- * @param allocator the allocator used for duplicating the string
- * @param string the input string
- * @return the resulting lower case string
- * @see scstrdup_a()
- */
-sstr_t scstrlower_a(UcxAllocator *allocator, scstr_t string);
-
-
-/**
- * Returns a lower case version of a string.
- * 
- * This function creates a duplicate of the input string, first
- * (see sstrdup_a()).
- * 
- * @param allocator the allocator used for duplicating the string
- * @param string the input string
- * @return the resulting lower case string
- */
-#define sstrlower_a(allocator, string) scstrlower_a(allocator, SCSTR(string))
-
-/**
- * Returns a upper case version of a string.
- * 
- * This function creates a duplicate of the input string, first
- * (see scstrdup()).
- * 
- * @param string the input string
- * @return the resulting upper case string
- * @see scstrdup()
- */
-sstr_t scstrupper(scstr_t string);
-
-/**
- * Returns a upper case version of a string.
- * 
- * This function creates a duplicate of the input string, first
- * (see sstrdup()).
- * 
- * @param string the input string
- * @return the resulting upper case string
- */
-#define sstrupper(string) scstrupper(SCSTR(string))
-
-/**
- * Returns a upper case version of a string.
- * 
- * This function creates a duplicate of the input string, first
- * (see scstrdup_a()).
- * 
- * @param allocator the allocator used for duplicating the string
- * @param string the input string
- * @return the resulting upper case string
- * @see scstrdup_a()
- */
-sstr_t scstrupper_a(UcxAllocator *allocator, scstr_t string);
-
-/**
- * Returns a upper case version of a string.
- * 
- * This function creates a duplicate of the input string, first
- * (see sstrdup_a()).
- * 
- * @param allocator the allocator used for duplicating the string
- * @param string the input string
- * @return the resulting upper case string
- */
-#define sstrupper_a(allocator, string) scstrupper_a(allocator, string)
-
-
-/**
- * Replaces a pattern in a string with another string.
- *
- * The pattern is taken literally and is no regular expression.
- * Replaces at most <code>replmax</code> occurrences.
- *
- * The resulting string is allocated by the specified allocator. I.e. it
- * depends on the used allocator, whether the sstr_t.ptr must be freed
- * manually.
- *
- * If allocation fails, the sstr_t.ptr of the return value is NULL.
- *
- * @param allocator the allocator to use
- * @param str the string where replacements should be applied
- * @param pattern the pattern to search for
- * @param replacement the replacement string
- * @param replmax maximum number of replacements
- * @return the resulting string after applying the replacements
- */
-sstr_t scstrreplacen_a(UcxAllocator *allocator, scstr_t str,
-        scstr_t pattern, scstr_t replacement, size_t replmax);
-
-/**
- * Replaces a pattern in a string with another string.
- *
- * The pattern is taken literally and is no regular expression.
- * Replaces at most <code>replmax</code> occurrences.
- *
- * The sstr_t.ptr of the resulting string must be freed manually.
- *
- * If allocation fails, the sstr_t.ptr of the return value is NULL.
- *
- * @param str the string where replacements should be applied
- * @param pattern the pattern to search for
- * @param replacement the replacement string
- * @param replmax maximum number of replacements
- * @return the resulting string after applying the replacements
- */
-sstr_t scstrreplacen(scstr_t str, scstr_t pattern,
-        scstr_t replacement, size_t replmax);
-
-/**
- * Replaces a pattern in a string with another string.
- *
- * The pattern is taken literally and is no regular expression.
- * Replaces at most <code>replmax</code> occurrences.
- *
- * The resulting string is allocated by the specified allocator. I.e. it
- * depends on the used allocator, whether the sstr_t.ptr must be freed
- * manually.
- *
- * @param allocator the allocator to use
- * @param str the string where replacements should be applied
- * @param pattern the pattern to search for
- * @param replacement the replacement string
- * @param replmax maximum number of replacements
- * @return the resulting string after applying the replacements
- */
-#define sstrreplacen_a(allocator, str, pattern, replacement, replmax) \
-        scstrreplacen_a(allocator, SCSTR(str), SCSTR(pattern), \
-            SCSTR(replacement), replmax)
-
-/**
- * Replaces a pattern in a string with another string.
- *
- * The pattern is taken literally and is no regular expression.
- * Replaces at most <code>replmax</code> occurrences.
- *
- * The sstr_t.ptr of the resulting string must be freed manually.
- *
- * If allocation fails, the sstr_t.ptr of the return value is NULL.
- *
- * @param str the string where replacements should be applied
- * @param pattern the pattern to search for
- * @param replacement the replacement string
- * @param replmax maximum number of replacements
- * @return the resulting string after applying the replacements
- */
-#define sstrreplacen(str, pattern, replacement, replmax) \
-        scstrreplacen(SCSTR(str), SCSTR(pattern), SCSTR(replacement), replmax)
-
-/**
- * Replaces a pattern in a string with another string.
- *
- * The pattern is taken literally and is no regular expression.
- * Replaces at most <code>replmax</code> occurrences.
- *
- * The resulting string is allocated by the specified allocator. I.e. it
- * depends on the used allocator, whether the sstr_t.ptr must be freed
- * manually.
- *
- * If allocation fails, the sstr_t.ptr of the return value is NULL.
- *
- * @param allocator the allocator to use
- * @param str the string where replacements should be applied
- * @param pattern the pattern to search for
- * @param replacement the replacement string
- * @return the resulting string after applying the replacements
- */
-#define sstrreplace_a(allocator, str, pattern, replacement) \
-        scstrreplacen_a(allocator, SCSTR(str), SCSTR(pattern), \
-            SCSTR(replacement), SIZE_MAX)
-
-/**
- * Replaces a pattern in a string with another string.
- *
- * The pattern is taken literally and is no regular expression.
- * Replaces at most <code>replmax</code> occurrences.
- *
- * The sstr_t.ptr of the resulting string must be freed manually.
- *
- * If allocation fails, the sstr_t.ptr of the return value is NULL.
- *
- * @param str the string where replacements should be applied
- * @param pattern the pattern to search for
- * @param replacement the replacement string
- * @return the resulting string after applying the replacements
- */
-#define sstrreplace(str, pattern, replacement) \
-        scstrreplacen(SCSTR(str), SCSTR(pattern), SCSTR(replacement), SIZE_MAX)
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* UCX_STRING_H */
--- a/src/ucx/test.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,241 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
- 
-/**
- * @file: test.h
- * 
- * UCX Test Framework.
- * 
- * Usage of this test framework:
- *
- * **** IN HEADER FILE: ****
- *
- * <pre>
- * UCX_TEST(function_name);
- * UCX_TEST_SUBROUTINE(subroutine_name, paramlist); // optional
- * </pre>
- *
- * **** IN SOURCE FILE: ****
- * <pre>
- * UCX_TEST_SUBROUTINE(subroutine_name, paramlist) {
- *   // tests with UCX_TEST_ASSERT()
- * }
- * 
- * UCX_TEST(function_name) {
- *   // memory allocation and other stuff here
- *   #UCX_TEST_BEGIN
- *   // tests with UCX_TEST_ASSERT() and/or
- *   // calls with UCX_TEST_CALL_SUBROUTINE() here
- *   #UCX_TEST_END
- *   // cleanup of memory here
- * }
- * </pre>
- *
- * <b>Note:</b> if a test fails, a longjump is performed
- * back to the #UCX_TEST_BEGIN macro!
- * 
- * <b>Attention:</b> Do not call own functions within a test, that use
- * UCX_TEST_ASSERT() macros and are not defined by using UCX_TEST_SUBROUTINE().
- * 
- *
- * @author Mike Becker
- * @author Olaf Wintermann
- *
- */
-
-#ifndef UCX_TEST_H
-#define	UCX_TEST_H
-
-#include "ucx.h"
-#include <stdio.h>
-#include <string.h>
-#include <setjmp.h>
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-#ifndef __FUNCTION__
-
-/**
- * Alias for the <code>__func__</code> preprocessor macro.
- * Some compilers use <code>__func__</code> and others use __FUNCTION__.
- * We use __FUNCTION__ so we define it for those compilers which use
- * <code>__func__</code>.
- */
-#define __FUNCTION__ __func__
-#endif
-
-/** Type for the UcxTestSuite. */
-typedef struct UcxTestSuite UcxTestSuite;
-
-/** Pointer to a test function. */
-typedef void(*UcxTest)(UcxTestSuite*,FILE*);
-
-/** Type for the internal list of test cases. */
-typedef struct UcxTestList UcxTestList;
-
-/** Structure for the internal list of test cases. */
-struct UcxTestList {
-    
-    /** Test case. */
-    UcxTest test;
-    
-    /** Pointer to the next list element. */
-    UcxTestList *next;
-};
-
-/**
- * A test suite containing multiple test cases.
- */
-struct UcxTestSuite {
-    
-    /** The number of successful tests after the suite has been run. */
-    unsigned int success;
-    
-    /** The number of failed tests after the suite has been run. */
-    unsigned int failure;
-    
-    /**
-     * Internal list of test cases.
-     * Use ucx_test_register() to add tests to this list.
-     */
-    UcxTestList *tests;
-};
-
-/**
- * Creates a new test suite.
- * @return a new test suite
- */
-UcxTestSuite* ucx_test_suite_new();
-
-/**
- * Destroys a test suite.
- * @param suite the test suite to destroy
- */
-void ucx_test_suite_free(UcxTestSuite* suite);
-
-/**
- * Registers a test function with the specified test suite.
- * 
- * @param suite the suite, the test function shall be added to
- * @param test the test function to register
- * @return <code>EXIT_SUCCESS</code> on success or
- * <code>EXIT_FAILURE</code> on failure
- */
-int ucx_test_register(UcxTestSuite* suite, UcxTest test);
-
-/**
- * Runs a test suite and writes the test log to the specified stream.
- * @param suite the test suite to run
- * @param outstream the stream the log shall be written to
- */
-void ucx_test_run(UcxTestSuite* suite, FILE* outstream);
-
-/**
- * Macro for a #UcxTest function header.
- * 
- * Use this macro to declare and/or define a #UcxTest function.
- * 
- * @param name the name of the test function
- */
-#define UCX_TEST(name) void name(UcxTestSuite* _suite_,FILE *_output_)
-
-/**
- * Marks the begin of a test.
- * <b>Note:</b> Any UCX_TEST_ASSERT() calls must be performed <b>after</b>
- * #UCX_TEST_BEGIN.
- * 
- * @see #UCX_TEST_END
- */
-#define UCX_TEST_BEGIN fwrite("Running ", 1, 8, _output_);\
-        fwrite(__FUNCTION__, 1, strlen(__FUNCTION__), _output_);\
-        fwrite("... ", 1, 4, _output_);\
-        jmp_buf _env_; \
-        if (!setjmp(_env_)) {
-
-/**
- * Checks a test assertion.
- * If the assertion is correct, the test carries on. If the assertion is not
- * correct, the specified message (terminated by a dot and a line break) is
- * written to the test suites output stream.
- * @param condition the condition to check
- * @param message the message that shall be printed out on failure
- */
-#define UCX_TEST_ASSERT(condition,message) if (!(condition)) { \
-        fwrite(message".\n", 1, 2+strlen(message), _output_); \
-        _suite_->failure++; \
-        longjmp(_env_, 1);\
-    }
-
-/**
- * Macro for a test subroutine function header.
- * 
- * Use this to declare and/or define a subroutine that can be called by using
- * UCX_TEST_CALL_SUBROUTINE().
- * 
- * @param name the name of the subroutine
- * @param ... the parameter list
- * 
- * @see UCX_TEST_CALL_SUBROUTINE()
- */
-#define UCX_TEST_SUBROUTINE(name,...) void name(UcxTestSuite* _suite_,\
-        FILE *_output_, jmp_buf _env_, __VA_ARGS__)
-
-/**
- * Macro for calling a test subroutine.
- * 
- * Subroutines declared with UCX_TEST_SUBROUTINE() can be called by using this
- * macro.
- * 
- * <b>Note:</b> You may <b>only</b> call subroutines within a #UCX_TEST_BEGIN-
- * #UCX_TEST_END-block.
- * 
- * @param name the name of the subroutine
- * @param ... the argument list
- * 
- * @see UCX_TEST_SUBROUTINE()
- */
-#define UCX_TEST_CALL_SUBROUTINE(name,...) \
-        name(_suite_,_output_,_env_,__VA_ARGS__);
-
-/**
- * Marks the end of a test.
- * <b>Note:</b> Any UCX_TEST_ASSERT() calls must be performed <b>before</b>
- * #UCX_TEST_END.
- * 
- * @see #UCX_TEST_BEGIN
- */
-#define UCX_TEST_END fwrite("success.\n", 1, 9, _output_); _suite_->success++;}
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* UCX_TEST_H */
-
--- a/src/ucx/ucx.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,204 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-/**
- * Main UCX Header providing most common definitions.
- * 
- * @file   ucx.h
- * @author Mike Becker
- * @author Olaf Wintermann
- */
-
-#ifndef UCX_H
-#define	UCX_H
-
-/** Major UCX version as integer constant. */
-#define UCX_VERSION_MAJOR   2
-
-/** Minor UCX version as integer constant. */
-#define UCX_VERSION_MINOR   1
-
-/** Version constant which ensures to increase monotonically. */
-#define UCX_VERSION (((UCX_VERSION_MAJOR)<<16)|UCX_VERSION_MINOR)
-
-#include <stdlib.h>
-#include <stdint.h>
-
-#ifdef _WIN32
-#if !(defined __ssize_t_defined || defined _SSIZE_T_)
-#include <BaseTsd.h>
-typedef SSIZE_T ssize_t;
-#define __ssize_t_defined
-#define _SSIZE_T_
-#endif /* __ssize_t_defined and _SSIZE_T */
-#else /* !_WIN32 */
-#include <sys/types.h>
-#endif /* _WIN32 */
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-    
-
-/**
- * A function pointer to a destructor function.
- * @see ucx_mempool_setdestr()
- * @see ucx_mempool_regdestr()
- */
-typedef void(*ucx_destructor)(void*);
-
-/**
- * Function pointer to a compare function.
- * 
- * The compare function shall take three arguments: the two values that shall be
- * compared and optional additional data.
- * The function shall then return -1 if the first argument is less than the
- * second argument, 1 if the first argument is greater than the second argument
- * and 0 if both arguments are equal. If the third argument is
- * <code>NULL</code>, it shall be ignored.
- */
-typedef int(*cmp_func)(const void*,const void*,void*);
-
-/**
- * Function pointer to a distance function.
- * 
- * The distance function shall take three arguments: the two values for which
- * the distance shall be computed and optional additional data.
- * The function shall then return the signed distance as integer value.
- */
-typedef intmax_t(*distance_func)(const void*,const void*,void*);
-
-/**
- * Function pointer to a copy function.
- * 
- * The copy function shall create a copy of the first argument and may use
- * additional data provided by the second argument. If the second argument is
- * <code>NULL</code>, it shall be ignored.
-
- * <b>Attention:</b> if pointers returned by functions of this type may be
- * passed to <code>free()</code> depends on the implementation of the
- * respective <code>copy_func</code>.
- */
-typedef void*(*copy_func)(const void*,void*);
-
-/**
- * Function pointer to a write function.
- * 
- * The signature of the write function shall be compatible to the signature
- * of standard <code>fwrite</code>, though it may use arbitrary data types for
- * source and destination.
- * 
- * The arguments shall contain (in ascending order): a pointer to the source,
- * the length of one element, the element count and a pointer to the
- * destination.
- */
-typedef size_t(*write_func)(const void*, size_t, size_t, void*);
-
-/**
- * Function pointer to a read function.
- * 
- * The signature of the read function shall be compatible to the signature
- * of standard <code>fread</code>, though it may use arbitrary data types for
- * source and destination.
- * 
- * The arguments shall contain (in ascending order): a pointer to the
- * destination, the length of one element, the element count and a pointer to
- * the source.
- */
-typedef size_t(*read_func)(void*, size_t, size_t, void*);
-
-
-
-#if __GNUC__ >= 5 || defined(__clang__)
-#define UCX_MUL_BUILTIN
-
-#if __WORDSIZE == 32
-/**
- * Alias for <code>__builtin_umul_overflow</code>.
- * 
- * Performs a multiplication of size_t values and checks for overflow.
- * 
- * @param a first operand
- * @param b second operand
- * @param result a pointer to a size_t, where the result should
- * be stored
- * @return zero, if no overflow occurred and the result is correct, non-zero
- * otherwise
- */
-#define ucx_szmul(a, b, result) __builtin_umul_overflow(a, b, result)
-#else /* __WORDSIZE != 32 */
-/**
- * Alias for <code>__builtin_umull_overflow</code>.
- * 
- * Performs a multiplication of size_t values and checks for overflow.
- * 
- * @param a first operand
- * @param b second operand
- * @param result a pointer to a size_t, where the result should
- * be stored
- * @return zero, if no overflow occurred and the result is correct, non-zero
- * otherwise
- */
-#define ucx_szmul(a, b, result) __builtin_umull_overflow(a, b, result)
-#endif /* __WORDSIZE */
-
-#else /* no GNUC or clang bultin */
-
-/**
- * Performs a multiplication of size_t values and checks for overflow.
-  *
- * @param a first operand
- * @param b second operand
- * @param result a pointer to a size_t, where the result should
- * be stored
- * @return zero, if no overflow occurred and the result is correct, non-zero
- * otherwise
- */
-#define ucx_szmul(a, b, result) ucx_szmul_impl(a, b, result)
-
-/**
- * Performs a multiplication of size_t values and checks for overflow.
- *
- * This is a custom implementation in case there is no compiler builtin
- * available.
- *
- * @param a first operand
- * @param b second operand
- * @param result a pointer to a size_t where the result should be stored
- * @return zero, if no overflow occurred and the result is correct, non-zero
- * otherwise
- */
-int ucx_szmul_impl(size_t a, size_t b, size_t *result);
-
-#endif
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* UCX_H */
-
--- a/src/ucx/utils.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,508 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * @file utils.h
- * 
- * Compare, copy and printf functions.
- * 
- * @author Mike Becker
- * @author Olaf Wintermann
- */
-
-#ifndef UCX_UTILS_H
-#define UCX_UTILS_H
-
-#include "ucx.h"
-#include "string.h"
-#include "allocator.h"
-#include <inttypes.h>
-#include <string.h>
-#include <stdarg.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * Default buffer size for ucx_stream_copy() and ucx_stream_ncopy().
- */
-#define UCX_STREAM_COPY_BUFSIZE 4096
-
-/**
- * Copies a string.
- * @param s the string to copy
- * @param data omitted
- * @return a pointer to a copy of s1 that can be passed to free(void*)
- */
-void *ucx_strcpy(const void *s, void *data);
-
-/**
- * Copies a memory area.
- * @param m a pointer to the memory area
- * @param n a pointer to the size_t containing the size of the memory area
- * @return a pointer to a copy of the specified memory area that can
- * be passed to free(void*)
- */
-void *ucx_memcpy(const void *m, void *n);
-
-
-/**
- * Reads data from a stream and writes it to another stream.
- * 
- * @param src the source stream
- * @param dest the destination stream
- * @param rfnc the read function
- * @param wfnc the write function
- * @param buf a pointer to the copy buffer or <code>NULL</code> if a buffer
- * shall be implicitly created on the heap
- * @param bufsize the size of the copy buffer - if <code>NULL</code> was
- * provided for <code>buf</code>, this is the size of the buffer that shall be
- * implicitly created
- * @param n the maximum number of bytes that shall be copied
- * @return the total number of bytes copied
-  */
-size_t ucx_stream_bncopy(void *src, void *dest, read_func rfnc, write_func wfnc,
-        char* buf, size_t bufsize, size_t n);
-
-/**
- * Shorthand for an unbounded ucx_stream_bncopy call using a default buffer.
- * 
- * @param src the source stream
- * @param dest the destination stream
- * @param rfnc the read function
- * @param wfnc the write function
- * @return total number of bytes copied
- * 
- * @see #UCX_STREAM_COPY_BUFSIZE
- */
-#define ucx_stream_copy(src,dest,rfnc,wfnc) ucx_stream_bncopy(\
-        src, dest, (read_func)rfnc, (write_func)wfnc, \
-        NULL, UCX_STREAM_COPY_BUFSIZE, (size_t)-1)
-
-/**
- * Shorthand for ucx_stream_bncopy using a default copy buffer.
- * 
- * @param src the source stream
- * @param dest the destination stream
- * @param rfnc the read function
- * @param wfnc the write function
- * @param n maximum number of bytes that shall be copied
- * @return total number of bytes copied
- */
-#define ucx_stream_ncopy(src,dest,rfnc,wfnc, n) ucx_stream_bncopy(\
-        src, dest, (read_func)rfnc, (write_func)wfnc, \
-        NULL, UCX_STREAM_COPY_BUFSIZE, n)
-
-/**
- * Shorthand for an unbounded ucx_stream_bncopy call using the specified buffer.
- * 
- * @param src the source stream
- * @param dest the destination stream
- * @param rfnc the read function
- * @param wfnc the write function
- * @param buf a pointer to the copy buffer or <code>NULL</code> if a buffer
- * shall be implicitly created on the heap
- * @param bufsize the size of the copy buffer - if <code>NULL</code> was
- * provided for <code>buf</code>, this is the size of the buffer that shall be
- * implicitly created
- * @return total number of bytes copied
- */
-#define ucx_stream_bcopy(src,dest,rfnc,wfnc, buf, bufsize) ucx_stream_bncopy(\
-        src, dest, (read_func)rfnc, (write_func)wfnc, \
-        buf, bufsize, (size_t)-1)
-
-/**
- * Wraps the strcmp function.
- * @param s1 string one
- * @param s2 string two
- * @param data omitted
- * @return the result of strcmp(s1, s2)
- */
-int ucx_cmp_str(const void *s1, const void *s2, void *data);
-
-/**
- * Wraps the strncmp function.
- * @param s1 string one
- * @param s2 string two
- * @param n a pointer to the size_t containing the third strncmp parameter
- * @return the result of strncmp(s1, s2, *n)
- */
-int ucx_cmp_strn(const void *s1, const void *s2, void *n);
-
-/**
- * Wraps the sstrcmp function.
- * @param s1 sstr one
- * @param s2 sstr two
- * @param data ignored
- * @return the result of sstrcmp(s1, s2)
- */
-int ucx_cmp_sstr(const void *s1, const void *s2, void *data);
-
-/**
- * Compares two integers of type int.
- * @param i1 pointer to integer one
- * @param i2 pointer to integer two
- * @param data omitted
- * @return -1, if *i1 is less than *i2, 0 if both are equal,
- * 1 if *i1 is greater than *i2
- */
-int ucx_cmp_int(const void *i1, const void *i2, void *data);
-
-/**
- * Compares two integers of type long int.
- * @param i1 pointer to long integer one
- * @param i2 pointer to long integer two
- * @param data omitted
- * @return -1, if *i1 is less than *i2, 0 if both are equal,
- * 1 if *i1 is greater than *i2
- */
-int ucx_cmp_longint(const void *i1, const void *i2, void *data);
-
-/**
- * Compares two integers of type long long.
- * @param i1 pointer to long long one
- * @param i2 pointer to long long two
- * @param data omitted
- * @return -1, if *i1 is less than *i2, 0 if both are equal,
- * 1 if *i1 is greater than *i2
- */
-int ucx_cmp_longlong(const void *i1, const void *i2, void *data);
-
-/**
- * Compares two integers of type int16_t.
- * @param i1 pointer to int16_t one
- * @param i2 pointer to int16_t two
- * @param data omitted
- * @return -1, if *i1 is less than *i2, 0 if both are equal,
- * 1 if *i1 is greater than *i2
- */
-int ucx_cmp_int16(const void *i1, const void *i2, void *data);
-
-/**
- * Compares two integers of type int32_t.
- * @param i1 pointer to int32_t one
- * @param i2 pointer to int32_t two
- * @param data omitted
- * @return -1, if *i1 is less than *i2, 0 if both are equal,
- * 1 if *i1 is greater than *i2
- */
-int ucx_cmp_int32(const void *i1, const void *i2, void *data);
-
-/**
- * Compares two integers of type int64_t.
- * @param i1 pointer to int64_t one
- * @param i2 pointer to int64_t two
- * @param data omitted
- * @return -1, if *i1 is less than *i2, 0 if both are equal,
- * 1 if *i1 is greater than *i2
- */
-int ucx_cmp_int64(const void *i1, const void *i2, void *data);
-
-/**
- * Compares two integers of type unsigned int.
- * @param i1 pointer to unsigned integer one
- * @param i2 pointer to unsigned integer two
- * @param data omitted
- * @return -1, if *i1 is less than *i2, 0 if both are equal,
- * 1 if *i1 is greater than *i2
- */
-int ucx_cmp_uint(const void *i1, const void *i2, void *data);
-
-/**
- * Compares two integers of type unsigned long int.
- * @param i1 pointer to unsigned long integer one
- * @param i2 pointer to unsigned long integer two
- * @param data omitted
- * @return -1, if *i1 is less than *i2, 0 if both are equal,
- * 1 if *i1 is greater than *i2
- */
-int ucx_cmp_ulongint(const void *i1, const void *i2, void *data);
-
-/**
- * Compares two integers of type unsigned long long.
- * @param i1 pointer to unsigned long long one
- * @param i2 pointer to unsigned long long two
- * @param data omitted
- * @return -1, if *i1 is less than *i2, 0 if both are equal,
- * 1 if *i1 is greater than *i2
- */
-int ucx_cmp_ulonglong(const void *i1, const void *i2, void *data);
-
-/**
- * Compares two integers of type uint16_t.
- * @param i1 pointer to uint16_t one
- * @param i2 pointer to uint16_t two
- * @param data omitted
- * @return -1, if *i1 is less than *i2, 0 if both are equal,
- * 1 if *i1 is greater than *i2
- */
-int ucx_cmp_uint16(const void *i1, const void *i2, void *data);
-
-/**
- * Compares two integers of type uint32_t.
- * @param i1 pointer to uint32_t one
- * @param i2 pointer to uint32_t two
- * @param data omitted
- * @return -1, if *i1 is less than *i2, 0 if both are equal,
- * 1 if *i1 is greater than *i2
- */
-int ucx_cmp_uint32(const void *i1, const void *i2, void *data);
-
-/**
- * Compares two integers of type uint64_t.
- * @param i1 pointer to uint64_t one
- * @param i2 pointer to uint64_t two
- * @param data omitted
- * @return -1, if *i1 is less than *i2, 0 if both are equal,
- * 1 if *i1 is greater than *i2
- */
-int ucx_cmp_uint64(const void *i1, const void *i2, void *data);
-
-/**
- * Distance function for integers of type int.
- * @param i1 pointer to integer one
- * @param i2 pointer to integer two
- * @param data omitted
- * @return i1 minus i2
- */
-intmax_t ucx_dist_int(const void *i1, const void *i2, void *data);
-
-/**
- * Distance function for integers of type long int.
- * @param i1 pointer to long integer one
- * @param i2 pointer to long integer two
- * @param data omitted
- * @return i1 minus i2
- */
-intmax_t ucx_dist_longint(const void *i1, const void *i2, void *data);
-
-/**
- * Distance function for integers of type long long.
- * @param i1 pointer to long long one
- * @param i2 pointer to long long two
- * @param data omitted
- * @return i1 minus i2
- */
-intmax_t ucx_dist_longlong(const void *i1, const void *i2, void *data);
-
-/**
- * Distance function for integers of type int16_t.
- * @param i1 pointer to int16_t one
- * @param i2 pointer to int16_t two
- * @param data omitted
- * @return i1 minus i2
- */
-intmax_t ucx_dist_int16(const void *i1, const void *i2, void *data);
-
-/**
- * Distance function for integers of type int32_t.
- * @param i1 pointer to int32_t one
- * @param i2 pointer to int32_t two
- * @param data omitted
- * @return i1 minus i2
- */
-intmax_t ucx_dist_int32(const void *i1, const void *i2, void *data);
-
-/**
- * Distance function for integers of type int64_t.
- * @param i1 pointer to int64_t one
- * @param i2 pointer to int64_t two
- * @param data omitted
- * @return i1 minus i2
- */
-intmax_t ucx_dist_int64(const void *i1, const void *i2, void *data);
-
-/**
- * Distance function for integers of type unsigned int.
- * @param i1 pointer to unsigned integer one
- * @param i2 pointer to unsigned integer two
- * @param data omitted
- * @return i1 minus i2
- */
-intmax_t ucx_dist_uint(const void *i1, const void *i2, void *data);
-
-/**
- * Distance function for integers of type unsigned long int.
- * @param i1 pointer to unsigned long integer one
- * @param i2 pointer to unsigned long integer two
- * @param data omitted
- * @return i1 minus i2
- */
-intmax_t ucx_dist_ulongint(const void *i1, const void *i2, void *data);
-
-/**
- * Distance function for integers of type unsigned long long.
- * @param i1 pointer to unsigned long long one
- * @param i2 pointer to unsigned long long two
- * @param data omitted
- * @return i1 minus i2
- */
-intmax_t ucx_dist_ulonglong(const void *i1, const void *i2, void *data);
-
-/**
- * Distance function for integers of type uint16_t.
- * @param i1 pointer to uint16_t one
- * @param i2 pointer to uint16_t two
- * @param data omitted
- * @return i1 minus i2
- */
-intmax_t ucx_dist_uint16(const void *i1, const void *i2, void *data);
-
-/**
- * Distance function for integers of type uint32_t.
- * @param i1 pointer to uint32_t one
- * @param i2 pointer to uint32_t two
- * @param data omitted
- * @return i1 minus i2
- */
-intmax_t ucx_dist_uint32(const void *i1, const void *i2, void *data);
-
-/**
- * Distance function for integers of type uint64_t.
- * @param i1 pointer to uint64_t one
- * @param i2 pointer to uint64_t two
- * @param data omitted
- * @return i1 minus i2
- */
-intmax_t ucx_dist_uint64(const void *i1, const void *i2, void *data);
-
-/**
- * Compares two real numbers of type float.
- * @param f1 pointer to float one
- * @param f2 pointer to float two
- * @param data if provided: a pointer to precision (default: 1e-6f)
- * @return -1, if *f1 is less than *f2, 0 if both are equal,
- * 1 if *f1 is greater than *f2
- */
-
-int ucx_cmp_float(const void *f1, const void *f2, void *data);
-
-/**
- * Compares two real numbers of type double.
- * @param d1 pointer to double one
- * @param d2 pointer to double two
- * @param data if provided: a pointer to precision (default: 1e-14)
- * @return -1, if *d1 is less than *d2, 0 if both are equal,
- * 1 if *d1 is greater than *d2
- */
-int ucx_cmp_double(const void *d1, const void *d2, void *data);
-
-/**
- * Compares two pointers.
- * @param ptr1 pointer one
- * @param ptr2 pointer two
- * @param data omitted
- * @return -1 if ptr1 is less than ptr2, 0 if both are equal,
- * 1 if ptr1 is greater than ptr2
- */
-int ucx_cmp_ptr(const void *ptr1, const void *ptr2, void *data);
-
-/**
- * Compares two memory areas.
- * @param ptr1 pointer one
- * @param ptr2 pointer two
- * @param n a pointer to the size_t containing the third parameter for memcmp
- * @return the result of memcmp(ptr1, ptr2, *n)
- */
-int ucx_cmp_mem(const void *ptr1, const void *ptr2, void *n);
-
-/**
- * A <code>printf()</code> like function which writes the output to a stream by
- * using a write_func().
- * @param stream the stream the data is written to
- * @param wfc the write function
- * @param fmt format string
- * @param ... additional arguments
- * @return the total number of bytes written
- */
-int ucx_fprintf(void *stream, write_func wfc, const char *fmt, ...);
-
-/**
- * <code>va_list</code> version of ucx_fprintf().
- * @param stream the stream the data is written to
- * @param wfc the write function
- * @param fmt format string
- * @param ap argument list
- * @return the total number of bytes written
- * @see ucx_fprintf()
- */
-int ucx_vfprintf(void *stream, write_func wfc, const char *fmt, va_list ap);
-
-/**
- * A <code>printf()</code> like function which allocates space for a sstr_t
- * the result is written to.
- * 
- * <b>Attention</b>: The sstr_t data is allocated with the allocators
- * ucx_allocator_malloc() function. So it is implementation dependent, if
- * the returned sstr_t.ptr pointer must be passed to the allocators
- * ucx_allocator_free() function manually.
- * 
- * <b>Note</b>: The sstr_t.ptr of the return value will <i>always</i> be
- * <code>NULL</code>-terminated.
- * 
- * @param allocator the UcxAllocator used for allocating the result sstr_t
- * @param fmt format string
- * @param ... additional arguments
- * @return a sstr_t containing the formatted string
- */
-sstr_t ucx_asprintf(UcxAllocator *allocator, const char *fmt, ...);
-
-/**
- * <code>va_list</code> version of ucx_asprintf().
- * 
- * @param allocator the UcxAllocator used for allocating the result sstr_t
- * @param fmt format string
- * @param ap argument list
- * @return a sstr_t containing the formatted string
- * @see ucx_asprintf()
- */
-sstr_t ucx_vasprintf(UcxAllocator *allocator, const char *fmt, va_list ap);
-
-/** Shortcut for ucx_asprintf() with default allocator. */
-#define ucx_sprintf(...) \
-    ucx_asprintf(ucx_default_allocator(), __VA_ARGS__)
-
-/**
- * A <code>printf()</code> like function which writes the output to a
- * UcxBuffer.
- * 
- * @param buffer the buffer the data is written to
- * @param ... format string and additional arguments
- * @return the total number of bytes written
- * @see ucx_fprintf()
- */
-#define ucx_bprintf(buffer, ...) ucx_fprintf((UcxBuffer*)buffer, \
-        (write_func)ucx_buffer_write, __VA_ARGS__)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* UCX_UTILS_H */
-
--- a/src/utils.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,448 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "ucx/utils.h"
-
-#include <math.h>
-#include <stdio.h>
-#include <limits.h>
-#include <errno.h>
-
-/* COPY FUCNTIONS */
-void* ucx_strcpy(const void* s, void* data) {
-    const char *str = (const char*) s;
-    size_t n = 1+strlen(str);
-    char *cpy = (char*) malloc(n);
-    memcpy(cpy, str, n);
-    return cpy;
-}
-
-void* ucx_memcpy(const void* m, void* n) {
-    size_t k = *((size_t*)n);
-    void *cpy = malloc(k);
-    memcpy(cpy, m, k);
-    return cpy;
-}
-
-size_t ucx_stream_bncopy(void *src, void *dest, read_func readfnc,
-        write_func writefnc, char* buf, size_t bufsize, size_t n) {
-    if(n == 0 || bufsize == 0) {
-        return 0;
-    }
-    
-    char *lbuf;    
-    size_t ncp = 0;
-    
-    if(buf) {
-        lbuf = buf;
-    } else {
-        lbuf = (char*)malloc(bufsize);
-        if(lbuf == NULL) {
-            return 0;
-        }
-    }
-    
-    size_t r;
-    size_t rn = bufsize > n ? n : bufsize;
-    while((r = readfnc(lbuf, 1, rn, src)) != 0) {
-        r = writefnc(lbuf, 1, r, dest);
-        ncp += r;
-        n -= r;
-        rn = bufsize > n ? n : bufsize;
-        if(r == 0 || n == 0) {
-            break;
-        }
-    }
-    
-    if (lbuf != buf) {
-        free(lbuf);
-    }
-    
-    return ncp;
-}
-
-/* COMPARE FUNCTIONS */
-
-int ucx_cmp_str(const void *s1, const void *s2, void *data) {
-    return strcmp((const char*)s1, (const char*)s2);
-}
-
-int ucx_cmp_strn(const void *s1, const void *s2, void *n) {
-    return strncmp((const char*)s1, (const char*)s2, *((size_t*) n));
-}
-
-int ucx_cmp_sstr(const void *s1, const void *s2, void *data) {
-    sstr_t a = *(const sstr_t*) s1;
-    sstr_t b = *(const sstr_t*) s2;
-    return sstrcmp(a, b);
-}
-
-int ucx_cmp_int(const void *i1, const void *i2, void *data) {
-   int a = *((const int*) i1);
-   int b = *((const int*) i2);
-   if (a == b) {
-       return 0;
-   } else {
-       return a < b ? -1 : 1;
-   }
-}
-
-int ucx_cmp_longint(const void *i1, const void *i2, void *data) {
-   long int a = *((const long int*) i1);
-   long int b = *((const long int*) i2);
-   if (a == b) {
-       return 0;
-   } else {
-       return a < b ? -1 : 1;
-   }
-}
-
-int ucx_cmp_longlong(const void *i1, const void *i2, void *data) {
-   long long a = *((const long long*) i1);
-   long long b = *((const long long*) i2);
-   if (a == b) {
-       return 0;
-   } else {
-       return a < b ? -1 : 1;
-   }
-}
-
-int ucx_cmp_int16(const void *i1, const void *i2, void *data) {
-   int16_t a = *((const int16_t*) i1);
-   int16_t b = *((const int16_t*) i2);
-   if (a == b) {
-       return 0;
-   } else {
-       return a < b ? -1 : 1;
-   }
-}
-
-int ucx_cmp_int32(const void *i1, const void *i2, void *data) {
-   int32_t a = *((const int32_t*) i1);
-   int32_t b = *((const int32_t*) i2);
-   if (a == b) {
-       return 0;
-   } else {
-       return a < b ? -1 : 1;
-   }
-}
-
-int ucx_cmp_int64(const void *i1, const void *i2, void *data) {
-   int64_t a = *((const int64_t*) i1);
-   int64_t b = *((const int64_t*) i2);
-   if (a == b) {
-       return 0;
-   } else {
-       return a < b ? -1 : 1;
-   }
-}
-
-int ucx_cmp_uint(const void *i1, const void *i2, void *data) {
-   unsigned int a = *((const unsigned int*) i1);
-   unsigned int b = *((const unsigned int*) i2);
-   if (a == b) {
-       return 0;
-   } else {
-       return a < b ? -1 : 1;
-   }
-}
-
-int ucx_cmp_ulongint(const void *i1, const void *i2, void *data) {
-   unsigned long int a = *((const unsigned long int*) i1);
-   unsigned long int b = *((const unsigned long int*) i2);
-   if (a == b) {
-       return 0;
-   } else {
-       return a < b ? -1 : 1;
-   }
-}
-
-int ucx_cmp_ulonglong(const void *i1, const void *i2, void *data) {
-   unsigned long long a = *((const unsigned long long*) i1);
-   unsigned long long b = *((const unsigned long long*) i2);
-   if (a == b) {
-       return 0;
-   } else {
-       return a < b ? -1 : 1;
-   }
-}
-
-int ucx_cmp_uint16(const void *i1, const void *i2, void *data) {
-   uint16_t a = *((const uint16_t*) i1);
-   uint16_t b = *((const uint16_t*) i2);
-   if (a == b) {
-       return 0;
-   } else {
-       return a < b ? -1 : 1;
-   }
-}
-
-int ucx_cmp_uint32(const void *i1, const void *i2, void *data) {
-   uint32_t a = *((const uint32_t*) i1);
-   uint32_t b = *((const uint32_t*) i2);
-   if (a == b) {
-       return 0;
-   } else {
-       return a < b ? -1 : 1;
-   }
-}
-
-int ucx_cmp_uint64(const void *i1, const void *i2, void *data) {
-   uint64_t a = *((const uint64_t*) i1);
-   uint64_t b = *((const uint64_t*) i2);
-   if (a == b) {
-       return 0;
-   } else {
-       return a < b ? -1 : 1;
-   }
-}
-
-intmax_t ucx_dist_int(const void *i1, const void *i2, void *data) {
-   intmax_t a = *((const int*) i1);
-   intmax_t b = *((const int*) i2);
-   return a - b;
-}
-
-intmax_t ucx_dist_longint(const void *i1, const void *i2, void *data) {
-   intmax_t a = *((const long int*) i1);
-   intmax_t b = *((const long int*) i2);
-   return a - b;
-}
-
-intmax_t ucx_dist_longlong(const void *i1, const void *i2, void *data) {
-   intmax_t a = *((const long long*) i1);
-   intmax_t b = *((const long long*) i2);
-   return a - b;
-}
-
-intmax_t ucx_dist_int16(const void *i1, const void *i2, void *data) {
-   intmax_t a = *((const int16_t*) i1);
-   intmax_t b = *((const int16_t*) i2);
-   return a - b;
-}
-
-intmax_t ucx_dist_int32(const void *i1, const void *i2, void *data) {
-   intmax_t a = *((const int32_t*) i1);
-   intmax_t b = *((const int32_t*) i2);
-   return a - b;
-}
-
-intmax_t ucx_dist_int64(const void *i1, const void *i2, void *data) {
-   intmax_t a = *((const int64_t*) i1);
-   intmax_t b = *((const int64_t*) i2);
-   return a - b;
-}
-
-intmax_t ucx_dist_uint(const void *i1, const void *i2, void *data) {
-   uintmax_t a = *((const unsigned int*) i1);
-   uintmax_t b = *((const unsigned int*) i2);
-   return a > b ? (intmax_t)(a - b) : -(intmax_t)(b - a);
-}
-
-intmax_t ucx_dist_ulongint(const void *i1, const void *i2, void *data) {
-   uintmax_t a = *((const unsigned long int*) i1);
-   uintmax_t b = *((const unsigned long int*) i2);
-   return a > b ? (intmax_t)(a - b) : -(intmax_t)(b - a);
-}
-
-intmax_t ucx_dist_ulonglong(const void *i1, const void *i2, void *data) {
-   uintmax_t a = *((const unsigned long long*) i1);
-   uintmax_t b = *((const unsigned long long*) i2);
-   return a > b ? (intmax_t)(a - b) : -(intmax_t)(b - a);
-}
-
-intmax_t ucx_dist_uint16(const void *i1, const void *i2, void *data) {
-   uintmax_t a = *((const uint16_t*) i1);
-   uintmax_t b = *((const uint16_t*) i2);
-   return a > b ? (intmax_t)(a - b) : -(intmax_t)(b - a);
-}
-
-intmax_t ucx_dist_uint32(const void *i1, const void *i2, void *data) {
-   uintmax_t a = *((const uint32_t*) i1);
-   uintmax_t b = *((const uint32_t*) i2);
-   return a > b ? (intmax_t)(a - b) : -(intmax_t)(b - a);
-}
-
-intmax_t ucx_dist_uint64(const void *i1, const void *i2, void *data) {
-   uintmax_t a = *((const uint64_t*) i1);
-   uintmax_t b = *((const uint64_t*) i2);
-   return a > b ? (intmax_t)(a - b) : -(intmax_t)(b - a);
-}
-
-int ucx_cmp_float(const void *f1, const void *f2, void *epsilon) {
-   float a = *((const float*) f1);
-   float b = *((const float*) f2);
-   float e = !epsilon ? 1e-6f : *((float*)epsilon);
-   if (fabsf(a - b) < e) {
-       return 0;
-   } else {
-       return a < b ? -1 : 1;
-   }
-}
-
-int ucx_cmp_double(const void *d1, const void *d2, void *epsilon) {
-   double a = *((const double*) d1);
-   double b = *((const double*) d2);
-   double e = !epsilon ? 1e-14 : *((double*)epsilon);
-   if (fabs(a - b) < e) {
-       return 0;
-   } else {
-       return a < b ? -1 : 1;
-   }
-}
-
-int ucx_cmp_ptr(const void *ptr1, const void *ptr2, void *data) {
-    const intptr_t p1 = (const intptr_t) ptr1;
-    const intptr_t p2 = (const intptr_t) ptr2;
-    if (p1 == p2) {
-        return 0;
-    } else {
-        return p1  < p2 ? -1 : 1;
-    }
-}
-
-int ucx_cmp_mem(const void *ptr1, const void *ptr2, void *n) {
-    return memcmp(ptr1, ptr2, *((size_t*)n));
-}
-
-/* PRINTF FUNCTIONS */
-
-#ifdef va_copy
-#define UCX_PRINTF_BUFSIZE 256
-#else
-#pragma message("WARNING: C99 va_copy macro not supported by this platform" \
-                " - limiting ucx_*printf to 2 KiB")
-#define UCX_PRINTF_BUFSIZE 0x800
-#endif
-
-int ucx_fprintf(void *stream, write_func wfc, const char *fmt, ...) {
-    int ret;
-    va_list ap;
-    va_start(ap, fmt);
-    ret = ucx_vfprintf(stream, wfc, fmt, ap);
-    va_end(ap);
-    return ret;
-}
-
-int ucx_vfprintf(void *stream, write_func wfc, const char *fmt, va_list ap) {
-    char buf[UCX_PRINTF_BUFSIZE];
-#ifdef va_copy
-    va_list ap2;
-    va_copy(ap2, ap);
-    int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap);
-    if (ret < 0) {
-        return ret;
-    } else if (ret < UCX_PRINTF_BUFSIZE) {
-        return (int)wfc(buf, 1, ret, stream);
-    } else {
-        if (ret == INT_MAX) {
-            errno = ENOMEM;
-            return -1;
-        }
-        
-        int len = ret + 1;
-        char *newbuf = (char*)malloc(len);
-        if (!newbuf) {
-            return -1;
-        }
-        
-        ret = vsnprintf(newbuf, len, fmt, ap2);
-        if (ret > 0) {
-            ret = (int)wfc(newbuf, 1, ret, stream);
-        }
-        free(newbuf);
-    }
-    return ret;
-#else
-    int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap);
-    if (ret < 0) {
-        return ret;
-    } else if (ret < UCX_PRINTF_BUFSIZE) {
-        return (int)wfc(buf, 1, ret, stream);
-    } else {
-        errno = ENOMEM;
-        return -1;
-    }
-#endif
-}
-
-sstr_t ucx_asprintf(UcxAllocator *allocator, const char *fmt, ...) {
-    va_list ap;
-    sstr_t ret;
-    va_start(ap, fmt);
-    ret = ucx_vasprintf(allocator, fmt, ap);
-    va_end(ap);
-    return ret;
-}
-
-sstr_t ucx_vasprintf(UcxAllocator *a, const char *fmt, va_list ap) {
-    sstr_t s;
-    s.ptr = NULL;
-    s.length = 0;
-    char buf[UCX_PRINTF_BUFSIZE];
-#ifdef va_copy
-    va_list ap2;
-    va_copy(ap2, ap);
-    int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap);
-    if (ret > 0 && ret < UCX_PRINTF_BUFSIZE) {
-        s.ptr = (char*)almalloc(a, ret + 1);
-        if (s.ptr) {
-            s.length = (size_t)ret;
-            memcpy(s.ptr, buf, ret);
-            s.ptr[s.length] = '\0';
-        }
-    } else if (ret == INT_MAX) {
-        errno = ENOMEM;
-    } else  {
-        int len = ret + 1;
-        s.ptr = (char*)almalloc(a, len);
-        if (s.ptr) {
-            ret = vsnprintf(s.ptr, len, fmt, ap2);
-            if (ret < 0) {
-                free(s.ptr);
-                s.ptr = NULL;
-            } else {
-                s.length = (size_t)ret;
-            }
-        }
-    }
-#else
-    int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap);
-    if (ret > 0 && ret < UCX_PRINTF_BUFSIZE) {
-        s.ptr = (char*)almalloc(a, ret + 1);
-        if (s.ptr) {
-            s.length = (size_t)ret;
-            memcpy(s.ptr, buf, ret);
-            s.ptr[s.length] = '\0';
-        }
-    } else {
-        errno = ENOMEM;
-    }
-#endif
-    return s;
-}
--- a/test/CMakeLists.txt	Mon Dec 30 09:54:10 2019 +0100
+++ b/test/CMakeLists.txt	Sat Feb 06 19:11:44 2021 +0100
@@ -1,17 +1,6 @@
-add_executable(ucxtest
-        allocator_tests.c
-        array_tests.c
-        avl_tests.c
-        buffer_tests.c
-        list_tests.c
-        logging_tests.c
-        main.c
-        map_tests.c
-        mpool_tests.c
-        prop_tests.c
-        stack_tests.c
-        string_tests.c
-        utils_tests.c
+
+add_executable(test_list
+        test_list.c
 )
-
-target_link_libraries(ucxtest PRIVATE ucx_static)
+target_link_libraries(test_list PRIVATE ucx_static)
+add_test(NAME list COMMAND test_list WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
--- a/test/Makefile.am	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-#
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-#
-# Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-#   1. Redistributions of source code must retain the above copyright
-#      notice, this list of conditions and the following disclaimer.
-#
-#   2. Redistributions in binary form must reproduce the above copyright
-#      notice, this list of conditions and the following disclaimer in the
-#      documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
-# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-
-TESTS = ucxtest
-check_PROGRAMS = ucxtest
-ucxtest_CFLAGS = -I$(top_srcdir)/src
-
-ucxtest_SOURCES = main.c
-ucxtest_SOURCES += allocator_tests.c
-ucxtest_SOURCES += array_tests.c
-ucxtest_SOURCES += list_tests.c
-ucxtest_SOURCES += avl_tests.c
-ucxtest_SOURCES += mpool_tests.c
-ucxtest_SOURCES += stack_tests.c
-ucxtest_SOURCES += map_tests.c
-ucxtest_SOURCES += prop_tests.c
-ucxtest_SOURCES += string_tests.c
-ucxtest_SOURCES += logging_tests.c
-ucxtest_SOURCES += buffer_tests.c
-ucxtest_SOURCES += utils_tests.c
-
-ucxtest_SOURCES += main.h
-ucxtest_SOURCES += allocator_tests.h
-ucxtest_SOURCES += array_tests.h
-ucxtest_SOURCES += list_tests.h
-ucxtest_SOURCES += avl_tests.h
-ucxtest_SOURCES += mpool_tests.h
-ucxtest_SOURCES += stack_tests.h
-ucxtest_SOURCES += map_tests.h
-ucxtest_SOURCES += prop_tests.h
-ucxtest_SOURCES += string_tests.h
-ucxtest_SOURCES += logging_tests.h
-ucxtest_SOURCES += buffer_tests.h
-ucxtest_SOURCES += utils_tests.h
-
-ucxtest_LDFLAGS = -static
-ucxtest_LDADD = ../src/libucx.la
--- a/test/allocator_tests.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "allocator_tests.h"
-
-UCX_TEST(test_ucx_default_allocator) {
-    UcxAllocator *alloc = ucx_default_allocator();
-    
-    UCX_TEST_BEGIN
-    UCX_TEST_ASSERT(alloc->pool == NULL, "pool must be NULL");
-    UCX_TEST_ASSERT(alloc->malloc == ucx_default_malloc, "wrong malloc");
-    UCX_TEST_ASSERT(alloc->calloc == ucx_default_calloc, "wrong calloc");
-    UCX_TEST_ASSERT(alloc->realloc == ucx_default_realloc, "wrong realloc");
-    UCX_TEST_ASSERT(alloc->free == ucx_default_free, "wrong free");
-    UCX_TEST_END
-}
--- a/test/allocator_tests.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef ALLOCATOR_TEST_H
-#define	ALLOCATOR_TEST_H
-
-#include <ucx/test.h>
-#include <ucx/allocator.h>
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-UCX_TEST(test_ucx_default_allocator);
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* ALLOCATOR_TEST_H */
-
--- a/test/array_tests.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,642 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2019 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "array_tests.h"
-#include <ucx/utils.h>
-
-UCX_TEST(test_ucx_array_destroy) {
-    UcxArray array;
-    ucx_array_init(&array, 16, sizeof(int));
-    
-    UCX_TEST_BEGIN
-    ucx_array_destroy(&array);
-    UCX_TEST_ASSERT(array.data == NULL, "data pointer not NULL after destroy");
-    UCX_TEST_ASSERT(array.size == 0, "size not zero after destroy");
-    UCX_TEST_ASSERT(array.capacity == 0, "capacity not zero after destroy");
-    UCX_TEST_ASSERT(array.allocator == ucx_default_allocator(),
-            "allocator corrupted during destroy");
-    UCX_TEST_END
-}
-
-UCX_TEST(test_ucx_array_new) {
-    UcxArray* array = ucx_array_new(16, 47);
-    
-    UCX_TEST_BEGIN
-    UCX_TEST_ASSERT(array->data, "no memory allocated");
-    UCX_TEST_ASSERT(array->size == 0, "size not initially zero");
-    UCX_TEST_ASSERT(array->capacity == 16, "capacity not as requested");
-    UCX_TEST_ASSERT(array->elemsize == 47, "element size not as requested");
-    UCX_TEST_ASSERT(array->allocator == ucx_default_allocator(),
-            "array not using the default allocator");
-    UCX_TEST_END
-    ucx_array_free(array);
-}
-
-UCX_TEST(test_ucx_array_append_from) {
-    UcxArray *array = ucx_array_new(16, sizeof(int));
-    int *elements;
-    
-    int x = 42;
-    ucx_array_append_from(array, &x, 1);
-    UCX_TEST_BEGIN
-    
-    elements = array->data;
-    UCX_TEST_ASSERT(elements[0] == 42, "failed");
-    
-    int y[2] = {13, 37};
-    ucx_array_append_from(array, y, 2);
-    
-    elements = array->data;
-    UCX_TEST_ASSERT(array->size == 3, "incorrect size after append");
-    UCX_TEST_ASSERT(elements[1] == 13, "failed");
-    UCX_TEST_ASSERT(elements[2] == 37, "failed");
-    UCX_TEST_ASSERT(elements[0] == 42,
-            "append corrupted previously inserted data");
-    
-    ucx_array_append_from(array, NULL, 2);
-    
-    elements = array->data;
-    UCX_TEST_ASSERT(array->size == 5, "incorrect size after NULL append");
-    UCX_TEST_ASSERT(elements[3] == 0, "element is not zeroed");
-    UCX_TEST_ASSERT(elements[4] == 0, "element is not zeroed");
-    UCX_TEST_ASSERT(elements[0] == 42,
-            "NULL append corrupted previously inserted data");
-    UCX_TEST_ASSERT(elements[1] == 13,
-            "NULL append corrupted previously inserted data");
-    UCX_TEST_ASSERT(elements[2] == 37,
-            "NULL append corrupted previously inserted data");
-    
-    UCX_TEST_END
-    
-    ucx_array_free(array);
-}
-
-UCX_TEST(test_ucx_array_append_from_struct) {
-    struct teststruct {
-        unsigned long long x;
-        unsigned long long y;
-        unsigned long long z;
-    };
-    
-    UcxArray *array = ucx_array_new(16, sizeof(struct teststruct));
-    struct teststruct *elements;
-    
-    struct teststruct data;
-    data.x = 13; data.y = 37; data.z = 47;
-    
-    ucx_array_append_from(array, &data, 1);
-    UCX_TEST_BEGIN
-    
-    elements = array->data;
-    UCX_TEST_ASSERT(elements[0].x == 13, "failed");
-    UCX_TEST_ASSERT(elements[0].y == 37, "failed");
-    UCX_TEST_ASSERT(elements[0].z == 47, "failed");
-    
-    data.x = 0; data.y = 8; data.z = 15;
-    ucx_array_append_from(array, &data, 1);
-    
-    elements = array->data;
-    UCX_TEST_ASSERT(array->size == 2, "incorrect size after append");
-    UCX_TEST_ASSERT(elements[1].x == 0, "failed");
-    UCX_TEST_ASSERT(elements[1].y == 8, "failed");
-    UCX_TEST_ASSERT(elements[1].z == 15, "failed");
-    
-    UCX_TEST_ASSERT(elements[0].x == 13,
-            "append corrupted previously inserted data");
-    UCX_TEST_ASSERT(elements[0].y == 37,
-            "append corrupted previously inserted data");
-    UCX_TEST_ASSERT(elements[0].z == 47,
-            "append corrupted previously inserted data");
-    
-    UCX_TEST_END
-    
-    ucx_array_destroy(array);
-}
-
-UCX_TEST(test_ucx_array_prepend_from) {
-    int *elems;
-    UcxArray *array = ucx_array_new(16, sizeof(int));
-    
-    int x = 42;
-    ucx_array_prepend_from(array, &x, 1);
-    UCX_TEST_BEGIN
-    
-    elems = array->data;
-    UCX_TEST_ASSERT(elems[0] == 42, "failed");
-    
-    int y[2] = {13, 37};
-    ucx_array_prepend_from(array, y, 2);
-    
-    elems = array->data;
-    UCX_TEST_ASSERT(array->size == 3, "incorrect size after prepend");
-    UCX_TEST_ASSERT(elems[0] == 13, "failed");
-    UCX_TEST_ASSERT(elems[1] == 37, "failed");
-    UCX_TEST_ASSERT(elems[2] == 42,
-            "prepend corrupted previously inserted data");
-    
-    ucx_array_prepend_from(array, NULL, 2);
-    
-    elems = array->data;
-    UCX_TEST_ASSERT(array->size == 5, "incorrect size after NULL prepend");
-    UCX_TEST_ASSERT(elems[0] == 0, "element is not zeroed");
-    UCX_TEST_ASSERT(elems[1] == 0, "element is not zeroed");
-    UCX_TEST_ASSERT(elems[2] == 13,
-            "NULL prepend corrupted previously inserted data");
-    UCX_TEST_ASSERT(elems[3] == 37,
-            "NULL prepend corrupted previously inserted data");
-    UCX_TEST_ASSERT(elems[4] == 42,
-            "NULL prepend corrupted previously inserted data");
-    
-    UCX_TEST_END
-    
-    ucx_array_free(array);
-}
-
-UCX_TEST(test_ucx_array_set_from) {
-    int *elems;
-    UcxArray *array = ucx_array_new(16, sizeof(int));
-    
-    int x = 42;
-
-    UCX_TEST_BEGIN
-
-    ucx_array_set_from(array, 7, &x, 1);
-    
-    elems = array->data;
-    UCX_TEST_ASSERT(elems[7] == 42, "failed");
-    UCX_TEST_ASSERT(array->size >= 8, "array not resized on set");
-    UCX_TEST_ASSERT(array->capacity == 16, "capacity changed unnecessarily");
-    
-    int y[2] = {13, 37};
-    ucx_array_set_from(array, 27, y, 2);
-    
-    elems = array->data;
-    UCX_TEST_ASSERT(elems[27] == 13, "failed");
-    UCX_TEST_ASSERT(elems[28] == 37, "failed");
-    UCX_TEST_ASSERT(array->size == 29, "array not resized on set");
-    UCX_TEST_ASSERT(array->capacity == 32, "capacity not grown");
-    
-    ucx_array_set_from(array, 7, NULL, 2);
-    
-    elems = array->data;
-    UCX_TEST_ASSERT(elems[7] == 0, "not zeroed on NULL set");
-    UCX_TEST_ASSERT(elems[8] == 0, "not zeroed on NULL set");
-    
-    UCX_TEST_END
-    
-    ucx_array_free(array);
-}
-
-
-UCX_TEST(test_ucx_array_equals) {
-    UcxArray *a1 = ucx_array_new(16, sizeof(int32_t));
-    UcxArray *a2 = ucx_array_new(16, sizeof(int32_t));
-    UcxArray *a3 = ucx_array_new(16, sizeof(int64_t));
-    UcxArray *a4 = ucx_array_new(16, sizeof(int32_t));
-    
-    int32_t *intelems;
-    int64_t *longintelems;
-    
-    a1->size = 5;
-    intelems = a1->data;
-    intelems[0] = 47;
-    intelems[1] = 11;
-    intelems[2] = 0;
-    intelems[3] = 8;
-    intelems[4] = 15;
-    a2->size = 5;
-    intelems = a2->data;
-    intelems[0] = 47;
-    intelems[1] = 11;
-    intelems[2] = 0;
-    intelems[3] = 8;
-    intelems[4] = 15;
-    a3->size = 5;
-    longintelems = a3->data;
-    longintelems[0] = 47;
-    longintelems[1] = 11;
-    longintelems[2] = 0;
-    longintelems[3] = 8;
-    longintelems[4] = 15;
-    a4->size = 5;
-    intelems = a4->data;
-    intelems[0] = 47;
-    intelems[1] = 11;
-    intelems[2] = -6;
-    intelems[3] = 8;
-    intelems[4] = 15;
-    
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(ucx_array_equals(a1, a2, ucx_cmp_int32, NULL), "failed");
-    UCX_TEST_ASSERT(!ucx_array_equals(a1, a4, ucx_cmp_int32, NULL), "failed");
-    UCX_TEST_ASSERT(!ucx_array_equals(a4, a1, ucx_cmp_int32, NULL), "failed");
-    UCX_TEST_ASSERT(!ucx_array_equals(a1, a3, ucx_cmp_int64, NULL),
-            "comparing arrays of different element size shall fail");
-    UCX_TEST_ASSERT(!ucx_array_equals(a3, a1, ucx_cmp_int64, NULL),
-            "comparing arrays of different element size shall fail");
-    
-    UCX_TEST_ASSERT(ucx_array_equals(a1, a2, NULL, NULL),
-            "compare using memcmp() failed");
-    UCX_TEST_ASSERT(!ucx_array_equals(a1, a4, NULL, NULL),
-            "compare using memcmp() failed");
-    
-    UCX_TEST_END
-    ucx_array_free(a1);
-    ucx_array_free(a2);
-    ucx_array_free(a3);
-    ucx_array_free(a4);
-}
-
-UCX_TEST(test_ucx_array_concat) {
-    UcxArray *a1 = ucx_array_new(16, sizeof(int));
-    UcxArray *a2 = ucx_array_new(16, sizeof(int));
-    int *elems;
-    
-    a1->size = 2;
-    elems = a1->data;
-    elems[0] = 47;
-    elems[1] = 11;
-    a2->size = 3;
-    elems = a2->data;
-    elems[0] = 0;
-    elems[1] = 8;
-    elems[2] = 15;
-    
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(!ucx_array_concat(a1, a2), "failed");
-    UCX_TEST_ASSERT(a1->size == 5, "failed");
-    elems = a1->data;
-    UCX_TEST_ASSERT(elems[0] == 47, "failed");
-    UCX_TEST_ASSERT(elems[1] == 11, "failed");
-    UCX_TEST_ASSERT(elems[2] == 0, "failed");
-    UCX_TEST_ASSERT(elems[3] == 8, "failed");
-    UCX_TEST_ASSERT(elems[4] == 15, "failed");
-    
-    a1->elemsize *= 2;
-    UCX_TEST_ASSERT(ucx_array_concat(a1, a2),
-            "arrays of different element size must not be concatenated");
-    UCX_TEST_ASSERT(a1->size == 5,
-            "arrays of different element size must not be concatenated");
-    
-    UCX_TEST_END
-    ucx_array_free(a1);
-    ucx_array_free(a2);    
-}
-
-UCX_TEST(test_ucx_array_at) {
-    UcxArray *array = ucx_array_new(16, sizeof(int));
-    
-    int x[3] = {42, 13, 5};
-    ucx_array_append_from(array, x, 3);
-    
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(*(int*)ucx_array_at(array, 1) == 13, "failed");
-    *(int*)ucx_array_at(array, 1) = 80;
-    UCX_TEST_ASSERT(*(int*)ucx_array_at(array, 1) == 80, "assignment failed");
-    
-    UCX_TEST_ASSERT(*(int*)ucx_array_at(array, 0) == 42, "corrupted data");
-    UCX_TEST_ASSERT(*(int*)ucx_array_at(array, 2) == 5, "corrupted data");
-    
-    UCX_TEST_END
-    
-    ucx_array_free(array);
-}
-
-UCX_TEST(test_ucx_array_find) {
-    UcxArray *array = ucx_array_new(16, sizeof(int));
-    int *elems;
-    
-    array->size = 5;
-    elems = array->data;
-    elems[0] = 47;
-    elems[1] = 11;
-    elems[2] = 0;
-    elems[3] = 8;
-    elems[4] = 15;
-    
-    int x = 8;
-    int y = 90;
-    
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(ucx_array_find(array,(void*)&x,ucx_cmp_int,NULL) == 3,
-        "doesn't find element");
-    UCX_TEST_ASSERT(ucx_array_find(array,(void*)&y,ucx_cmp_int,NULL) == 5,
-        "finds non-existing element");
-    
-    UCX_TEST_ASSERT(ucx_array_find(array,(void*)&x,NULL,NULL) == 3,
-        "failed using memcmp()");
-    UCX_TEST_ASSERT(ucx_array_find(array,(void*)&y,NULL,NULL) == 5,
-        "failed using memcmp()");
-    
-    UCX_TEST_END
-    ucx_array_free(array);
-}
-
-UCX_TEST(test_ucx_array_contains) {
-    UcxArray *array = ucx_array_new(16, sizeof(int));
-    int *elems;
-    
-    array->size = 5;
-    elems = array->data;
-    elems[0] = 47;
-    elems[1] = 11;
-    elems[2] = 0;
-    elems[3] = 8;
-    elems[4] = 15;
-    
-    int x = 8;
-    int y = 90;
-    
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(ucx_array_contains(array,(void*)&x,ucx_cmp_int,NULL),
-        "false negative");
-    UCX_TEST_ASSERT(!ucx_array_contains(array,(void*)&y,ucx_cmp_int,NULL),
-        "false positive");
-    
-    UCX_TEST_ASSERT(ucx_array_contains(array,(void*)&x,NULL,NULL),
-        "false negative using memcmp()");
-    UCX_TEST_ASSERT(!ucx_array_contains(array,(void*)&y,NULL,NULL),
-        "false positive using memcmp()");
-    
-    UCX_TEST_END
-    ucx_array_free(array);
-}
-
-UCX_TEST(test_ucx_array_remove) {
-    UcxArray *array = ucx_array_new(16, sizeof(int));
-    int *elems;
-    
-    array->size = 5;
-    elems = array->data;
-    elems[0] = 47;
-    elems[1] = 11;
-    elems[2] = 0;
-    elems[3] = 8;
-    elems[4] = 15;
-        
-    UCX_TEST_BEGIN
-    
-    ucx_array_remove(array, 2);
-    elems = array->data;
-    UCX_TEST_ASSERT(
-            elems[0] == 47 &&
-            elems[1] == 11 &&
-            elems[2] == 8 &&
-            elems[3] == 15,
-            "wrong contents after remove");
-    UCX_TEST_ASSERT(array->size == 4, "wrong size after remove");
-    
-    ucx_array_remove_fast(array, 1);
-    elems = array->data;
-    UCX_TEST_ASSERT(
-            elems[0] == 47 &&
-            elems[1] == 15 &&
-            elems[2] == 8,
-            "wrong contents after fast remove");
-    UCX_TEST_ASSERT(array->size == 3, "wrong size after fast remove");
-    
-    UCX_TEST_END
-    ucx_array_free(array);
-}
-
-UCX_TEST(test_ucx_array_clone) {
-    UcxArray array;
-    UcxArray copy;
-    ucx_array_init(&array, 16, sizeof(int));
-    ucx_array_init(&copy, 4, 2*sizeof(double));
-    int *elems;
-    
-    array.size = 5;
-    elems = array.data;
-    elems[0] = 47;
-    elems[1] = 11;
-    elems[2] = 0;
-    elems[3] = 8;
-    elems[4] = 15;
-    
-    ucx_array_clone(&copy, &array);
-    UCX_TEST_BEGIN
-
-    UCX_TEST_ASSERT(array.data != copy.data, "no true copy");
-    UCX_TEST_ASSERT(array.size == copy.size, "size mismatch");
-    UCX_TEST_ASSERT(array.capacity == copy.capacity, "capacity mismatch");
-    UCX_TEST_ASSERT(array.elemsize == copy.elemsize, "element size mismatch");
-    UCX_TEST_ASSERT(array.allocator == copy.allocator, "allocator mismatch");
-    UCX_TEST_ASSERT(ucx_array_equals(&array, &copy, ucx_cmp_int, NULL),
-            "contents do not match after clone");
-    
-    UCX_TEST_END
-
-    ucx_array_destroy(&array);
-    ucx_array_destroy(&copy);
-}
-
-static int ucx_cmp_int_reverse(const void* x, const void* y, void* data) {
-    return -ucx_cmp_int(x,y,data);
-}
-
-UCX_TEST(test_ucx_array_sort) {
-    int *elems;
-
-    UcxArray *array = ucx_array_new(16, sizeof(int));    
-    array->size = 5;
-    elems = array->data;
-    elems[0] = 47;
-    elems[1] = 11;
-    elems[2] = 0;
-    elems[3] = 8;
-    elems[4] = 15;
-    
-    UcxArray *expected = ucx_array_new(16, sizeof(int));
-    expected->size = 5;
-    elems = expected->data;
-    elems[0] = 0;
-    elems[1] = 8;
-    elems[2] = 11;
-    elems[3] = 15;
-    elems[4] = 47;
-    
-    UcxArray *expectedrev = ucx_array_new(16, sizeof(int));
-    expectedrev->size = 5;
-    elems = expectedrev->data;
-    elems[0] = 47;
-    elems[1] = 15;
-    elems[2] = 11;
-    elems[3] = 8;
-    elems[4] = 0;
-    
-
-    UCX_TEST_BEGIN
-    void* original_ptr = array->data;
-    ucx_array_sort(array, ucx_cmp_int, NULL);
-    UCX_TEST_ASSERT(ucx_array_equals(array, expected, NULL, NULL), "failed");
-    UCX_TEST_ASSERT(array->size == 5, "size corrupted");
-    UCX_TEST_ASSERT(array->data == original_ptr, "shall not reallocate");
-    
-    ucx_array_sort(array, ucx_cmp_int_reverse, NULL);
-    UCX_TEST_ASSERT(ucx_array_equals(array, expectedrev, NULL, NULL), "failed");
-
-    ucx_array_reserve(array, 32);
-    ucx_array_reserve(expected, 32);
-    array->size = expected->size = 32;
-    for (size_t i = 0 ; i < 32 ; i++) {
-        ((int*)array->data)[i]= ((i%2==0)?-1:1) * ((int) i);
-        ((int*)expected->data)[i] = (-30+2*i) - (i > 15 ? 1 : 0);
-    }
-    
-    /* dummy third argument to trigger a possible fallback for qsort_s */
-    ucx_array_sort(array, ucx_cmp_int, array->data);
-    UCX_TEST_ASSERT(ucx_array_equals(array, expected, NULL, NULL),
-            "failed for bigger arrays");
-    UCX_TEST_END
-
-    ucx_array_free(expectedrev);
-    ucx_array_free(expected);
-    ucx_array_free(array);
-}
-
-UCX_TEST(test_ucx_array_shrink) {
-    UcxArray *array = ucx_array_new(16, sizeof(int));
-    array->size = 4;
-    
-    UCX_TEST_BEGIN
-    UCX_TEST_ASSERT(!ucx_array_shrink(array), "failed");
-    UCX_TEST_ASSERT(array->capacity == 4, "incorrect capacity after shrink");
-    UCX_TEST_END
-    ucx_array_free(array);
-}
-
-UCX_TEST(test_ucx_array_resize) {
-    UcxArray *array = ucx_array_new(16, sizeof(int));
-    array->size = 8;
-    
-    UCX_TEST_BEGIN
-
-    UCX_TEST_ASSERT(!ucx_array_resize(array, 32), "failed");
-    UCX_TEST_ASSERT(array->capacity == 32, "incorrect capacity after resize");
-    UCX_TEST_ASSERT(array->size == 8, "incorrect size after resize");
-    
-    UCX_TEST_ASSERT(!ucx_array_resize(array, 4), "failed");
-    UCX_TEST_ASSERT(array->capacity == 4, "incorrect capacity after resize");
-    UCX_TEST_ASSERT(array->size == 4, "incorrect size after resize");
-    
-    UCX_TEST_END
-    ucx_array_free(array);
-}
-
-UCX_TEST(test_ucx_array_reserve) {
-    UcxArray *array = ucx_array_new(16, sizeof(int));
-    
-    UCX_TEST_BEGIN
-
-    UCX_TEST_ASSERT(!ucx_array_reserve(array, 4), "failed");
-    UCX_TEST_ASSERT(array->capacity == 16, "reserve shall not shrink");
-            
-    UCX_TEST_ASSERT(!ucx_array_resize(array, 32), "failed");
-    UCX_TEST_ASSERT(array->capacity == 32, "incorrect capacity after reserve");    
-    
-    UCX_TEST_END
-    ucx_array_free(array);
-}
-
-UCX_TEST(test_ucx_array_grow) {
-    UcxArray *array = ucx_array_new(16, sizeof(int));
-    array->size = 12;
-    
-    UCX_TEST_BEGIN
-
-    UCX_TEST_ASSERT(!ucx_array_grow(array, 4), "failed");
-    UCX_TEST_ASSERT(array->capacity == 16, "shall be noop if contents fit");
-    /* subsequent calls shall also be noops */
-    UCX_TEST_ASSERT(!ucx_array_grow(array, 4), "failed");
-    UCX_TEST_ASSERT(array->capacity == 16, "shall be noop if contents fit");
-            
-    UCX_TEST_ASSERT(!ucx_array_grow(array, 6), "failed");
-    UCX_TEST_ASSERT(array->capacity == 18, "incorrect capacity after grow");    
-    
-    UCX_TEST_END
-    ucx_array_free(array);
-}
-
-UCX_TEST(test_ucx_array_util_set) {
-    size_t capacity = 16;
-    int* array = malloc(sizeof(int)*capacity);
-    int x;
-
-    UCX_TEST_BEGIN
-
-    x = 42;
-    ucx_array_util_set(&array, &capacity, sizeof(int), 7, &x);
-    
-    UCX_TEST_ASSERT(array[7] == 42, "failed");
-    UCX_TEST_ASSERT(capacity == 16, "capacity changed unnecessarily");
-    
-    x = 13;
-    ucx_array_util_set(&array, &capacity, sizeof(int), 37, &x);
-    x = 37;
-    ucx_array_util_set(&array, &capacity, sizeof(int), 38, &x);
-    
-    UCX_TEST_ASSERT(array[37] == 13, "failed");
-    UCX_TEST_ASSERT(array[38] == 37, "failed");
-    UCX_TEST_ASSERT(capacity == 64, "capacity not grown");
-        
-    UCX_TEST_END
-    
-    free(array);
-}
-
-
-UCX_TEST(test_ucx_array_util_setptr) {
-    size_t capacity = 16;
-    double** array = malloc(sizeof(double*)*capacity);
-    double x, y, z;
-
-    UCX_TEST_BEGIN
-
-    ucx_array_util_setptr(&array, &capacity, 7, &x);
-    
-    UCX_TEST_ASSERT(array[7] == &x, "failed");
-    UCX_TEST_ASSERT(capacity == 16, "capacity changed unnecessarily");
-    
-    ucx_array_util_setptr(&array, &capacity, 37, &y);
-    ucx_array_util_setptr(&array, &capacity, 38, &z);
-    
-    UCX_TEST_ASSERT(array[37] == &y, "failed");
-    UCX_TEST_ASSERT(array[38] == &z, "failed");
-    UCX_TEST_ASSERT(capacity == 64, "capacity not grown");
-        
-    UCX_TEST_END
-    
-    free(array);
-}
-
--- a/test/array_tests.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2019 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef ARRAY_TESTS_H
-#define	ARRAY_TESTS_H
-
-#include <ucx/array.h>
-#include <ucx/test.h>
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-UCX_TEST(test_ucx_array_destroy);
-UCX_TEST(test_ucx_array_new);
-UCX_TEST(test_ucx_array_at);
-UCX_TEST(test_ucx_array_append_from);
-UCX_TEST(test_ucx_array_append_from_struct);
-UCX_TEST(test_ucx_array_prepend_from);
-UCX_TEST(test_ucx_array_set_from);
-UCX_TEST(test_ucx_array_equals);
-UCX_TEST(test_ucx_array_concat);
-UCX_TEST(test_ucx_array_find);
-UCX_TEST(test_ucx_array_contains);
-UCX_TEST(test_ucx_array_remove);
-UCX_TEST(test_ucx_array_clone);
-UCX_TEST(test_ucx_array_sort);
-UCX_TEST(test_ucx_array_shrink);
-UCX_TEST(test_ucx_array_resize);
-UCX_TEST(test_ucx_array_reserve);
-UCX_TEST(test_ucx_array_grow);
-UCX_TEST(test_ucx_array_util_set);
-UCX_TEST(test_ucx_array_util_setptr);
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* ARRAY_TESTS_H */
-
--- a/test/avl_tests.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,335 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "avl_tests.h"
-
-#include <ucx/utils.h>
-
-static int node_height(UcxAVLNode *node) {
-    if(!node) {
-        return 0;
-    }
-    
-    int left = 0;
-    int right = 0;
-    if(node->left) {
-        left = node_height(node->left);
-    }
-    if(node->right) {
-        right = node_height(node->right);
-    }
-    
-    return left > right ? left+1 : right+1;
-}
-
-static int check_tree(UcxAVLNode *node) {
-    if(!node) {
-        return 1;
-    }
-    
-    int left_height = node_height(node->left);
-    int right_height = node_height(node->right);
-    int bf = -left_height + right_height;
-    if(bf < -1 || bf > 1) {
-        return 0;
-    }
-    int height = left_height > right_height ? left_height : right_height;
-    height++;
-    if(height != node->height) {
-        return 0;
-    }
-    
-    if(!check_tree(node->left)) {
-        return 0;
-    }
-    if(!check_tree(node->right)) {
-        return 0;
-    }
-    
-    return 1;
-}
-
-UCX_TEST(test_ucx_avl_put) {
-    UcxAVLTree *tree1 = ucx_avl_new(ucx_cmp_ptr);
-    UcxAVLTree *tree2 = ucx_avl_new(ucx_cmp_ptr);
-    UcxAVLTree *tree3 = ucx_avl_new(ucx_cmp_ptr);
-    UcxAVLTree *tree4 = ucx_avl_new(ucx_cmp_ptr);
-    UcxAVLTree *tree5 = ucx_avl_new(ucx_cmp_ptr);
-    
-    char *data1 = (char*)"data1";
-    char *data2 = (char*)"data2";
-    char *data3 = (char*)"data3";
-    
-    UCX_TEST_BEGIN
-    
-    ucx_avl_put(tree1, 2, (char*)data2);
-    ucx_avl_put(tree1, 1, (char*)data1);
-    ucx_avl_put(tree1, 3, (char*)data3);
-    
-    UCX_TEST_ASSERT(check_tree(tree1->root), "check_tree failed (tree1)");
-    UCX_TEST_ASSERT(ucx_avl_get(tree1, 1) == data1, "wrong data (tree1)");
-    UCX_TEST_ASSERT(ucx_avl_get(tree1, 2) == data2, "wrong data (tree1)");
-    UCX_TEST_ASSERT(ucx_avl_get(tree1, 3) == data3, "wrong data (tree1)");
-    
-    for(int i=0;i<100000;i++) {
-        ucx_avl_put(tree2, i, data1);
-    }
-    UCX_TEST_ASSERT(check_tree(tree2->root), "check_tree failed (tree2)");
-    
-    for(int i=100000;i>=0;i--) {
-        ucx_avl_put(tree3, i, data1);
-    }
-    UCX_TEST_ASSERT(check_tree(tree3->root), "check_tree failed (tree3)");
-    
-    for(int i=0;i<100;i++) {
-        ucx_avl_put(tree4, i, data1);
-    }
-    for(int i=400;i<500;i++) {
-        ucx_avl_put(tree4, i, data2);
-    }
-    for(int i=399;i>200;i--) {
-        ucx_avl_put(tree4, i, data3);
-    }
-    for(int i=800;i<1000;i++) {
-        ucx_avl_put(tree4, i, data1);
-    }
-    UCX_TEST_ASSERT(check_tree(tree4->root), "check_tree failed (tree4)");
-    UCX_TEST_ASSERT(ucx_avl_get(tree4, 0) == data1, "wrong data for key: 0");
-    UCX_TEST_ASSERT(ucx_avl_get(tree4, 1) == data1, "wrong data for key: 1");
-    UCX_TEST_ASSERT(ucx_avl_get(tree4, 99) == data1, "wrong data for key: 99");
-    UCX_TEST_ASSERT(ucx_avl_get(tree4, 400)==data2, "wrong data for key: 400");
-    UCX_TEST_ASSERT(ucx_avl_get(tree4, 410)==data2, "wrong data for key: 410");
-    UCX_TEST_ASSERT(ucx_avl_get(tree4, 350)==data3, "wrong data for key: 350");
-    UCX_TEST_ASSERT(ucx_avl_get(tree4, 900)==data1, "wrong data for key: 900");
-    
-    int values[] = { 3, 6, 12, 9, 23, 1, 0, 20, 34, 5, 8, 7, 6, 14, 15, 2, 4};
-    int len = sizeof(values) / sizeof(int);
-    for(int i=0;i<len;i++) {
-        ucx_avl_put(tree5, values[i], NULL);
-    }
-    UCX_TEST_ASSERT(check_tree(tree5->root), "check_tree failed (tree5)");
-            
-    UCX_TEST_END
-    
-    ucx_avl_free(tree1);
-    ucx_avl_free(tree2);
-    ucx_avl_free(tree3);
-    ucx_avl_free(tree4);
-    ucx_avl_free(tree5);
-}
-
-UCX_TEST(test_ucx_avl_remove) {
-    UcxAVLTree *tree1 = ucx_avl_new(ucx_cmp_ptr);
-    UcxAVLTree *tree2 = ucx_avl_new(ucx_cmp_ptr);
-    UcxAVLTree *tree3 = ucx_avl_new(ucx_cmp_ptr);
-    UcxAVLTree *tree4 = ucx_avl_new(ucx_cmp_ptr);
-    
-    char *data1 = (char*)"data1";
-    char *data2 = (char*)"data2";
-    char *data3 = (char*)"data3";
-    
-    UCX_TEST_BEGIN
-    ucx_avl_put(tree1, 2, (char*)data2);
-    ucx_avl_put(tree1, 1, (char*)data1);
-    ucx_avl_put(tree1, 3, (char*)data3);
-    void *val;
-    ucx_avl_remove_s(tree1, 3, NULL, &val);
-    
-    UCX_TEST_ASSERT(check_tree(tree1->root), "check_tree failed (tree1)");
-    UCX_TEST_ASSERT(val == data3,
-            "wrong return value for key: 1 (tree1)");
-    UCX_TEST_ASSERT(ucx_avl_get(tree1, 3) == NULL, "value not removed (tree1)");
-    
-    ucx_avl_remove_s(tree1, 2, NULL, &val);
-    UCX_TEST_ASSERT(val == data2,
-            "wrong return value for key: 2 (tree1)");
-    UCX_TEST_ASSERT(check_tree(tree1->root), "check_tree failed (tree1)");
-    
-    ucx_avl_remove_s(tree1, 1, NULL, &val);
-    UCX_TEST_ASSERT(val == data1,
-            "wrong return value for key: 1 (tree1)");
-    UCX_TEST_ASSERT(check_tree(tree1->root), "check_tree failed (tree1)");
-    UCX_TEST_ASSERT(tree1->root == NULL, "root not NULL (tree1)");
-    
-    
-    for(int i=0;i<20;i++) {
-        if(i==10) {
-            ucx_avl_put(tree2, i, data3);
-        } else if(i==15) {
-            ucx_avl_put(tree2, i, data2);
-        } else {
-            ucx_avl_put(tree2, i, data1);
-        }
-    }
-    
-    ucx_avl_remove_s(tree2, 10, NULL, &val);
-    UCX_TEST_ASSERT(val == data3,
-            "wrong return value for key: 10 (tree2)");
-    UCX_TEST_ASSERT(check_tree(tree2->root), "check_tree failed (tree2)");
-    
-    ucx_avl_remove_s(tree2, 15, NULL, &val);
-    UCX_TEST_ASSERT(val == data2,
-            "wrong return value for key: 15 (tree2)");
-    UCX_TEST_ASSERT(check_tree(tree2->root), "check_tree failed (tree2)");
-    
-    for(int i=0;i<20;i++) {
-        ucx_avl_remove(tree2, i);
-        UCX_TEST_ASSERT(check_tree(tree2->root), "check_tree failed (tree2)");
-    }
-    UCX_TEST_ASSERT(tree2->root == NULL, "root not NULL (tree2)");
-    
-    for(int i=0;i<100000;i++) {
-        ucx_avl_put(tree3, i, data1);
-    }
-    for(int i=100000-1;i>=0;i--) {
-        ucx_avl_remove(tree3, i);
-    }
-    UCX_TEST_ASSERT(tree3->root == NULL, "root not NULL (tree3)");
-    UCX_TEST_ASSERT(check_tree(tree3->root), "check_tree failed (tree3)");
-    
-    ucx_avl_put(tree4, 1, data1);
-    ucx_avl_remove(tree4, 1);
-    UCX_TEST_ASSERT(check_tree(tree4->root), "check_tree failed (tree4)");
-    UCX_TEST_ASSERT(tree4->root == NULL, "root not NULL (tree4)");
-    UCX_TEST_END
-    
-    ucx_avl_free(tree1);
-    ucx_avl_free(tree2);
-    ucx_avl_free(tree3);
-    ucx_avl_free(tree4);
-}
-
-static intmax_t dist_int(const void* a, const void* b, void* n) {
-    return ((intptr_t)a)-((intptr_t)b);
-}
-
-UCX_TEST(test_ucx_avl_find) {
-    UcxAVLTree *tree = ucx_avl_new(ucx_cmp_ptr);
-    UcxAVLTree *tree2 = ucx_avl_new(ucx_cmp_ptr);
-    UcxAVLTree *tree3 = ucx_avl_new(ucx_cmp_ptr);
-    
-    size_t len = 12;
-    int val[] = {10, 15, 3, 4, -30, 20, 14, -11, 12, -5, 1, 13};
-    
-    for (size_t i = 0 ; i < len ; i++) {
-        ucx_avl_put(tree, val[i], &(val[i]));
-    }
-    
-    UCX_TEST_BEGIN
-    
-    void* ret;
-    
-    /* test present values */
-    ret = ucx_avl_find(tree,(intptr_t)-5, dist_int, UCX_AVL_FIND_CLOSEST);
-    UCX_TEST_ASSERT(ret && *((int*)ret) == -5, "AVL find closest failed");
-    ret = ucx_avl_find(tree,(intptr_t)-5, dist_int, UCX_AVL_FIND_EXACT);
-    UCX_TEST_ASSERT(ret && *((int*)ret) == -5, "AVL find exact failed");
-    ret = ucx_avl_find(tree,(intptr_t)-5, dist_int, UCX_AVL_FIND_LOWER_BOUNDED);
-    UCX_TEST_ASSERT(ret && *((int*)ret) == -5, "AVL find LB failed");
-    ret = ucx_avl_find(tree,(intptr_t)-5, dist_int, UCX_AVL_FIND_UPPER_BOUNDED);
-    UCX_TEST_ASSERT(ret && *((int*)ret) == -5, "AVL find UB failed");
-    ret = ucx_avl_find(tree,(intptr_t)12, dist_int, UCX_AVL_FIND_CLOSEST);
-    UCX_TEST_ASSERT(ret && *((int*)ret) == 12, "AVL find closest failed");
-    ret = ucx_avl_find(tree,(intptr_t)12, dist_int, UCX_AVL_FIND_EXACT);
-    UCX_TEST_ASSERT(ret && *((int*)ret) == 12, "AVL find exact failed");
-    ret = ucx_avl_find(tree,(intptr_t)12, dist_int, UCX_AVL_FIND_LOWER_BOUNDED);
-    UCX_TEST_ASSERT(ret && *((int*)ret) == 12, "AVL find LB failed");
-    ret = ucx_avl_find(tree,(intptr_t)12, dist_int, UCX_AVL_FIND_UPPER_BOUNDED);
-    UCX_TEST_ASSERT(ret && *((int*)ret) == 12, "AVL find UB failed");
-    
-    /* test missing values */
-    ret = ucx_avl_find(tree,(intptr_t)-10, dist_int, UCX_AVL_FIND_CLOSEST);
-    UCX_TEST_ASSERT(ret && *((int*)ret) == -11, "AVL find closest failed");
-    ret = ucx_avl_find(tree,(intptr_t)-8, dist_int, UCX_AVL_FIND_EXACT);
-    UCX_TEST_ASSERT(!ret, "AVL find exact failed");
-    ret = ucx_avl_find(tree,(intptr_t)-8, dist_int, UCX_AVL_FIND_LOWER_BOUNDED);
-    UCX_TEST_ASSERT(ret && *((int*)ret) == -5, "AVL find LB failed");
-    ret = ucx_avl_find(tree,(intptr_t)-8, dist_int, UCX_AVL_FIND_UPPER_BOUNDED);
-    UCX_TEST_ASSERT(ret && *((int*)ret) == -11, "AVL find UB failed");
-    ret = ucx_avl_find(tree,(intptr_t)18, dist_int, UCX_AVL_FIND_CLOSEST);
-    UCX_TEST_ASSERT(ret && *((int*)ret) == 20, "AVL find closest failed");
-    ret = ucx_avl_find(tree,(intptr_t)7, dist_int, UCX_AVL_FIND_EXACT);
-    UCX_TEST_ASSERT(!ret, "AVL find exact failed");
-    ret = ucx_avl_find(tree,(intptr_t)7, dist_int, UCX_AVL_FIND_LOWER_BOUNDED);
-    UCX_TEST_ASSERT(ret && *((int*)ret) == 10, "AVL find LB failed");
-    ret = ucx_avl_find(tree,(intptr_t)7, dist_int, UCX_AVL_FIND_UPPER_BOUNDED);
-    UCX_TEST_ASSERT(ret && *((int*)ret) == 4, "AVL find UB failed");
-    
-    int val2[] = { 10, 15 };
-    ucx_avl_put(tree2, val2[0], &(val2[0]));
-    ucx_avl_put(tree2, val2[1], &(val2[1]));
-    ret = ucx_avl_find(tree2,(intptr_t)11, dist_int, UCX_AVL_FIND_UPPER_BOUNDED);
-    UCX_TEST_ASSERT(ret && *((int*)ret) == 10, "AVL find LB failed");
-    
-    int val3[] = { 15, 16, 1 };
-    ucx_avl_put(tree3, val3[0], &(val3[0]));
-    ucx_avl_put(tree3, val3[1], &(val3[1]));
-    ucx_avl_put(tree3, val3[2], &(val3[2]));
-   
-    ret = ucx_avl_find(tree3, (intptr_t)13, dist_int, UCX_AVL_FIND_CLOSEST);
-    UCX_TEST_ASSERT(ret && *((int*)ret) == 15, "AVL find closest failed");
-    
-    UCX_TEST_END
-    
-    ucx_avl_free(tree);
-    ucx_avl_free(tree2);
-    ucx_avl_free(tree3);
-}
-
-UCX_TEST(test_ucx_avl_traverse) {
-    UcxAVLTree *tree = ucx_avl_new(ucx_cmp_ptr);
-    
-    size_t len = 12;
-
-    int val[] = {10, 15, 3, 4, -30, 20, 14, -11, 12, -5, 1, 13};
-    int val_ordered[] = {-30, -11, -5, 1, 3, 4, 10, 12, 13, 14, 15, 20};
-    
-    for (size_t i = 0 ; i < len ; i++) {
-        ucx_avl_put(tree, val[i], &(val[i]));
-    }
-    
-    UCX_TEST_BEGIN
-    
-    UcxAVLNode* node = ucx_avl_get_node(tree, (intptr_t) val_ordered[0]);
-    for (size_t i = 0 ; i < len ; i++) {
-        UCX_TEST_ASSERT(node->key == val_ordered[i], "AVL successor failed");
-        node = ucx_avl_succ(node);
-    }
-    UCX_TEST_ASSERT(!node, "AVL maximum incorrectly has a successor");
-    
-    node = ucx_avl_get_node(tree, (intptr_t) val_ordered[len-1]);
-    for (size_t i = len ; i > 0 ; i--) {
-        UCX_TEST_ASSERT(node->key == val_ordered[i-1],"AVL predecessor failed");
-        node = ucx_avl_pred(node);
-    }
-    UCX_TEST_ASSERT(!node, "AVL minimum incorrectly has a predecessor");
-    
-    UCX_TEST_END
-    
-    ucx_avl_free(tree);
-}
--- a/test/avl_tests.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef AVL_TEST_H
-#define	AVL_TEST_H
-
-#include <ucx/test.h>
-#include <ucx/avl.h>
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-UCX_TEST(test_ucx_avl_put);
-UCX_TEST(test_ucx_avl_remove);
-UCX_TEST(test_ucx_avl_find);
-UCX_TEST(test_ucx_avl_traverse);
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* AVL_TEST_H */
-
--- a/test/buffer_tests.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,738 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "buffer_tests.h"
-#include <stdint.h>
-
-UCX_TEST(test_ucx_buffer_new) {
-    UcxBuffer *b = ucx_buffer_new(NULL, 16, UCX_BUFFER_AUTOEXTEND);
-    UcxBuffer *b2 = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT);
-    UCX_TEST_BEGIN
-
-    UCX_TEST_ASSERT(b->capacity==16, "wrong capacity");
-    UCX_TEST_ASSERT(b2->capacity==32, "wrong capacity");
-    
-    UCX_TEST_ASSERT(b->size==0, "wrong size");
-    UCX_TEST_ASSERT(b2->size==0, "wrong size");
-    
-    UCX_TEST_ASSERT(b->pos==0, "wrong position");
-    UCX_TEST_ASSERT(b2->pos==0, "wrong position");
-    
-    UCX_TEST_ASSERT(b->flags==(UCX_BUFFER_AUTOEXTEND|UCX_BUFFER_AUTOFREE),
-        "wrong flags for autoextending buffer");
-    UCX_TEST_ASSERT(b2->flags==UCX_BUFFER_AUTOFREE,
-        "wrong flags for default bufer");
-    
-    UCX_TEST_END
-    ucx_buffer_free(b2);
-    ucx_buffer_free(b);
-}
-
-UCX_TEST(test_ucx_buffer_new_prealloc) {
-    char* test = (char*) malloc(16);
-    UcxBuffer *b = ucx_buffer_new(test, 16, UCX_BUFFER_DEFAULT);
-    UCX_TEST_BEGIN
-
-    UCX_TEST_ASSERT(b->capacity==16, "wrong capacity");
-    UCX_TEST_ASSERT(b->size==0, "wrong size");    
-    UCX_TEST_ASSERT(b->pos==0, "wrong position");
-    
-    UCX_TEST_ASSERT(b->flags==0, "wrong flags - all should be cleared");
-    
-    UCX_TEST_END
-    free(test);
-    ucx_buffer_free(b);
-}
-
-UCX_TEST(test_ucx_buffer_eof) {
-    char *test = (char*)"0123456789ABCDEF";
-    UcxBuffer *b = ucx_buffer_new(test, 16, UCX_BUFFER_DEFAULT);
-    UCX_TEST_BEGIN
-    b->pos = 9; b->size = 10;
-    UCX_TEST_ASSERT(!ucx_buffer_eof(b), "false positive");
-    b->pos = 10; b->size = 10;
-    UCX_TEST_ASSERT(ucx_buffer_eof(b), "pos == size should be EOF");
-    b->pos = 11; b->size = 10;
-    UCX_TEST_ASSERT(ucx_buffer_eof(b), "false negative");
-    UCX_TEST_END
-    ucx_buffer_free(b);
-}
-
-UCX_TEST(test_ucx_buffer_seek_overflow) {
-    UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT);
-    b->size = 32;
-    int r;
-    
-    UCX_TEST_BEGIN
-    const size_t sizemax = (size_t)-1;
-    size_t bigpos = sizemax - 5000;
-    b->pos = bigpos;
-    r = ucx_buffer_seek(b, 5016, SEEK_CUR);
-    UCX_TEST_ASSERT(r != 0, "seek cur overflow");
-    UCX_TEST_ASSERT(b->pos == bigpos,
-            "failed seek shall leave pos unchanged");
-    
-    b->pos = 0;
-    b->size = (sizemax >> 1) + 32;
-    
-    // we don't want to risk overflows in implicit constant casts
-    const size_t bigoff_comp = (sizemax >> 1) - 16;
-    off_t bigoff = (off_t)bigoff_comp;
-    
-    r = ucx_buffer_seek(b, -bigoff, SEEK_CUR);
-    UCX_TEST_ASSERT(r != 0, "seek cur underflow");
-    UCX_TEST_ASSERT(b->pos == 0,
-            "failed seek shall leave pos unchanged");
-    
-    UCX_TEST_END
-    
-    ucx_buffer_free(b);
-}
-
-UCX_TEST(test_ucx_buffer_seek_invalid) {
-    UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT);
-    b->pos = 7;
-    int r;
-    
-    UCX_TEST_BEGIN
-    r = ucx_buffer_seek(b, 0, ~(SEEK_SET|SEEK_CUR|SEEK_END));
-    UCX_TEST_ASSERT(r != 0, "invalid whence shall fail");
-    UCX_TEST_ASSERT(b->pos == 7,
-            "failed seek shall leave pos unchanged");
-    UCX_TEST_END
-    
-    ucx_buffer_free(b);
-}
-
-UCX_TEST(test_ucx_buffer_seek_oob) {
-    UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT);
-    b->size = 16; // less than capacity
-    b->pos = 7;
-    int r;
-
-    UCX_TEST_BEGIN
-    
-    r = ucx_buffer_seek(b, -1, SEEK_SET);
-    UCX_TEST_ASSERT(r != 0, "seek SET below bounds shall fail");
-    UCX_TEST_ASSERT(b->pos == 7,
-            "failed seek shall leave pos unchanged");
-    
-    r = ucx_buffer_seek(b, 16, SEEK_SET);
-    UCX_TEST_ASSERT(r != 0, "seek SET above bounds shall fail");
-    UCX_TEST_ASSERT(b->pos == 7,
-            "failed seek shall leave pos unchanged");
-    
-    r = ucx_buffer_seek(b, -8, SEEK_CUR);
-    UCX_TEST_ASSERT(r != 0, "seek CUR below bounds shall fail");
-    UCX_TEST_ASSERT(b->pos == 7,
-            "failed seek shall leave pos unchanged");
-    
-    r = ucx_buffer_seek(b, 9, SEEK_CUR);
-    UCX_TEST_ASSERT(r != 0, "seek CUR above bounds shall fail");
-    UCX_TEST_ASSERT(b->pos == 7,
-            "failed seek shall leave pos unchanged");
-    
-    r = ucx_buffer_seek(b, -17, SEEK_END);
-    UCX_TEST_ASSERT(r != 0, "seek END below bounds shall fail");
-    UCX_TEST_ASSERT(b->pos == 7,
-            "failed seek shall leave pos unchanged");
-    
-    r = ucx_buffer_seek(b, 1, SEEK_END);
-    UCX_TEST_ASSERT(r != 0, "seek END above bounds shall fail");
-    UCX_TEST_ASSERT(b->pos == 7,
-            "failed seek shall leave pos unchanged");
-
-    UCX_TEST_END
-
-    ucx_buffer_free(b);
-}
-
-UCX_TEST(test_ucx_buffer_seek_set) {
-    UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT);
-    b->size = 16;
-    int r;
-
-    UCX_TEST_BEGIN
-
-    r = ucx_buffer_seek(b, 5, SEEK_SET);
-    UCX_TEST_ASSERT(r == 0, "seek SET+5 failed");
-    UCX_TEST_ASSERT(b->pos == 5, "seek SET+5 set wrong position");
-    
-    
-    r = ucx_buffer_seek(b, 10, SEEK_SET);
-    UCX_TEST_ASSERT(r == 0, "seek SET+10 failed");
-    UCX_TEST_ASSERT(b->pos == 10, "seek SET+10 set wrong position");
-
-    UCX_TEST_END
-
-    ucx_buffer_free(b);
-}
-
-UCX_TEST(test_ucx_buffer_seek_cur) {
-    UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT);
-    b->size = 16;
-    int r;
-
-    UCX_TEST_BEGIN
-    
-    b->pos = 7;
-    r = ucx_buffer_seek(b, 5, SEEK_CUR);
-    UCX_TEST_ASSERT(r == 0, "seek CUR+5 failed");
-    UCX_TEST_ASSERT(b->pos == 12, "seek CUR+5 set wrong position");
-
-    UCX_TEST_END
-
-    ucx_buffer_free(b);
-}
-
-UCX_TEST(test_ucx_buffer_seek_end) {
-    UcxBuffer *b = ucx_buffer_new(NULL, 32, UCX_BUFFER_DEFAULT);
-    b->size = 16;
-    int r;
-
-    UCX_TEST_BEGIN
-    
-    r = ucx_buffer_seek(b, -5, SEEK_END);
-    UCX_TEST_ASSERT(r == 0, "seek END-5 failed");
-    UCX_TEST_ASSERT(b->pos == 11, "seek END-5 set wrong position");
-
-
-    UCX_TEST_END
-
-    ucx_buffer_free(b);
-}
-
-UCX_TEST(test_ucx_buffer_putc) {
-    char *buffer = (char*) malloc(16);
-    memset(buffer, 32, 16);
-
-    UcxBuffer *b = ucx_buffer_new(buffer, 16, UCX_BUFFER_DEFAULT);
-    b->size = b->capacity;
-
-    UCX_TEST_BEGIN
-
-    ucx_buffer_seek(b, 0, SEEK_SET);
-    UCX_TEST_ASSERT(ucx_buffer_putc(b, '0'|~0xFF) == '0',
-            "putc shall return (arg & 0xFF)");
-    ucx_buffer_putc(b, '0');
-    ucx_buffer_putc(b, '0');
-    
-    UCX_TEST_ASSERT(b->pos == 3, "pos wrong after first 3 puts");
-    ucx_buffer_seek(b, 10, SEEK_CUR);
-    
-    ucx_buffer_putc(b, '0');
-    ucx_buffer_putc(b, '0');
-    ucx_buffer_putc(b, '0');
-    
-    UCX_TEST_ASSERT(b->pos == 16, "pos wrong after last 3 puts");
-    
-    UCX_TEST_ASSERT(!memcmp(b->space, "000          000", 16),
-            "buffer content wrong")
-    UCX_TEST_END
-    ucx_buffer_free(b);
-    free(buffer);
-}
-    
-UCX_TEST(test_ucx_buffer_putc_oob) {
-    UcxBuffer *b = ucx_buffer_new(NULL, 2, UCX_BUFFER_DEFAULT);
-    
-    UCX_TEST_BEGIN
-    b->pos = b->size = b->capacity = 1;
-    b->space[1] = 'X';
-    
-    UCX_TEST_ASSERT(ucx_buffer_putc(b, 48) == EOF, "put shall return EOF "
-            "when buffer is full and auto extend is disabled");
-    UCX_TEST_ASSERT(!memcmp(b->space, "\0X", 2),
-            "wrong buffer content after failed putc");
-
-    UCX_TEST_END
-
-    ucx_buffer_free(b);
-}
-
-
-UCX_TEST(test_ucx_buffer_putc_ae) {
-    UcxBuffer *b = ucx_buffer_new(NULL, 2, UCX_BUFFER_AUTOEXTEND);
-    ucx_buffer_putc(b, '0');
-    ucx_buffer_putc(b, '1');
-    
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(b->pos == 2, "pos wrong after first 2 puts");
-    UCX_TEST_ASSERT(b->size == 2, "size wrong after first 2 puts");
-    UCX_TEST_ASSERT(b->capacity == 2, "buffer erroneously extended");
-    UCX_TEST_ASSERT(!memcmp(b->space,"01", 2), "wrong content");
-    
-    UCX_TEST_END
-    
-    ucx_buffer_free(b);
-}
-
-UCX_TEST(test_ucx_buffer_putc_oobae) {
-    UcxBuffer *b = ucx_buffer_new(NULL, 2, UCX_BUFFER_AUTOEXTEND);
-    ucx_buffer_putc(b, '0');
-    ucx_buffer_putc(b, '1');
-    
-    UCX_TEST_BEGIN
-    
-    ucx_buffer_putc(b, 'a');
-    
-    UCX_TEST_ASSERT(b->pos == 3, "pos wrong after put");
-    UCX_TEST_ASSERT(b->capacity == 4, "buffer not properly extended");
-    UCX_TEST_ASSERT(b->size == 3, "wrong buffer size");
-    
-    UCX_TEST_ASSERT(!memcmp(b->space,"01a\0", 4), "wrong content");
-    
-    UCX_TEST_END
-    
-    ucx_buffer_free(b);
-}
-
-UCX_TEST(test_ucx_buffer_putc_size) {
-    UcxBuffer *b = ucx_buffer_new(NULL, 4, UCX_BUFFER_DEFAULT);
-    
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(b->size == 0, "wrong initial size");
-    ucx_buffer_putc(b, 'a');
-    ucx_buffer_putc(b, 'b');
-    ucx_buffer_putc(b, 'c');
-    UCX_TEST_ASSERT(b->size == 3, "size does not increase");
-    ucx_buffer_seek(b, 1, SEEK_SET);
-    ucx_buffer_putc(b, 'd');
-    UCX_TEST_ASSERT(b->size == 3, "size shall not decrease");
-    UCX_TEST_ASSERT(b->pos == 2, "wrong position after seek and putc");
-
-    UCX_TEST_END
-
-    ucx_buffer_free(b);
-}
-
-UCX_TEST(test_ucx_buffer_getc) {
-    char *buffer = (char*) malloc(16);
-    memset(buffer, 32, 8);
-    for (int i = 8; i < 16 ; i++) {
-        buffer[i] = 40+i;
-    }
-
-    UcxBuffer *b = ucx_buffer_new(buffer, 16, UCX_BUFFER_DEFAULT);
-    b->size = b->capacity;
-    
-    unsigned char ubuffer[] = {127, 128, 129, 130};
-    UcxBuffer *ub = ucx_buffer_new(ubuffer, 4, UCX_BUFFER_DEFAULT);
-    ub->size = 4;
-
-    UCX_TEST_BEGIN
-
-    char rb[16];
-    for (size_t i = 0 ; i < 16 ; i++) {
-        UCX_TEST_ASSERT(b->pos == i, "wrong position");
-        UCX_TEST_ASSERT(!ucx_buffer_eof(b), "EOF false positive");
-        rb[i] = ucx_buffer_getc(b);
-    }
-    UCX_TEST_ASSERT(memcmp(rb, "        01234567", 16) == 0,
-        "read data incorrect");
-        
-    UCX_TEST_ASSERT(ucx_buffer_eof(b), "EOF not set after last possible read");
-    UCX_TEST_ASSERT(b->pos == 16, "wrong position after EOF");
-    
-    UCX_TEST_ASSERT(ucx_buffer_getc(b) == EOF,
-        "out of bounds read does not return EOF");
-    UCX_TEST_ASSERT(b->pos == 16, "wrong position after out of bounds read");
-    
-    int uc[5];
-    for(int i=0;i<5;i++) {
-        uc[i] = ucx_buffer_getc(ub);
-    }
-    UCX_TEST_ASSERT(uc[0] == 127, "wrong unsigned value(0)");
-    UCX_TEST_ASSERT(uc[1] == 128, "wrong unsigned value(0)");
-    UCX_TEST_ASSERT(uc[2] == 129, "wrong unsigned value(0)");
-    UCX_TEST_ASSERT(uc[3] == 130, "wrong unsigned value(0)");
-    UCX_TEST_ASSERT(uc[4] == EOF, "EOF not set after last ub read");
-
-    UCX_TEST_END
-
-    ucx_buffer_free(b);
-    ucx_buffer_free(ub);
-    free(buffer);
-}
-
-UCX_TEST(test_ucx_buffer_write) {
-    char *buffer = (char*) malloc(32);
-    memset(buffer, 0, 32);
-    
-    memset(buffer, 32, 8);
-    for (int i = 8; i < 16 ; i++) {
-        buffer[i] = 40+i;
-    }
-
-    UcxBuffer *b = ucx_buffer_new(buffer, 32, UCX_BUFFER_DEFAULT);
-    int r;
-
-    UCX_TEST_BEGIN
-    b->pos = 4;
-    r = ucx_buffer_write("test string", 1, 11, b);
-    UCX_TEST_ASSERT(r == 11, "returned incorrect number of written bytes");
-    UCX_TEST_ASSERT(b->pos == 15, "incorrect position");
-    UCX_TEST_ASSERT(memcmp(buffer, "    test string7\0\0", 18) == 0,
-        "incorrect buffer content (test string)");
-    
-    r = ucx_buffer_write(".", 1, 1, b);
-    UCX_TEST_ASSERT(r == 1, "returned incorrect number of written elements");
-    UCX_TEST_ASSERT(b->pos == 16, "incorrect position");
-    
-    int32_t testarr[4] = {0x09abcdef, 0x05fedcba, 0x01abefcd, 0x3cd07ab};
-    r = ucx_buffer_write(testarr, 4, 4, b);
-    UCX_TEST_ASSERT(r = 4, "returned incorrect number of written elements");
-    UCX_TEST_ASSERT(b->pos == 32, "incorrect position");
-    
-    char cmp[32];
-    memset(cmp, 0, 32);
-    memcpy(cmp, "    test string.", 16);
-    int32_t *ptr = (int32_t*) (cmp+16);
-    ptr[0] = testarr[0];
-    ptr[1] = testarr[1];
-    ptr[2] = testarr[2];
-    ptr[3] = testarr[3];
-    UCX_TEST_ASSERT(memcmp(buffer, cmp, 32) == 0,
-        "incorrect buffer content (int array)");
-    
-    UCX_TEST_END
-
-    ucx_buffer_free(b);
-    free(buffer);
-}
-
-UCX_TEST(test_ucx_buffer_write_oob) {
-    char *buffer = (char*) malloc(32);
-    memset(buffer, 0, 32);
-
-    UcxBuffer *b = ucx_buffer_new(buffer, 15, UCX_BUFFER_DEFAULT);
-    int r;
-
-    UCX_TEST_BEGIN
-    r = ucx_buffer_write("a very long string", 1, 18, b);
-    UCX_TEST_ASSERT(r == 15, "incorrect number of written bytes");
-    UCX_TEST_ASSERT(memcmp(buffer, "a very long str\0\0\0", 18) == 0,
-        "invalid buffer content (test string)");
-    
-    b->size = b->pos = 0;
-    int32_t intarr[4] = {0,-1,0,-1};
-    memset(buffer, 0, 32);
-    
-    r = ucx_buffer_write(intarr, 4, 4, b);
-    UCX_TEST_ASSERT(r == 3, "incorrect number of written elements");
-    UCX_TEST_ASSERT(memcmp(buffer,
-        "\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0", 16) == 0,
-        "invalid buffer content (test string)");
-    
-    UCX_TEST_END
-
-    ucx_buffer_free(b);
-    free(buffer);
-}
-
-UCX_TEST(test_ucx_buffer_write_ax) {
-    char *buffer = (char*) malloc(16);
-    memset(buffer, 0, 16);
-
-    UcxBuffer *b = ucx_buffer_new(buffer, 16,
-            UCX_BUFFER_AUTOEXTEND | UCX_BUFFER_AUTOFREE);
-    int r;
-
-    UCX_TEST_BEGIN
-
-    const char* teststring = "this is way too much";
-    r = ucx_buffer_write((void*)teststring, 1, 20, b);
-    buffer = (char*) b->space; /*autoextend enabled, we MUST retrieve pointer*/
-    UCX_TEST_ASSERT(r == 20, "not all characters written");
-    UCX_TEST_ASSERT(b->capacity == 32, "buffer not properly extended");
-    UCX_TEST_ASSERT(b->pos == 20, "position incorrect");
-    UCX_TEST_ASSERT(memcmp(buffer,
-            "this is way too much\0\0\0\0\0\0\0\0\0\0\0\0", 32) == 0,
-            "incorrect buffer content");
-
-    UCX_TEST_END
-
-    ucx_buffer_free(b);
-}
-
-UCX_TEST(test_ucx_buffer_read) {
-    UcxBuffer *b = ucx_buffer_new(NULL, 8, UCX_BUFFER_AUTOFREE);
-    ucx_buffer_write("01234567", 1, 8, b);
-    b->pos = 0;
-    
-    char buf[32];
-    memset(buf, 'X', 32);
-    int r;
-    
-    UCX_TEST_BEGIN
-    
-    ucx_buffer_seek(b, 2, SEEK_SET);
-    r = ucx_buffer_read(buf, 1, 2, b);
-    UCX_TEST_ASSERT(r == 2, "wrong number of bytes read (2 items)");
-    UCX_TEST_ASSERT(buf[0] == '2' && buf[1] == '3' && buf[2] == 'X',
-            "buffer incorrect after read");
-    UCX_TEST_ASSERT(b->pos == 4, "wrong position after read (2 items)");
-    
-    UCX_TEST_END
-    
-    ucx_buffer_free(b);
-}
-
-UCX_TEST(test_ucx_buffer_read_oob) {
-    UcxBuffer *b = ucx_buffer_new(NULL, 8, UCX_BUFFER_AUTOFREE);
-    ucx_buffer_write("01234567", 1, 8, b);
-    
-    char buf[32];
-    memset(buf, 'X', 32);
-    int r;
-    
-    UCX_TEST_BEGIN
-
-    b->pos = 2;
-    r = ucx_buffer_read(buf + 2, 1, 8, b);
-    UCX_TEST_ASSERT(r == 6, "wrong number of bytes read (8 items)");
-    UCX_TEST_ASSERT(memcmp(buf, "XX234567XX", 10) == 0,
-            "buffer incorrect after read");
-    UCX_TEST_ASSERT(b->pos == 8,
-        "wrong position after read (8 items out of bound)");
-
-    b->pos = 0;
-    memset(buf, 'X', 32);
-    
-    r = ucx_buffer_read(buf, 3, 3, b);
-    
-    UCX_TEST_ASSERT(r == 2, "wrong number of blocks read");
-    UCX_TEST_ASSERT(memcmp(buf, "012345XX", 8) == 0,
-            "buffer incorrect after block out of bounds read");
-    
-    r = ucx_buffer_read(buf+6, 1, 5, b);
-    
-    UCX_TEST_ASSERT(r == 2, "wrong number of remaining bytes read");
-    UCX_TEST_ASSERT(memcmp(buf, "01234567XX", 10) == 0,
-            "buffer incorrect after remaining byte read");
-    
-    UCX_TEST_END
-    
-    ucx_buffer_free(b);
-}
-
-UCX_TEST(test_ucx_buffer_extract) {
-    char *buffer = (char*) malloc(16);
-    strcpy(buffer, "this is a test!");
-
-    UcxBuffer *src = ucx_buffer_new(buffer, 16, UCX_BUFFER_AUTOFREE);
-    src->size = 16;
-    UcxBuffer *dst = ucx_buffer_extract(src, 5, 5, UCX_BUFFER_AUTOEXTEND);
-
-    UCX_TEST_BEGIN
-    UCX_TEST_ASSERT(dst != NULL, "ucx_buffer_extract returned NULL");
-    UCX_TEST_ASSERT(dst->flags == (UCX_BUFFER_AUTOEXTEND | UCX_BUFFER_AUTOFREE),
-            "autofree flag shall be enforced");
-    UCX_TEST_ASSERT(dst->size == 5, "wrong size for new buffer");
-    UCX_TEST_ASSERT(dst->capacity == 5, "wrong capacity for new buffer");
-    UCX_TEST_ASSERT(dst->pos == 0, "wrong position for new buffer");
-    char rb[5];
-    ucx_buffer_read(rb, 1, 5, dst);
-    UCX_TEST_ASSERT(memcmp(rb, "is a ", 5) == 0,
-            "new buffer has incorrect content");
-
-    UCX_TEST_END
-
-    ucx_buffer_free(dst);
-    ucx_buffer_free(src);
-}
-
-UCX_TEST(test_ucx_buffer_extract_oob) {
-    char *buffer = (char*) malloc(16);
-    strcpy(buffer, "this is a test!");
-
-    UcxBuffer *src = ucx_buffer_new(buffer, 16, UCX_BUFFER_AUTOFREE);
-    src->size = 16;
-    
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(ucx_buffer_extract(src, 5, 0, UCX_BUFFER_DEFAULT) == NULL,
-            "extract shall fail on zero length");
-    UCX_TEST_ASSERT(ucx_buffer_extract(src, 10, 10, UCX_BUFFER_DEFAULT) == NULL,
-            "extract shall fail on invalid bounds (size exceeds limits)");
-    UCX_TEST_ASSERT(ucx_buffer_extract(src, 20, -7, UCX_BUFFER_DEFAULT) == NULL,
-            "extract shall fail on invalid bounds (start exceeds limits)");
-
-    UCX_TEST_END
-
-    ucx_buffer_free(src);
-}
-
-UCX_TEST(test_ucx_buffer_extract_overflow) {
-    char *buffer = (char*) malloc(16);
-    strcpy(buffer, "this is a test!");
-
-    UcxBuffer *src = ucx_buffer_new(buffer, 16, UCX_BUFFER_AUTOFREE);
-    src->size = 16;
-    
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(ucx_buffer_extract(src, 5, (size_t)-4,
-        UCX_BUFFER_DEFAULT) == NULL, "extract shall fail on integer overflow");
-
-    UCX_TEST_END
-
-    ucx_buffer_free(src);
-}
-
-UCX_TEST(test_ucx_buffer_extend) {
-    
-    UcxBuffer *b = ucx_buffer_new(NULL, 10, UCX_BUFFER_DEFAULT);
-    
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(ucx_buffer_extend(b, 15) == 0, "shall return 0 on success");
-    UCX_TEST_ASSERT(b->capacity = 40, "wrong capacity");
-    UCX_TEST_ASSERT((b->size == 0 && b->pos == 0),
-        "pos and size shall remain unchanged");
-    
-    UCX_TEST_ASSERT(ucx_buffer_extend(b, (size_t) - 61) != 0,
-        "shall fail and return a non-zero value on overflow");
-    
-    UCX_TEST_END
-    
-    ucx_buffer_free(b);
-}
-
-UCX_TEST(test_ucx_buffer_shl) {
-    
-    const char* hw = "Shift the World!";
-    
-    UcxBuffer *b = ucx_buffer_new(NULL, 20, UCX_BUFFER_DEFAULT);
-    ucx_buffer_puts(b, hw);
-    b->pos = 5;
-    
-    UCX_TEST_BEGIN
-    char* expected;
-    
-    ucx_buffer_shift_left(b, 2);
-    expected = "ift the World!";
-    
-    UCX_TEST_ASSERT(b->pos == 3, "position after normal shl wrong");
-    UCX_TEST_ASSERT(b->size == strlen(expected), "size after normal shl wrong");
-    UCX_TEST_ASSERT(!memcmp(b->space, expected, b->size),
-            "contents after normal shl wrong");
-    
-    
-    ucx_buffer_shift_left(b, 5);
-    expected = "he World!";
-    
-    UCX_TEST_ASSERT(b->pos == 0, "position after overshift left wrong");
-    UCX_TEST_ASSERT(b->size == strlen(expected),
-            "size after overshift left wrong");
-    UCX_TEST_ASSERT(!memcmp(b->space, expected, b->size),
-            "contents after overshift left wrong");
-    
-    ucx_buffer_shift_left(b, 10);
-    UCX_TEST_ASSERT(b->pos == 0, "position after 'shl everything away' wrong");
-    UCX_TEST_ASSERT(b->size == 0, "size after 'shl everything away' wrong");
-    
-    UCX_TEST_END
-    
-    ucx_buffer_free(b);    
-}
-
-UCX_TEST(test_ucx_buffer_shr) {
-    
-    const char* hw = "Shift the World!";
-    
-    UcxBuffer *b = ucx_buffer_new(NULL, 20, UCX_BUFFER_DEFAULT);
-    ucx_buffer_puts(b, hw);
-    b->pos = 12;
-    
-    UCX_TEST_BEGIN
-    char* expected;
-    
-    ucx_buffer_shift_right(b, 2);
-    expected = "ShShift the World!";
-    
-    UCX_TEST_ASSERT(b->pos == 14, "position after normal shr wrong");
-    UCX_TEST_ASSERT(b->size == strlen(expected), "size after normal shr wrong");
-    UCX_TEST_ASSERT(!memcmp(b->space, expected, b->size),
-            "contents after normal shr wrong");
-    
-    
-    ucx_buffer_shift_right(b, 5);
-    expected = "ShShiShShift the Wor";
-    UCX_TEST_ASSERT(strlen(expected) == b->capacity,
-            "Test data is wrong, please fix the test.");
-    
-    UCX_TEST_ASSERT(b->pos == 19,
-            "position after overshift right w/o auto-extend wrong");
-    UCX_TEST_ASSERT(b->size == 20,
-            "size after overshift right w/o auto-extend wrong");
-    UCX_TEST_ASSERT(b->capacity == 20,
-            "capacity after overshift right w/o auto-extend wrong");
-    UCX_TEST_ASSERT(!memcmp(b->space, expected, b->size),
-            "contents after overshift right w/o auto-extend wrong");
-    
-    ucx_buffer_shift_right(b, 15);
-    UCX_TEST_ASSERT(b->pos == b->capacity, "position after 'shr to eof' wrong");
-    UCX_TEST_ASSERT(b->size == b->capacity, "size after 'shr to eof' wrong");
-    UCX_TEST_ASSERT(ucx_buffer_eof(b), "buffer not eof after 'shr to eof'");
-    
-    UCX_TEST_END
-    
-    ucx_buffer_free(b);    
-}
-
-UCX_TEST(test_ucx_buffer_shr_ax) {
-    
-    const char* hw = "Shift the World!";
-    
-    UcxBuffer *b = ucx_buffer_new(NULL, 20, UCX_BUFFER_AUTOEXTEND);
-    ucx_buffer_puts(b, hw);
-    b->pos = 12;
-    
-    UCX_TEST_BEGIN
-    
-    const char* expected = "Shift the Shift the World!";
-    
-    ucx_buffer_shift_right(b, 10);
-    UCX_TEST_ASSERT(b->pos == 22, "position after shr w/ auto-extend wrong");
-    UCX_TEST_ASSERT(b->size == strlen(expected),
-            "size after shr w/ auto-extend wrong");
-    UCX_TEST_ASSERT(b->capacity >= b->size,
-            "auto-extension of capacity after shr w/ auto-extend failed");
-    UCX_TEST_ASSERT(!ucx_buffer_eof(b),
-            "buffer should not be eof after shr w/ auto-extend");
-    UCX_TEST_ASSERT(!memcmp(b->space, expected, b->size),
-            "contents wrong after shr w/ auto-extend");
-    
-    UCX_TEST_END
-    
-    ucx_buffer_free(b);    
-}
-
--- a/test/buffer_tests.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef BUFFER_TEST_H
-#define	BUFFER_TEST_H
-
-#include <ucx/test.h>
-#include <ucx/buffer.h>
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-UCX_TEST(test_ucx_buffer_eof);
-UCX_TEST(test_ucx_buffer_seek_set);
-UCX_TEST(test_ucx_buffer_seek_end);
-UCX_TEST(test_ucx_buffer_seek_cur);
-UCX_TEST(test_ucx_buffer_seek_oob);
-UCX_TEST(test_ucx_buffer_seek_invalid);
-UCX_TEST(test_ucx_buffer_seek_overflow);
-UCX_TEST(test_ucx_buffer_putc);
-UCX_TEST(test_ucx_buffer_putc_ae);
-UCX_TEST(test_ucx_buffer_putc_oob);
-UCX_TEST(test_ucx_buffer_putc_oobae);
-UCX_TEST(test_ucx_buffer_putc_size);
-UCX_TEST(test_ucx_buffer_new);
-UCX_TEST(test_ucx_buffer_new_prealloc);
-UCX_TEST(test_ucx_buffer_getc);
-UCX_TEST(test_ucx_buffer_read);
-UCX_TEST(test_ucx_buffer_read_oob);
-UCX_TEST(test_ucx_buffer_extract);
-UCX_TEST(test_ucx_buffer_extract_oob);
-UCX_TEST(test_ucx_buffer_extract_overflow);
-UCX_TEST(test_ucx_buffer_extend);
-UCX_TEST(test_ucx_buffer_write);
-UCX_TEST(test_ucx_buffer_write_oob);
-UCX_TEST(test_ucx_buffer_write_ax);
-UCX_TEST(test_ucx_buffer_shl);
-UCX_TEST(test_ucx_buffer_shr);
-UCX_TEST(test_ucx_buffer_shr_ax);
-
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* BUFFER_TEST_H */
-
--- a/test/list_tests.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,496 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "list_tests.h"
-#include <ucx/utils.h>
-
-UCX_TEST(test_ucx_list_append) {
-    UcxList *list, *first;
-    list = first = ucx_list_append(NULL, (void*)"Hello");
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(strncmp((const char*)list->data, "Hello", 5) == 0,
-            "failed");
-    
-    list = ucx_list_append(list, (void*)" World!");
-    
-    UCX_TEST_ASSERT(list == first, "does not return first element");
-    UCX_TEST_ASSERT(strncmp((const char*)list->next->data, " World!", 7) == 0,
-            "failed");
-    UCX_TEST_ASSERT(list->next->prev == list, "failed");
-    UCX_TEST_ASSERT(list->next->next == NULL, "failed");
-    UCX_TEST_END
-    
-    ucx_list_free(list);
-}
-
-UCX_TEST(test_ucx_list_prepend) {
-    UcxList *list, *last;
-    list = last = ucx_list_prepend(NULL, (void*)" World!");
-    UCX_TEST_BEGIN
-
-    list = ucx_list_prepend(list, (void*)"Hello");
-    
-    UCX_TEST_ASSERT(strncmp((const char*)list->data, "Hello", 5) == 0,
-            "failed");
-    UCX_TEST_ASSERT(strncmp((const char*)list->next->data, " World!", 7) == 0,
-            "failed");
-    UCX_TEST_ASSERT(list == last->prev, "does not return first element");
-    UCX_TEST_ASSERT(list->next->next == NULL, "failed");
-    UCX_TEST_ASSERT(list->prev == NULL, "failed");
-    
-    UCX_TEST_END
-    ucx_list_free(list);
-}
-
-UCX_TEST(test_ucx_list_equals) {
-    const char *hello = "Hello";
-    const char *world = " World!";
-    UcxList *list = ucx_list_append(NULL, (void*)hello);
-    list = ucx_list_append(list, (void*)world);
-    UcxList *list2 = ucx_list_prepend(NULL, (void*)world);
-    list2 = ucx_list_prepend(list2, (void*)hello);
-    UcxList *list3 = ucx_list_prepend(NULL, (void*)" Welt!");
-    list3 = ucx_list_prepend(list3, (void*)"Hallo");
-    UcxList *list4 = ucx_list_prepend(NULL, (void*)" World!");
-    list4 = ucx_list_prepend(list4, (void*)"Hello");
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(ucx_list_equals(list, list4, ucx_cmp_str, NULL), "failed");
-    UCX_TEST_ASSERT(!ucx_list_equals(list, list3, ucx_cmp_str, NULL), "failed");
-    UCX_TEST_ASSERT(ucx_list_equals(list, list2, NULL, NULL), "failed");
-    
-    UCX_TEST_END
-    ucx_list_free(list4);
-    ucx_list_free(list3);
-    ucx_list_free(list2);
-    ucx_list_free(list);
-}
-
-UCX_TEST(test_ucx_list_concat) {
-    UcxList *list = ucx_list_append(NULL, (void*)"Hello");
-    list = ucx_list_append(list, (void*)" my ");
-    UcxList *list2 = ucx_list_prepend(NULL, (void*)" World!");
-    list2 = ucx_list_prepend(list2, (void*)" sweet ");
-    UCX_TEST_BEGIN
-    
-    list = ucx_list_concat(list, list2);
-    list = ucx_list_concat(list, NULL);
-    list = ucx_list_concat(NULL, list);
-    
-    UCX_TEST_ASSERT(!strncmp((const char*)list->data, "Hello", 5),
-            "failed");
-    UCX_TEST_ASSERT(!strncmp((const char*)list->next->data, " my ", 4),
-            "failed");
-    UCX_TEST_ASSERT(!strncmp((const char*)list->next->next->data, " sweet ", 7),
-            "failed");
-    UCX_TEST_ASSERT(!strncmp((const char*)ucx_list_last(list)->data,
-            " World!", 7), "failed");
-
-    UCX_TEST_ASSERT(list->prev == NULL, "failed");
-    
-    UCX_TEST_END
-    // don't free list2, as it is freed by freeing list;
-    ucx_list_free(list);
-}
-
-UCX_TEST(test_ucx_list_size) {
-    UcxList *list = ucx_list_append(NULL, (void*)"This ");
-    list = ucx_list_append(list, (void*)"list ");
-    list = ucx_list_append(list, (void*)"has ");
-    list = ucx_list_append(list, (void*)"size ");
-    list = ucx_list_append(list, (void*)"5!");
-    
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(ucx_list_size(list) == 5, "failed");
-    list = ucx_list_remove(list, ucx_list_get(list, 2));
-    UCX_TEST_ASSERT(ucx_list_size(list) == 4, "failed after removal");
-    
-    UCX_TEST_END
-    ucx_list_free(list);
-}
-
-UCX_TEST(test_ucx_list_first) {
-    UcxList *list = ucx_list_append(NULL, (void*)"Find ");
-    list = ucx_list_append(list, (void*)"the ");
-    list = ucx_list_append(list, (void*)"first!");
-    
-    UCX_TEST_BEGIN
-    
-    const char* first = (const char*) (ucx_list_first(list)->data);
-    
-    UCX_TEST_ASSERT(strncmp(first, "Find ", 5) == 0, "failed");
-    UCX_TEST_ASSERT(ucx_list_first(list->next->next) == list, "failed");
-    UCX_TEST_ASSERT(!ucx_list_first(NULL),
-        "does not return NULL on an empty list");
-    
-    UCX_TEST_END
-    ucx_list_free(list);
-}
-
-UCX_TEST(test_ucx_list_last) {
-    UcxList *list = ucx_list_append(NULL, (void*)"Find ");
-    list = ucx_list_append(list, (void*)"the ");
-    list = ucx_list_append(list, (void*)"last!");
-    
-    UCX_TEST_BEGIN
-    
-    const char* last = (const char*) (ucx_list_last(list->next->next)->data);
-    
-    UCX_TEST_ASSERT(strncmp(last, "last!", 5) == 0, "failed");
-    UCX_TEST_ASSERT(ucx_list_last(list) == list->next->next, "failed");
-    UCX_TEST_ASSERT(!ucx_list_last(NULL),
-        "does not return NULL on an empty list");
-    
-    UCX_TEST_END
-    ucx_list_free(list);
-}
-
-UCX_TEST(test_ucx_list_get) {
-    UcxList *list = ucx_list_append(NULL, (void*)"Find ");
-    list = ucx_list_append(list, (void*)"the ");
-    list = ucx_list_append(list, (void*)"mid!");
-    
-    UCX_TEST_BEGIN
-    
-    const char* first = (const char*) (ucx_list_get(list, 0)->data);
-    const char* mid = (const char*) (ucx_list_get(list, 1)->data);
-    const char* last = (const char*) (ucx_list_get(list, 2)->data);
-    
-    UCX_TEST_ASSERT(strncmp(first, "Find ", 5) == 0, "failed");
-    UCX_TEST_ASSERT(strncmp(mid, "the ", 4) == 0, "failed");
-    UCX_TEST_ASSERT(strncmp(last, "mid!", 4) == 0, "failed");
-    UCX_TEST_ASSERT(!ucx_list_get(list, -1), "out of bounds (neg)");
-    UCX_TEST_ASSERT(!ucx_list_get(list, 3), "out of bounds");
-    UCX_TEST_ASSERT(!ucx_list_get(NULL, 0), "empty list");
-    
-    UCX_TEST_END
-    ucx_list_free(list);
-}
-
-UCX_TEST(test_ucx_list_indexof) {
-    UcxList *list = ucx_list_append(NULL, (void*)"Find ");
-    list = ucx_list_append(list, (void*)"the ");
-    list = ucx_list_append(list, (void*)"mid!");
-    
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(ucx_list_indexof(list, list) == 0, "failed");
-    UCX_TEST_ASSERT(ucx_list_indexof(list, list->next) == 1, "failed");
-    UCX_TEST_ASSERT(ucx_list_indexof(list, ucx_list_get(list, 2)) == 2,
-        "failed");
-    
-    UcxList *otherlist = ucx_list_append(NULL, (void*) "the ");
-    UCX_TEST_ASSERT(ucx_list_indexof(list, otherlist) == -1, "failed");
-    UCX_TEST_ASSERT(ucx_list_indexof(NULL, otherlist) == -1, "empty list");
-
-    ucx_list_free(otherlist);
-    
-    UCX_TEST_END
-    ucx_list_free(list);
-}
-
-UCX_TEST(test_ucx_list_find) {
-    const char* teststr = "string!";
-    UcxList *l = ucx_list_append(NULL, (void*)"find ");
-    l = ucx_list_append(l, (void*)"some ");
-    l = ucx_list_append(l, (void*)teststr);
-    
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(ucx_list_find(l,(void*)"some ",ucx_cmp_str,NULL) == 1,
-        "doesn't find string");
-    UCX_TEST_ASSERT(ucx_list_find(l,(void*)"a",ucx_cmp_str,NULL) == -1,
-        "finds non-existing string");
-    
-    UCX_TEST_ASSERT(ucx_list_find(l,(void*)teststr,NULL,NULL) == 2,
-        "doesn't find integer without cmp_func");
-    
-    UCX_TEST_ASSERT(ucx_list_find(NULL, (void*)"some ",ucx_cmp_str,NULL) == -1,
-        "empty list");
-    
-    UCX_TEST_END
-    ucx_list_free(l);
-}
-
-UCX_TEST(test_ucx_list_contains) {
-    UcxList *l = ucx_list_append(NULL, (void*)"Contains ");
-    l = ucx_list_append(l, (void*)"a ");
-    l = ucx_list_append(l, (void*)"string!");
-    
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(ucx_list_contains(l,(void*)"a ",ucx_cmp_str,NULL),
-        "false negative");
-    UCX_TEST_ASSERT(!ucx_list_contains(l,(void*)"a",ucx_cmp_str,NULL),
-        "false positive");
-    
-    UCX_TEST_END
-    ucx_list_free(l);
-}
-
-UCX_TEST(test_ucx_list_remove) {
-    UcxList *list = ucx_list_append(NULL, (void*)"Hello");
-    list = ucx_list_append(list, (void*)"fucking");
-    list = ucx_list_append(list, (void*)"World!");
-    
-    UcxList *list2 = ucx_list_append(NULL, (void*)"A");
-    list2 = ucx_list_append(list2, (void*)"B");
-    list2 = ucx_list_append(list2, (void*)"C");
-    list2 = ucx_list_append(list2, (void*)"D");
-    list2 = ucx_list_append(list2, (void*)"E");
-    list2 = ucx_list_append(list2, (void*)"F");
-    list2 = ucx_list_append(list2, (void*)"G");
-    
-    UCX_TEST_BEGIN
-    
-    list = ucx_list_remove(list, ucx_list_get(list, 1));
-    
-    UCX_TEST_ASSERT(strncmp((const char*)list->data, "Hello", 5) == 0,
-            "failed");
-    UCX_TEST_ASSERT(strncmp((const char*)list->next->data, "World!", 7) == 0,
-            "failed");
-    UCX_TEST_ASSERT(list->next->next == NULL, "failed");
-    
-    // remove first element: B, C, D, E, F, G
-    list2 = ucx_list_remove(list2, list2);
-    
-    UCX_TEST_ASSERT(ucx_list_size(list2) == 6, "list2 has wrong size");
-    UCX_TEST_ASSERT(strncmp((const char*)list2->data, "B", 1) == 0,
-            "wrong first element");
-    UCX_TEST_ASSERT(strncmp((const char*)ucx_list_get(list2, 5)->data, "G", 1)
-            == 0, "wrong last element");
-    
-    // remove second element: B, D, E, F, G
-    list2 = ucx_list_remove(list2, list2->next);
-    
-    UCX_TEST_ASSERT(ucx_list_size(list2) == 5, "list2 has wrong size");
-    UCX_TEST_ASSERT(strncmp((const char*)list2->next->data, "D", 1) == 0,
-            "wrong second element");
-    
-    UcxList *last = ucx_list_get(list2, 4);
-    list2 = ucx_list_remove(list2, last->prev);
-    
-    UCX_TEST_ASSERT(ucx_list_size(list2) == 4, "list2 has wrong size");
-    UCX_TEST_ASSERT(strncmp((const char*)last->prev->data, "E", 1) == 0,
-            "wrong element");
-    
-    // remove last element: B, D, E, F
-    list2 = ucx_list_remove(list2, last);
-    UCX_TEST_ASSERT(ucx_list_size(list2) == 3, "list2 has wrong size");
-    UCX_TEST_ASSERT(strncmp((const char*)ucx_list_get(list2, 2)->data, "E", 1)
-            == 0, "wrong last element");
-    
-    UCX_TEST_ASSERT(strncmp((const char*)list2->data, "B", 1) == 0,
-            "wrong element");
-    
-    list2 = ucx_list_remove(list2, list2);
-    UCX_TEST_ASSERT(ucx_list_size(list2) == 2, "list2 has wrong size");
-    list2 = ucx_list_remove(list2, list2);
-    UCX_TEST_ASSERT(ucx_list_size(list2) == 1, "list2 has wrong size");
-    list2 = ucx_list_remove(list2, list2);
-    UCX_TEST_ASSERT(list2 == NULL, "list2 is not null");
-    
-    UCX_TEST_END
-    ucx_list_free(list);
-}
-
-UCX_TEST(test_ucx_list_clone) {
-   
-    char *hello = (char*)malloc(6);
-    char *world = (char*)malloc(8);
-    
-    memcpy(hello, "Hello", 6);
-    memcpy(world, " World!", 8);
-    
-    UcxList *list = ucx_list_append(NULL, hello);
-    list = ucx_list_append(list, world);
-    
-    UcxList *copy = ucx_list_clone(list, ucx_strcpy, NULL);
-    UCX_TEST_BEGIN
-
-    UCX_TEST_ASSERT(ucx_list_equals(list, copy, ucx_cmp_str, NULL), "failed");
-    UCX_TEST_ASSERT(hello != copy->data, "first element is no copy");
-    UCX_TEST_ASSERT(world != copy->next->data, "second element is no copy");
-
-    UCX_TEST_END
-    
-    ucx_list_free_content(copy, free);
-
-    free(world);
-    free(hello);
-    ucx_list_free(list);
-    ucx_list_free(copy);
-}
-
-UCX_TEST(test_ucx_list_sort) {
-    UcxList *list = ucx_list_append(NULL, (void*)"this");
-    list = ucx_list_append(list, (void*)"is");
-    list = ucx_list_append(list, (void*)"a");
-    list = ucx_list_append(list, (void*)"test");
-    list = ucx_list_append(list, (void*)"for");
-    list = ucx_list_append(list, (void*)"partial");
-    list = ucx_list_append(list, (void*)"correctness");
-    list = ucx_list_append(list, (void*)"of");
-    list = ucx_list_append(list, (void*)"the");
-    list = ucx_list_append(list, (void*)"sort");
-    list = ucx_list_append(list, (void*)"function");
-    list = ucx_list_append(list, (void*)"that");
-    list = ucx_list_append(list, (void*)"shall");
-    list = ucx_list_append(list, (void*)"pass");
-    list = ucx_list_append(list, (void*)"this");
-    list = ucx_list_append(list, (void*)"test");
-
-    UcxList *expected = ucx_list_append(NULL, (void*)"a");
-    expected = ucx_list_append(expected, (void*)"correctness");
-    expected = ucx_list_append(expected, (void*)"for");
-    expected = ucx_list_append(expected, (void*)"function");
-    expected = ucx_list_append(expected, (void*)"is");
-    expected = ucx_list_append(expected, (void*)"of");
-    expected = ucx_list_append(expected, (void*)"partial");
-    expected = ucx_list_append(expected, (void*)"pass");
-    expected = ucx_list_append(expected, (void*)"shall");
-    expected = ucx_list_append(expected, (void*)"sort");
-    expected = ucx_list_append(expected, (void*)"test");
-    expected = ucx_list_append(expected, (void*)"test");
-    expected = ucx_list_append(expected, (void*)"that");
-    expected = ucx_list_append(expected, (void*)"the");
-    expected = ucx_list_append(expected, (void*)"this");
-    expected = ucx_list_append(expected, (void*)"this");
-
-    list = ucx_list_sort(list, ucx_cmp_str, NULL);
-
-    UCX_TEST_BEGIN
-    UCX_TEST_ASSERT(
-            ucx_list_equals(list, expected, ucx_cmp_str, NULL), "failed");
-    UCX_TEST_ASSERT(ucx_list_size(list) == 16, "list has now a wrong size");
-    UcxList *l = list;
-    UCX_TEST_ASSERT(l->prev == NULL, "prev field of first entry is not null");
-    while (l->next != NULL) {
-        UCX_TEST_ASSERT(l->next->prev == l, "next or prev pointer corrupted");
-        l = l->next;
-    }
-    UCX_TEST_ASSERT(!ucx_list_sort(NULL, ucx_cmp_str, NULL),
-        "failed to sort empty list");
-    UCX_TEST_END
-
-    ucx_list_free(expected);
-    ucx_list_free(list);
-}
-
-UCX_TEST(test_ucx_list_union) {
-    UcxList *left = ucx_list_append(NULL, (void*)"this");
-    left = ucx_list_append(left, (void*)"is");
-    left = ucx_list_append(left, (void*)"a");
-    left = ucx_list_append(left, (void*)"test");
-
-    UcxList *right = ucx_list_append(NULL, (void*)"to");
-    right = ucx_list_append(right, (void*)"test");
-    right = ucx_list_append(right, (void*)"set");
-    right = ucx_list_append(right, (void*)"operations");
-    
-    UcxList *expected = ucx_list_append(NULL, (void*)"this");
-    expected = ucx_list_append(expected, (void*)"is");
-    expected = ucx_list_append(expected, (void*)"a");
-    expected = ucx_list_append(expected, (void*)"test");
-    expected = ucx_list_append(expected, (void*)"to");
-    expected = ucx_list_append(expected, (void*)"set");
-    expected = ucx_list_append(expected, (void*)"operations");
-
-    UcxList* result = ucx_list_union(left, right, ucx_cmp_str,
-            NULL, NULL, NULL);
-
-    UCX_TEST_BEGIN
-    UCX_TEST_ASSERT(ucx_list_equals(result, expected,
-            ucx_cmp_str, NULL), "failed");
-    UCX_TEST_END
-
-    ucx_list_free(result);
-    ucx_list_free(expected);
-    ucx_list_free(right);
-    ucx_list_free(left);
-}
-
-UCX_TEST(test_ucx_list_intersection) {
-    UcxList *left = ucx_list_append(NULL, (void*)"this");
-    left = ucx_list_append(left, (void*)"is");
-    left = ucx_list_append(left, (void*)"a");
-    left = ucx_list_append(left, (void*)"test");
-
-    UcxList *right = ucx_list_append(NULL, (void*)"to");
-    right = ucx_list_append(right, (void*)"test");
-    right = ucx_list_append(right, (void*)"a");
-    right = ucx_list_append(right, (void*)"set");
-    right = ucx_list_append(right, (void*)"operation");
-    
-    UcxList *expected = ucx_list_append(NULL, (void*)"a");
-    expected = ucx_list_append(expected, (void*)"test");
-
-    UcxList* result = ucx_list_intersection(left, right, ucx_cmp_str,
-            NULL, NULL, NULL);
-
-    UCX_TEST_BEGIN
-    UCX_TEST_ASSERT(ucx_list_equals(result, expected,
-            ucx_cmp_str, NULL), "failed");
-    UCX_TEST_END
-
-    ucx_list_free(result);
-    ucx_list_free(expected);
-    ucx_list_free(right);
-    ucx_list_free(left);
-}
-
-UCX_TEST(test_ucx_list_difference) {
-    UcxList *left = ucx_list_append(NULL, (void*)"this");
-    left = ucx_list_append(left, (void*)"is");
-    left = ucx_list_append(left, (void*)"a");
-    left = ucx_list_append(left, (void*)"test");
-
-    UcxList *right = ucx_list_append(NULL, (void*)"to");
-    right = ucx_list_append(right, (void*)"test");
-    right = ucx_list_append(right, (void*)"this");
-    right = ucx_list_append(right, (void*)"set");
-    right = ucx_list_append(right, (void*)"operations");
-    
-    UcxList *expected = ucx_list_append(NULL, (void*)"is");
-    expected = ucx_list_append(expected, (void*)"a");
-    
-    UcxList* result = ucx_list_difference(left, right, ucx_cmp_str,
-            NULL, NULL, NULL);
-
-    UCX_TEST_BEGIN
-    UCX_TEST_ASSERT(ucx_list_equals(result, expected,
-            ucx_cmp_str, NULL), "failed");
-    UCX_TEST_END
-
-    ucx_list_free(result);
-    ucx_list_free(expected);
-    ucx_list_free(right);
-    ucx_list_free(left);
-}
--- a/test/list_tests.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef LIST_TESTS_H
-#define	LIST_TESTS_H
-
-#include <ucx/list.h>
-#include <ucx/test.h>
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-/*
- * Assumed to be correct:
- *   ucx_list_free
- */
-
-UCX_TEST(test_ucx_list_append);
-UCX_TEST(test_ucx_list_prepend);
-UCX_TEST(test_ucx_list_equals);
-UCX_TEST(test_ucx_list_concat);
-UCX_TEST(test_ucx_list_size);
-UCX_TEST(test_ucx_list_first);
-UCX_TEST(test_ucx_list_last);
-UCX_TEST(test_ucx_list_get);
-UCX_TEST(test_ucx_list_indexof);
-UCX_TEST(test_ucx_list_find);
-UCX_TEST(test_ucx_list_contains);
-UCX_TEST(test_ucx_list_remove);
-UCX_TEST(test_ucx_list_clone);
-UCX_TEST(test_ucx_list_sort);
-UCX_TEST(test_ucx_list_union);
-UCX_TEST(test_ucx_list_intersection);
-UCX_TEST(test_ucx_list_difference);
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* LIST_TESTS_H */
-
--- a/test/logging_tests.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,111 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "logging_tests.h"
-#include <time.h>
-
-UCX_TEST(test_ucx_logger_new) {
-    
-    FILE *stream = tmpfile();
-    UcxLogger *logger = ucx_logger_new(stream,
-            UCX_LOGGER_INFO, UCX_LOGGER_SOURCE | UCX_LOGGER_LEVEL);
-    
-    UCX_TEST_BEGIN
-    UCX_TEST_ASSERT(logger->stream == stream, "stream not set");
-    UCX_TEST_ASSERT(logger->mask == (UCX_LOGGER_SOURCE | UCX_LOGGER_LEVEL),
-        "mask not set");
-    UCX_TEST_ASSERT(logger->level == UCX_LOGGER_INFO,
-        "level not set");
-    UCX_TEST_ASSERT(logger->writer == (write_func)fwrite,
-        "writer not set to fwrite");
-    UCX_TEST_ASSERT(strcmp(logger->dateformat, "%F %T %z ") == 0,
-        "date format not set to \"%F %T %z\"");
-    
-    UCX_TEST_ASSERT(logger->levels->count == 5,
-        "incorrect number of registered log levels");
-
-    int level = UCX_LOGGER_ERROR;
-    UCX_TEST_ASSERT(strcmp((char*)ucx_map_int_get(logger->levels, level),
-        "[ERROR]") == 0, "invalid error level");
-    level = UCX_LOGGER_WARN;
-    UCX_TEST_ASSERT(strcmp((char*)ucx_map_int_get(logger->levels, level),
-        "[WARNING]") == 0, "invalid warning level");
-    level = UCX_LOGGER_DEBUG;
-    UCX_TEST_ASSERT(strcmp((char*)ucx_map_int_get(logger->levels, level),
-        "[DEBUG]") == 0, "invalid debug level");
-    level = UCX_LOGGER_INFO;
-    UCX_TEST_ASSERT(strcmp((char*)ucx_map_int_get(logger->levels, level),
-        "[INFO]") == 0, "invalid info level");
-    level = UCX_LOGGER_TRACE;
-    UCX_TEST_ASSERT(strcmp((char*)ucx_map_int_get(logger->levels, level),
-        "[TRACE]") == 0, "invalid trace level");
-
-    UCX_TEST_END
-    
-    fclose(stream);
-    ucx_logger_free(logger);
-}
-
-UCX_TEST(test_ucx_logger_log) {
-    char buffer[100];
-    
-    FILE *stream = tmpfile();
-
-    UcxLogger *logger = ucx_logger_new(stream,
-            UCX_LOGGER_INFO, UCX_LOGGER_SOURCE | UCX_LOGGER_LEVEL);
-    logger->dateformat = (char*) "%Y-%m-%d:";
-    
-    UCX_TEST_BEGIN
-    const unsigned int line1 = __LINE__; ucx_logger_info(logger, "allright");
-    
-    ucx_logger_trace(logger, "dont log this!");
-    
-    logger->mask |= UCX_LOGGER_TIMESTAMP;
-    time_t now = time(NULL);
-    char timestr[13];
-    strftime(timestr, 12, "%Y-%m-%d:", localtime(&now));
-    const unsigned int line2 = __LINE__; ucx_logger_error(logger, "error %d!", 42);
-    
-    fseek(stream, 0, SEEK_SET);
-    size_t r = fread(buffer, 1, 100, stream);
-    
-    const size_t expected_length = 87;
-    char expected[88];
-    snprintf(expected, expected_length+1,
-        "[INFO] logging_tests.c:%u - allright\n"
-        "[ERROR] %slogging_tests.c:%u - error 42!\n", line1, timestr, line2);
-
-    UCX_TEST_ASSERT(r == expected_length, "incorrect log length");
-    UCX_TEST_ASSERT(strncmp(buffer, expected, expected_length) == 0,
-        "incorrect logs");
-
-    UCX_TEST_END
-
-    ucx_logger_free(logger);
-    fclose(stream);
-}
--- a/test/logging_tests.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef LOGGING_TESTS_H
-#define	LOGGING_TESTS_H
-
-#include <ucx/test.h>
-#include <ucx/logging.h>
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-UCX_TEST(test_ucx_logger_new);
-UCX_TEST(test_ucx_logger_log);
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* LOGGING_TESTS_H */
-
--- a/test/main.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,286 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <ucx/test.h>
-
-#include "main.h"
-
-#include "array_tests.h"
-#include "allocator_tests.h"
-#include "logging_tests.h"
-#include "list_tests.h"
-#include "string_tests.h"
-#include "mpool_tests.h"
-#include "stack_tests.h"
-#include "map_tests.h"
-#include "prop_tests.h"
-#include "buffer_tests.h"
-#include "utils_tests.h"
-#include "avl_tests.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-UCX_TEST(testTestSuitePositive) {
-    UCX_TEST_BEGIN
-    UCX_TEST_ASSERT(2*2 == 4, "the test framework fails");
-    UCX_TEST_END
-}
-
-UCX_TEST(testTestSuiteNegative) {
-    UCX_TEST_BEGIN
-    UCX_TEST_ASSERT(2*(-2) == 4, "the test framework works");
-    UCX_TEST_END
-}
-
-UCX_TEST_SUBROUTINE(testTestSuiteRoutineRoutine, float f) {
-    UCX_TEST_ASSERT(f == 3.14f, "calling routine in a routine fails");
-}
-
-UCX_TEST_SUBROUTINE(testTestSuiteRoutine2Param, int i, float f) {
-    UCX_TEST_ASSERT(i == 42, "two parameter routine fails");
-    UCX_TEST_CALL_SUBROUTINE(testTestSuiteRoutineRoutine, f);
-}
-
-UCX_TEST_SUBROUTINE(testTestSuiteRoutineSuccess, int* i) {
-    *i += 2;
-    UCX_TEST_ASSERT(*i==4, "the test framework fails");
-}
-
-UCX_TEST_SUBROUTINE(testTestSuiteRoutineFailure, int* i) {
-    *i += 2;
-    // Next test shall fail!
-    UCX_TEST_ASSERT(*i==4, "the test framework works");
-}
-
-UCX_TEST(testTestSuiteRoutinePositive) {
-    int i = 2;
-    UCX_TEST_BEGIN
-    UCX_TEST_CALL_SUBROUTINE(testTestSuiteRoutineSuccess, &i);
-    UCX_TEST_ASSERT(i==4, "the test framework fails");
-    UCX_TEST_END
-}
-
-UCX_TEST(testTestSuiteRoutineNegative) {
-    int i = 0;
-    UCX_TEST_BEGIN
-    UCX_TEST_CALL_SUBROUTINE(testTestSuiteRoutineFailure, &i);
-    UCX_TEST_ASSERT(1, "the test framework fails");
-    UCX_TEST_END
-}
-
-UCX_TEST(testTestSuiteRoutineMultiparam) {
-    UCX_TEST_BEGIN
-    UCX_TEST_CALL_SUBROUTINE(testTestSuiteRoutine2Param, 42, 3.14f);
-    UCX_TEST_END
-}
-#ifdef __cplusplus
-}
-#endif
-
-int main(int argc, char **argv) {
-    printf("UCX Tests\n---------\n");
-
-    printf("\nUcxTestSuite tests (2 failures are intended!)\n");
-    UcxTestSuite* suite = ucx_test_suite_new();
-    ucx_test_register(suite, testTestSuitePositive);
-    ucx_test_register(suite, testTestSuiteNegative);
-    ucx_test_register(suite, testTestSuiteRoutinePositive);
-    ucx_test_register(suite, testTestSuiteRoutineNegative);
-    ucx_test_register(suite, testTestSuiteRoutineMultiparam);
-    ucx_test_run(suite, stdout);
-    if (suite->failure == 2 && suite->success == 3) {
-        ucx_test_suite_free(suite);
-
-        printf("\nLibrary function tests\n");
-        suite = ucx_test_suite_new();
-        /* UcxAllocator Tests */
-        ucx_test_register(suite, test_ucx_default_allocator);
-        
-        /* sstring Tests */
-        ucx_test_register(suite, test_sstr_macros);
-        ucx_test_register(suite, test_sstr);
-        ucx_test_register(suite, test_sstr_len);
-        ucx_test_register(suite, test_sstrcmp);
-        ucx_test_register(suite, test_sstrcasecmp);
-        ucx_test_register(suite, test_sstrcat);
-        ucx_test_register(suite, test_sstrchr_sstrrchr);
-        ucx_test_register(suite, test_sstrstr);
-        ucx_test_register(suite, test_sstrsplit);
-        ucx_test_register(suite, test_sstrtrim);
-        ucx_test_register(suite, test_sstrprefixsuffix);
-        ucx_test_register(suite, test_sstrcaseprefixsuffix);
-        ucx_test_register(suite, test_sstrreplace);
-        
-        /* UcxLogger Tests */
-        ucx_test_register(suite, test_ucx_logger_new);
-        ucx_test_register(suite, test_ucx_logger_log);
-        
-        /* UcxArray Tests */
-        ucx_test_register(suite, test_ucx_array_destroy);
-        ucx_test_register(suite, test_ucx_array_new);
-        ucx_test_register(suite, test_ucx_array_at);
-        ucx_test_register(suite, test_ucx_array_append_from);
-        ucx_test_register(suite, test_ucx_array_append_from_struct);
-        ucx_test_register(suite, test_ucx_array_prepend_from);
-        ucx_test_register(suite, test_ucx_array_set_from);
-        ucx_test_register(suite, test_ucx_array_equals);
-        ucx_test_register(suite, test_ucx_array_concat);
-        ucx_test_register(suite, test_ucx_array_find);
-        ucx_test_register(suite, test_ucx_array_contains);
-        ucx_test_register(suite, test_ucx_array_remove);
-        ucx_test_register(suite, test_ucx_array_clone);
-        ucx_test_register(suite, test_ucx_array_sort);
-        ucx_test_register(suite, test_ucx_array_shrink);
-        ucx_test_register(suite, test_ucx_array_resize);
-        ucx_test_register(suite, test_ucx_array_reserve);
-        ucx_test_register(suite, test_ucx_array_grow);
-        ucx_test_register(suite, test_ucx_array_util_set);
-        ucx_test_register(suite, test_ucx_array_util_setptr);
-        
-        /* UcxList Tests */
-        ucx_test_register(suite, test_ucx_list_append);
-        ucx_test_register(suite, test_ucx_list_prepend);
-        ucx_test_register(suite, test_ucx_list_equals);
-        ucx_test_register(suite, test_ucx_list_concat);
-        ucx_test_register(suite, test_ucx_list_size);
-        ucx_test_register(suite, test_ucx_list_first);
-        ucx_test_register(suite, test_ucx_list_last);
-        ucx_test_register(suite, test_ucx_list_get);
-        ucx_test_register(suite, test_ucx_list_indexof);
-        ucx_test_register(suite, test_ucx_list_find);
-        ucx_test_register(suite, test_ucx_list_contains);
-        ucx_test_register(suite, test_ucx_list_remove);
-        ucx_test_register(suite, test_ucx_list_clone);
-        ucx_test_register(suite, test_ucx_list_sort);
-        ucx_test_register(suite, test_ucx_list_union);
-        ucx_test_register(suite, test_ucx_list_intersection);
-        ucx_test_register(suite, test_ucx_list_difference);
-
-        /* UcxMemPool Tests */
-        ucx_test_register(suite, test_ucx_mempool_new);
-        ucx_test_register(suite, test_ucx_mempool_malloc);
-        ucx_test_register(suite, test_ucx_mempool_malloc_with_chcap);
-        ucx_test_register(suite, test_ucx_mempool_calloc);
-        ucx_test_register(suite, test_ucx_mempool_free);
-        ucx_test_register(suite, test_ucx_mempool_set_destr);
-        ucx_test_register(suite, test_ucx_mempool_reg_destr);
-        ucx_test_register(suite, test_ucx_mempool_realloc);
-        
-        /* UcxStack Tests */
-        ucx_test_register(suite, test_ucx_stack_init);
-        ucx_test_register(suite, test_ucx_stack_malloc);
-        ucx_test_register(suite, test_ucx_stack_calloc);
-        ucx_test_register(suite, test_ucx_stack_free);
-        ucx_test_register(suite, test_ucx_stack_realloc);
-        ucx_test_register(suite, test_ucx_stack_pop);
-
-        /* UcxMap Tests */
-        ucx_test_register(suite, test_ucx_map_new);
-        ucx_test_register(suite, test_ucx_key);
-        ucx_test_register(suite, test_ucx_map_put);
-        ucx_test_register(suite, test_ucx_map_get);
-        ucx_test_register(suite, test_ucx_map_remove);
-        ucx_test_register(suite, test_ucx_map_clear);
-        ucx_test_register(suite, test_ucx_map_iterator);
-        ucx_test_register(suite, test_ucx_map_iterator_chain);
-        ucx_test_register(suite, test_ucx_map_clone);
-        ucx_test_register(suite, test_ucx_map_rehash);
-        ucx_test_register(suite, test_ucx_map_union);
-        ucx_test_register(suite, test_ucx_map_intersection);
-        ucx_test_register(suite, test_ucx_map_difference);
-        
-        /* UcxPropertiesParser Tests */
-        ucx_test_register(suite, test_ucx_properties_new);
-        ucx_test_register(suite, test_ucx_properties_next);
-        ucx_test_register(suite, test_ucx_properties_next_multi);
-        ucx_test_register(suite, test_ucx_properties_next_part);
-        ucx_test_register(suite, test_ucx_properties_next_long);
-        ucx_test_register(suite, test_ucx_properties2map);
-        ucx_test_register(suite, test_ucx_properties_load);
-        ucx_test_register(suite, test_ucx_properties_store);
-        
-        /* UcxBuffer Tests */
-        ucx_test_register(suite, test_ucx_buffer_new);
-        ucx_test_register(suite, test_ucx_buffer_new_prealloc);
-        ucx_test_register(suite, test_ucx_buffer_eof);
-        ucx_test_register(suite, test_ucx_buffer_seek_set);
-        ucx_test_register(suite, test_ucx_buffer_seek_cur);
-        ucx_test_register(suite, test_ucx_buffer_seek_end);
-        ucx_test_register(suite, test_ucx_buffer_seek_oob);
-        ucx_test_register(suite, test_ucx_buffer_seek_invalid);
-        ucx_test_register(suite, test_ucx_buffer_seek_overflow);
-        ucx_test_register(suite, test_ucx_buffer_putc);
-        ucx_test_register(suite, test_ucx_buffer_putc_ae);
-        ucx_test_register(suite, test_ucx_buffer_putc_oob);
-        ucx_test_register(suite, test_ucx_buffer_putc_oobae);
-        ucx_test_register(suite, test_ucx_buffer_putc_size);
-        ucx_test_register(suite, test_ucx_buffer_getc);
-        ucx_test_register(suite, test_ucx_buffer_read);
-        ucx_test_register(suite, test_ucx_buffer_read_oob);
-        ucx_test_register(suite, test_ucx_buffer_extract);
-        ucx_test_register(suite, test_ucx_buffer_extract_oob);
-        ucx_test_register(suite, test_ucx_buffer_extract_overflow);
-        ucx_test_register(suite, test_ucx_buffer_extend);
-        ucx_test_register(suite, test_ucx_buffer_write);
-        ucx_test_register(suite, test_ucx_buffer_write_oob);
-        ucx_test_register(suite, test_ucx_buffer_write_ax);
-        ucx_test_register(suite, test_ucx_buffer_shl);
-        ucx_test_register(suite, test_ucx_buffer_shr);
-        ucx_test_register(suite, test_ucx_buffer_shr_ax);
-        
-        /* Utils Tests*/
-        ucx_test_register(suite, test_ucx_fprintf);
-        ucx_test_register(suite, test_ucx_asprintf);
-        ucx_test_register(suite, test_ucx_sprintf);
-        ucx_test_register(suite, test_ucx_bprintf);
-        ucx_test_register(suite, test_ucx_stream_copy);
-        
-        /* AVL Tests */
-        ucx_test_register(suite, test_ucx_avl_put);
-        ucx_test_register(suite, test_ucx_avl_remove);
-        ucx_test_register(suite, test_ucx_avl_find);
-        ucx_test_register(suite, test_ucx_avl_traverse);
-
-        ucx_test_run(suite, stdout);
-        fflush(stdout);
-        
-        int exit_code = suite->failure > 0 ? EXIT_FAILURE: EXIT_SUCCESS;
-        
-        ucx_test_suite_free(suite);
-        
-        return exit_code;
-    } else {
-        ucx_test_suite_free(suite);
-        return EXIT_FAILURE;
-    }
-}
-
--- a/test/main.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef MAIN_H
-#define	MAIN_H
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-/* Some functions that are shared over the test */
-int cmp_string(void*, void*, void*);
-void* copy_string(void*, void*);
-
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* MAIN_H */
-
--- a/test/map_tests.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,431 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "map_tests.h"
-#include <ucx/utils.h>
-
-UCX_TEST(test_ucx_map_new) {
-    UcxMap *map = ucx_map_new(16);
-    UCX_TEST_BEGIN
-    UCX_TEST_ASSERT(map->size == 16, "wrong size");
-    UCX_TEST_ASSERT(map->map != NULL, "failed");
-    
-    UCX_TEST_END
-    ucx_map_free(map);
-}
-
-UCX_TEST(test_ucx_key) {
-    UcxKey key = ucx_key("This is a text.", 15);
-    UCX_TEST_BEGIN
-    UCX_TEST_ASSERT(strncmp((const char*)key.data, "This is a text.", 15) == 0,
-            "failed");
-    UCX_TEST_ASSERT(key.len == 15, "failed");
-    UCX_TEST_ASSERT(key.hash == 1261186027, "hash failed");
-    
-    UCX_TEST_END
-}
-
-UCX_TEST(test_ucx_map_put) {
-    
-    UcxMap *map = ucx_map_new(4);
-    
-    int td[5];
-    td[0] = 10; td[1] = 42; td[2] = 70; td[3] = 11200; td[4] = 80000;
-
-    UCX_TEST_BEGIN
-    ucx_map_cstr_put(map, "Key2", &td[2]); /* 3.2 */
-    ucx_map_cstr_put(map, "Key0", &td[0]); /* 0.0 */
-    ucx_map_cstr_put(map, "Key1", &td[1]); /* 3.0 */
-    ucx_map_cstr_put(map, "KeY3", &td[3]); /* 3.1 */
-    ucx_map_cstr_put(map, "KEY4", &td[4]); /* 1.0 */
-    
-    UCX_TEST_ASSERT(*((int*)map->map[0]->data) == td[0], "failed Key0");
-    UCX_TEST_ASSERT(*((int*)map->map[1]->data) == td[4], "failed KEY4");
-    UCX_TEST_ASSERT(*((int*)map->map[3]->data) == td[1], "failed Key1");
-    
-    UCX_TEST_ASSERT(map->map[3]->next != NULL, "no list at slot 3");
-    UCX_TEST_ASSERT(map->map[3]->next->next != NULL, "list corrupt at slot 3");
-    UCX_TEST_ASSERT(*((int*)map->map[3]->next->data) == td[3],
-            "failed KeY3")
-    UCX_TEST_ASSERT(*((int*)map->map[3]->next->next->data) == td[2],
-            "failed KeY2");
-
-    UCX_TEST_ASSERT(map->map[0]->next == NULL, "slot 0 not terminated");
-    UCX_TEST_ASSERT(map->map[1]->next == NULL, "slot 1 not terminated");
-    UCX_TEST_ASSERT(map->map[2] == NULL, "slot 2 not empty");
-    UCX_TEST_ASSERT(map->map[3]->next->next->next == NULL,
-            "slot 3 not terminated")
-
-    ucx_map_cstr_put(map, "KeY3", &td[4]); /* replace 3.1 */
-    
-    UCX_TEST_ASSERT(*((int*)map->map[3]->data) == td[1],
-            "overwrite failed")
-    UCX_TEST_ASSERT(*((int*)map->map[3]->next->data) == td[4],
-            "overwrite failed");
-    UCX_TEST_ASSERT(*((int*)map->map[3]->next->next->data) == td[2], 
-            "overwrite failed")
-    UCX_TEST_ASSERT(map->map[3]->next->next->next == NULL, "overwrite failed");
-    
-    UCX_TEST_END
-    ucx_map_free(map);
-}
-
-UCX_TEST(test_ucx_map_get) {
-    UcxMap *map = ucx_map_new(4);
-
-    int td[5];
-    td[0] = 10; td[1] = 42; td[2] = 70; td[3] = 11200; td[4] = 80000;
-
-    ucx_map_cstr_put(map, "Key2", &td[2]);
-    ucx_map_cstr_put(map, "Key0", &td[0]);
-    ucx_map_cstr_put(map, "Key1", &td[1]);
-    ucx_map_cstr_put(map, "KeY3", &td[3]);
-    ucx_map_cstr_put(map, "KEY4", &td[4]);
-    UCX_TEST_BEGIN
-
-    td[0] = *((int*)ucx_map_cstr_get(map, "Key0"));
-    td[1] = *((int*)ucx_map_cstr_get(map, "Key1"));
-    td[2] = *((int*)ucx_map_cstr_get(map, "Key2"));
-    td[3] = *((int*)ucx_map_cstr_get(map, "KeY3"));
-    td[4] = *((int*)ucx_map_cstr_get(map, "KEY4"));
-    UCX_TEST_ASSERT(td[0] == 10, "failed key 0");
-    UCX_TEST_ASSERT(td[1] == 42, "failed key 1");
-    UCX_TEST_ASSERT(td[2] == 70, "failed key 2");
-    UCX_TEST_ASSERT(td[3] == 11200, "failed key 3");
-    UCX_TEST_ASSERT(td[4] == 80000, "failed key 4");
-
-    UCX_TEST_ASSERT(map->count == 5, "expected 5 remaining values");
-    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "Key0") != NULL, "element removed");
-
-    UCX_TEST_END
-    ucx_map_free(map);
-}
-
-UCX_TEST(test_ucx_map_remove) {
-    UcxMap *map = ucx_map_new(4);
-
-    int td[5];
-    td[0] = 10; td[1] = 42; td[2] = 70; td[3] = 11200; td[4] = 80000;
-
-    ucx_map_cstr_put(map, "Key2", &td[2]); /* 0 */
-    ucx_map_cstr_put(map, "Key0", &td[0]); /* 0 */
-    ucx_map_cstr_put(map, "Key1", &td[1]); /* 3 */
-    ucx_map_cstr_put(map, "KeY3", &td[3]); /* 2 */
-    ucx_map_cstr_put(map, "KEY4", &td[4]); /* 0 */
-    UCX_TEST_BEGIN
-
-    td[0] = *((int*)ucx_map_cstr_remove(map, "Key0"));
-    td[1] = *((int*)ucx_map_cstr_get(map, "Key1"));
-    td[2] = *((int*)ucx_map_cstr_remove(map, "Key2"));
-    td[3] = *((int*)ucx_map_cstr_get(map, "KeY3"));
-    td[4] = *((int*)ucx_map_cstr_get(map, "KEY4"));
-    UCX_TEST_ASSERT(td[0] == 10, "failed key 0");
-    UCX_TEST_ASSERT(td[1] == 42, "failed key 1");
-    UCX_TEST_ASSERT(td[2] == 70, "failed key 2");
-    UCX_TEST_ASSERT(td[3] == 11200, "failed key 3");
-    UCX_TEST_ASSERT(td[4] == 80000, "failed key 4");
-
-    UCX_TEST_ASSERT(map->count == 3, "expected 3 remaining values");
-    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "Key0")==NULL, "element not removed");
-    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "Key1")!=NULL, "element removed");
-    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "Key2")==NULL, "element not removed");
-    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "KeY3")!=NULL, "element removed");
-    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "KEY4")!=NULL, "element removed");
-
-    UCX_TEST_ASSERT(ucx_map_cstr_remove(map, "Key2") == NULL,
-            "subsequent remove call shall return NULL");
-
-    UCX_TEST_END
-    ucx_map_free(map);
-}
-
-UCX_TEST(test_ucx_map_clear) {
-    UcxMap *map = ucx_map_new(4);
-
-    int value = 42;
-
-    ucx_map_cstr_put(map, "Key0", &value);
-    ucx_map_cstr_put(map, "Key1", &value);
-    ucx_map_cstr_put(map, "Key2", &value);
-    ucx_map_cstr_put(map, "Key3", &value);
-    ucx_map_cstr_put(map, "Key4", &value);
-    ucx_map_cstr_put(map, "Key5", &value);
-    ucx_map_cstr_put(map, "Key6", &value);
-    UCX_TEST_BEGIN
-        
-    ucx_map_clear(map);
-
-    UCX_TEST_ASSERT(map->count == 0, "map has not been cleared");
-    UCX_TEST_ASSERT(map->size == 4, "map size has changed unexpectedly");
-
-    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "Key0")==NULL, "element not removed");
-    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "Key1")==NULL, "element not removed");
-    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "Key2")==NULL, "element not removed");
-    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "Key3")==NULL, "element not removed");
-    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "Key4")==NULL, "element not removed");
-    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "Key5")==NULL, "element not removed");
-    UCX_TEST_ASSERT(ucx_map_cstr_get(map, "Key6")==NULL, "element not removed");
-
-    UCX_TEST_END
-    ucx_map_free(map);
-}
-
-UCX_TEST_SUBROUTINE(test_ucx_map_itersrt, UcxMap *map) {
-    int v1 = 10;
-    int v2 = 15;
-    int v3 = 7;
-    int v4 = 9;
-
-    ucx_map_cstr_put(map, "v1", &v1);
-    ucx_map_cstr_put(map, "v2", &v2);
-    ucx_map_cstr_put(map, "v3", &v3);
-    ucx_map_cstr_put(map, "v4", &v4);
-
-    UcxMapIterator i = ucx_map_iterator(map);
-    int check = 0;
-    int hit = 0;
-
-    void* v;
-    UCX_MAP_FOREACH(key, v, i) {
-        check += *((int*)v);
-        hit++;
-    }
-
-    UCX_TEST_ASSERT(hit == 4, "test1: wrong number of hits");
-    UCX_TEST_ASSERT(check == v1+v2+v3+v4, "test1: wrong result");
-}
-
-UCX_TEST(test_ucx_map_iterator) {
-    UcxMap *map = ucx_map_new(16);
-    UCX_TEST_BEGIN
-    UCX_TEST_CALL_SUBROUTINE(test_ucx_map_itersrt, map)
-    UCX_TEST_END
-    ucx_map_free(map);
-}
-
-UCX_TEST(test_ucx_map_iterator_chain) {
-    UcxMap *map = ucx_map_new(1);
-    UCX_TEST_BEGIN
-    UCX_TEST_CALL_SUBROUTINE(test_ucx_map_itersrt, map)
-    UCX_TEST_END
-    ucx_map_free(map);
-}
-
-UCX_TEST(test_ucx_map_clone) {
-    UcxMap *map = ucx_map_new(4);
-    
-    ucx_map_cstr_put(map, "key1", (void*)"value1");
-    ucx_map_cstr_put(map, "key2", (void*)"value2");
-    ucx_map_cstr_put(map, "key3", (void*)"value3");
-    
-    UcxMap *clone = ucx_map_clone(map, NULL, NULL);
-    
-    const char *v1 = (const char *) ucx_map_cstr_get(map, "key1");
-    const char *v2 = (const char *) ucx_map_cstr_get(map, "key2");
-    const char *v3 = (const char *) ucx_map_cstr_get(map, "key3");
-    
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(v1 != NULL, "failed key 1");
-    UCX_TEST_ASSERT(v2 != NULL, "failed key 2");
-    UCX_TEST_ASSERT(v3 != NULL, "failed key 3");
-    
-    const char *c1 = (const char *) ucx_map_cstr_get(clone, "key1");
-    const char *c2 = (const char *) ucx_map_cstr_get(clone, "key2");
-    const char *c3 = (const char *) ucx_map_cstr_get(clone, "key3");
-    
-    UCX_TEST_ASSERT(c1 != NULL, "failed key 1 (clone)");
-    UCX_TEST_ASSERT(c2 != NULL, "failed key 2 (clone)");
-    UCX_TEST_ASSERT(c3 != NULL, "failed key 3 (clone)");
-    
-    UCX_TEST_ASSERT(strcmp(c1, v1) == 0, "value error for key1");
-    UCX_TEST_ASSERT(strcmp(c2, v2) == 0, "value error for key2");
-    UCX_TEST_ASSERT(strcmp(c3, v3) == 0, "value error for key3");
-    
-    UCX_TEST_END
-    
-    ucx_map_free(map);
-    ucx_map_free(clone);
-}
-
-UCX_TEST(test_ucx_map_rehash) {
-    UcxMap *map = ucx_map_new(4);
-
-    char keys[10][5];
-    char values[10][7];
-    for (int i = 0 ; i < 10 ; i++) {
-        strcpy(keys[i], "key");
-        keys[i][3] = 48+i; keys[i][4] = 0;
-        strcpy(values[i], "value");
-        values[i][5] = 48+i; values[i][6] = 0;
-
-        ucx_map_cstr_put(map, keys[i], values[i]);
-    }
-
-    ucx_map_rehash(map);
-
-    UCX_TEST_BEGIN
-    UCX_TEST_ASSERT(map->size == 25, "new capacity shall be 2.5 * count");
-    UCX_TEST_ASSERT(map->count == 10, "new map element count incorrect");
-    for (int i = 0 ; i < 10 ; i++) {
-        const char *value = (const char *) ucx_map_cstr_get(map, keys[i]);
-        UCX_TEST_ASSERT(value != NULL, "new map is missing old keys");
-        UCX_TEST_ASSERT(strncmp(value, values[i], 6) == 0,
-                "new map contains incorrect values");
-    }
-    ucx_map_rehash(map);
-    UCX_TEST_ASSERT(map->size == 25,
-            "subsequent rehashing call shall not change size");
-    UCX_TEST_END
-
-    ucx_map_free(map);
-}
-
-UCX_TEST(test_ucx_map_union) {
-    int td[5];
-    size_t intlen = sizeof(int);
-    td[0] = 10; td[1] = 42; td[2] = 47; td[3] = 1337; td[4] = 9000;
-
-    UcxMap *first = ucx_map_new(4);
-    UcxMap *second = ucx_map_new(4);
-
-    ucx_map_cstr_put(first, "key0", &td[0]);
-    ucx_map_cstr_put(first, "key1", &td[1]);
-    ucx_map_cstr_put(second, "key2", &td[2]);
-    ucx_map_cstr_put(second, "key0", &td[3]);
-    ucx_map_cstr_put(second, "key3", &td[4]);
-
-    UcxMap *result = ucx_map_union(first, second, ucx_memcpy, &intlen);
-
-    UCX_TEST_BEGIN
-
-    int* r;
-    UCX_TEST_ASSERT(result->count == 4,
-            "result has incorrect number of elements");
-
-    r = (int*)ucx_map_cstr_get(result, "key0");
-    UCX_TEST_ASSERT(!!r, "key0 is not present");
-    UCX_TEST_ASSERT(*r == td[3], "key0 has not been overwritten");
-    r = (int*)ucx_map_cstr_get(result, "key1");
-    UCX_TEST_ASSERT(!!r, "key1 is not present");
-    UCX_TEST_ASSERT(*r == td[1], "key1 contains wrong data");
-    r = (int*)ucx_map_cstr_get(result, "key2");
-    UCX_TEST_ASSERT(!!r, "key2 is not present");
-    UCX_TEST_ASSERT(*r == td[2], "key2 contains wrong data");
-    r = (int*)ucx_map_cstr_get(result, "key3");
-    UCX_TEST_ASSERT(!!r, "key3 is not present");
-    UCX_TEST_ASSERT(*r == td[4], "key3 contains wrong data");
-
-    UCX_TEST_END
-
-    ucx_map_free_content(result, NULL);
-    ucx_map_free(result);
-    ucx_map_free(second);
-    ucx_map_free(first);
-}
-
-UCX_TEST(test_ucx_map_intersection) {
-        int td[5];
-        size_t intlen = sizeof(int);
-        td[0] = 10; td[1] = 42; td[2] = 47; td[3] = 1337; td[4] = 9000;
-
-        UcxMap *first = ucx_map_new(4);
-        UcxMap *second = ucx_map_new(4);
-
-        ucx_map_cstr_put(first, "key0", &td[0]);
-        ucx_map_cstr_put(first, "key1", &td[1]);
-        ucx_map_cstr_put(first, "key4", &td[3]);
-        ucx_map_cstr_put(second, "key2", &td[2]);
-        ucx_map_cstr_put(second, "key0", &td[3]);
-        ucx_map_cstr_put(second, "key3", &td[4]);
-        ucx_map_cstr_put(second, "key4", &td[4]);
-
-        UcxMap *result = ucx_map_intersection(first, second,
-                ucx_memcpy, &intlen);
-
-        UCX_TEST_BEGIN
-
-        int* r;
-        UCX_TEST_ASSERT(result->count == 2,
-                "result has incorrect number of elements");
-
-        r = (int*)ucx_map_cstr_get(result, "key0");
-        UCX_TEST_ASSERT(!!r, "key0 is not present");
-        UCX_TEST_ASSERT(*r == td[0], "key0 has not original data");
-        r = (int*)ucx_map_cstr_get(result, "key4");
-        UCX_TEST_ASSERT(!!r, "key4 is not present");
-        UCX_TEST_ASSERT(*r == td[3], "key4 has not original data");
-
-        UCX_TEST_END
-
-        ucx_map_free_content(result, NULL);
-        ucx_map_free(result);
-        ucx_map_free(second);
-        ucx_map_free(first);
-}
-
-
-UCX_TEST(test_ucx_map_difference) {
-        int td[5];
-        size_t intlen = sizeof(int);
-        td[0] = 10; td[1] = 42; td[2] = 47; td[3] = 1337; td[4] = 9000;
-
-        UcxMap *first = ucx_map_new(4);
-        UcxMap *second = ucx_map_new(4);
-
-        ucx_map_cstr_put(first, "key0", &td[0]);
-        ucx_map_cstr_put(first, "key1", &td[1]);
-        ucx_map_cstr_put(first, "key2", &td[2]);
-        ucx_map_cstr_put(first, "key4", &td[3]);
-        ucx_map_cstr_put(second, "key0", &td[3]);
-        ucx_map_cstr_put(second, "key3", &td[4]);
-        ucx_map_cstr_put(second, "key4", &td[4]);
-
-        UcxMap *result = ucx_map_difference(first, second, ucx_memcpy, &intlen);
-
-        UCX_TEST_BEGIN
-
-        int* r;
-        UCX_TEST_ASSERT(result->count == 2,
-                "result has incorrect number of elements");
-
-        r = (int*)ucx_map_cstr_get(result, "key1");
-        UCX_TEST_ASSERT(!!r, "key1 is not present");
-        UCX_TEST_ASSERT(*r == td[1], "key1 has incorrect data");
-        r = (int*)ucx_map_cstr_get(result, "key2");
-        UCX_TEST_ASSERT(!!r, "key2 is not present");
-        UCX_TEST_ASSERT(*r == td[2], "key2 has incorrect data");
-
-        UCX_TEST_END
-
-        ucx_map_free_content(result, NULL);
-        ucx_map_free(result);
-        ucx_map_free(second);
-        ucx_map_free(first);
-}
-
--- a/test/map_tests.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef MAP_TESTS_H
-#define	MAP_TESTS_H
-
-#include <ucx/test.h>
-#include <ucx/map.h>
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-UCX_TEST(test_ucx_map_new);
-UCX_TEST(test_ucx_key);
-UCX_TEST(test_ucx_map_put);
-UCX_TEST(test_ucx_map_get);
-UCX_TEST(test_ucx_map_remove);
-UCX_TEST(test_ucx_map_clear);
-UCX_TEST(test_ucx_map_iterator);
-UCX_TEST(test_ucx_map_iterator_chain);
-UCX_TEST(test_ucx_map_clone);
-UCX_TEST(test_ucx_map_rehash);
-UCX_TEST(test_ucx_map_union);
-UCX_TEST(test_ucx_map_intersection);
-UCX_TEST(test_ucx_map_difference);
-
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* MAP_TESTS_H */
-
--- a/test/mpool_tests.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,239 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <inttypes.h>
-
-#include "mpool_tests.h"
-
-UCX_TEST(test_ucx_mempool_new) {
-    UcxMempool *pool = ucx_mempool_new(16);
-    UCX_TEST_BEGIN
-    UCX_TEST_ASSERT(pool->size == 16, "wrong size");
-    UCX_TEST_ASSERT(pool->ndata == 0, "uninitialized counter");
-    UCX_TEST_ASSERT(pool->data != NULL, "no memory addressed");
-    UCX_TEST_END
-    ucx_mempool_destroy(pool);
-}
-
-UCX_TEST(test_ucx_mempool_malloc) {
-    
-    UcxMempool *pool = ucx_mempool_new(1);
-    UCX_TEST_BEGIN
-    intptr_t *test = (intptr_t*) ucx_mempool_malloc(pool, sizeof(intptr_t));
-    
-    UCX_TEST_ASSERT(pool->ndata == 1, "counter not incremented");
-    UCX_TEST_ASSERT(pool->size == 1, "chcap called");
-    
-    intptr_t *pooladdr =
-            (intptr_t*)((char*)pool->data[0] + sizeof(ucx_destructor));
-    *pooladdr = 5;
-    
-    UCX_TEST_ASSERT(*test == 5, "wrong pointer");
-    
-    UCX_TEST_END
-    ucx_mempool_destroy(pool);
-}
-
-UCX_TEST(test_ucx_mempool_malloc_with_chcap) {
-    
-    UcxMempool *pool = ucx_mempool_new(1);
-    UCX_TEST_BEGIN
-    ucx_mempool_malloc(pool, sizeof(int));
-    intptr_t *test = (intptr_t*) ucx_mempool_malloc(pool, sizeof(intptr_t));
-    
-    UCX_TEST_ASSERT(pool->ndata == 2, "counter not incremented");
-    UCX_TEST_ASSERT(pool->size == 2, "chcap not called");
-    
-    intptr_t *pooladdr =
-            (intptr_t*)((char*)pool->data[1] + sizeof(ucx_destructor));
-    *pooladdr = 5;
-    
-    UCX_TEST_ASSERT(*test == 5, "wrong pointer");
-    
-    // overflow test
-    void *n0 = ucx_mempool_malloc(pool, (size_t)-1);
-    void *n1 = ucx_mempool_malloc(pool, ((size_t)-1) - sizeof(void*)/2);
-    
-    UCX_TEST_ASSERT(n0 == NULL, "should not allocate SIZE_MAX bytes");
-    UCX_TEST_ASSERT(n1 == NULL, "should detect integer overflow");
-    
-    UCX_TEST_END
-    ucx_mempool_destroy(pool);
-}
-
-UCX_TEST(test_ucx_mempool_calloc) {
-    
-    UcxMempool *pool = ucx_mempool_new(1);
-    UCX_TEST_BEGIN
-    
-    intptr_t *test = (intptr_t*) ucx_mempool_calloc(pool, 2, sizeof(intptr_t));
-    
-    UCX_TEST_ASSERT(test != NULL, "no memory for test data");
-    UCX_TEST_ASSERT(test[0] == 0 && test[1] == 0, "failed");
-    
-    // overflow test
-    void *n0 = ucx_mempool_calloc(pool, (size_t)-1, 1);
-    void *n1 = ucx_mempool_calloc(pool, ((size_t)-1)/2, 3);
-    
-    UCX_TEST_ASSERT(n0 == NULL, "should not allocate SIZE_MAX bytes");
-    UCX_TEST_ASSERT(n1 == NULL, "should detect integer overflow");
-    
-    UCX_TEST_END
-    ucx_mempool_destroy(pool);
-}
-
-UCX_TEST(test_ucx_mempool_free) {
-    UcxMempool *pool = ucx_mempool_new(16);
-    void *mem1;
-    void *mem2;
-    
-    UCX_TEST_BEGIN
-    
-    mem1 = ucx_mempool_malloc(pool, 16);
-    ucx_mempool_free(pool, mem1);
-    
-    UCX_TEST_ASSERT(pool->ndata == 0, "mempool not empty");
-    
-    ucx_mempool_malloc(pool, 16);
-    ucx_mempool_malloc(pool, 16);
-    mem1 = ucx_mempool_malloc(pool, 16);
-    ucx_mempool_malloc(pool, 16);
-    mem2 = ucx_mempool_malloc(pool, 16);
-    
-    ucx_mempool_free(pool, mem1);
-    
-    UCX_TEST_ASSERT(pool->ndata == 4, "wrong mempool size");
-    
-    ucx_mempool_free(pool, mem2);
-    
-    UCX_TEST_ASSERT(pool->ndata == 3, "wrong mempool size");
-    
-    UCX_TEST_END
-    ucx_mempool_destroy(pool);
-}
-
-#ifdef __cplusplus
-extern "C"
-#endif
-void test_setdestr(void* elem) {
-    intptr_t *cb = (intptr_t*) ((intptr_t*) elem)[1];
-    *cb = 42;
-}
-
-UCX_TEST(test_ucx_mempool_set_destr) {
-    
-    intptr_t *cb = (intptr_t*) malloc(sizeof(intptr_t));
-    UCX_TEST_BEGIN
-    UcxMempool *pool = ucx_mempool_new(2);
-    
-    ucx_mempool_malloc(pool, sizeof(intptr_t));
-    intptr_t *test = (intptr_t*) ucx_mempool_calloc(pool, 2, sizeof(intptr_t));
-    
-    UCX_TEST_ASSERT(cb != NULL && test != NULL, "no memory for test data");
-    
-    test[0] = 5; test[1] = (intptr_t) cb;
-    *cb = 13;
-    
-    ucx_mempool_set_destr(test, test_setdestr);
-    UCX_TEST_ASSERT(
-            *(ucx_destructor*)(pool->data[1]) == test_setdestr, "failed")
-    UCX_TEST_ASSERT(
-            test[0] == 5 && test[1] == (intptr_t) cb, "setdestr destroyed data")
-    
-    ucx_mempool_destroy(pool);
-    
-    UCX_TEST_ASSERT(*cb == 42, "destructor not called");
-    
-    UCX_TEST_END
-    if (cb != NULL) free(cb);
-}
-
-
-UCX_TEST(test_ucx_mempool_reg_destr) {
-    
-    intptr_t *test = (intptr_t*) calloc(2, sizeof(intptr_t));
-    intptr_t *cb = (intptr_t*) malloc(sizeof(intptr_t));
-    UCX_TEST_BEGIN
-    UcxMempool *pool = ucx_mempool_new(1);
-    
-    UCX_TEST_ASSERT(cb != NULL && test != NULL, "no memory for test data");
-    
-    test[0] = 5; test[1] = (intptr_t) cb;
-    *cb = 13;
-    
-    ucx_mempool_reg_destr(pool, test, test_setdestr);
-    
-    ucx_destructor *pooladdr = (ucx_destructor*)
-            ((char*)pool->data[0] + sizeof(ucx_destructor));
-    
-    UCX_TEST_ASSERT(*pooladdr == test_setdestr, "failed");
-    
-    ucx_mempool_destroy(pool);
-    UCX_TEST_ASSERT(*cb == 42, "destructor not called");
-    UCX_TEST_END
-
-    if (test != NULL) free(test);
-    if (cb != NULL) free(cb);
-}
-
-UCX_TEST(test_ucx_mempool_realloc) {
-
-    intptr_t *cb = (intptr_t*) malloc(sizeof(intptr_t));
-    UCX_TEST_BEGIN
-    UcxMempool *pool = ucx_mempool_new(2);
-    
-    ucx_mempool_malloc(pool, sizeof(intptr_t));
-    intptr_t *test = (intptr_t*) ucx_mempool_calloc(pool, 2, sizeof(intptr_t));
-
-    UCX_TEST_ASSERT(cb != NULL && test != NULL, "no memory for test data");
-    
-    test[0] = 5; test[1] = (intptr_t) cb;
-    *cb = 13;
-    
-    ucx_mempool_set_destr(test, test_setdestr);
-    
-    intptr_t *rtest, n = 2;
-    do {
-        n *= 2;
-        UCX_TEST_ASSERT(n < 65536, "test corrupt - no movement for realloc");
-        rtest = (intptr_t*) ucx_mempool_realloc(pool, test, n*sizeof(intptr_t));
-    } while (rtest == test);
-    test = rtest;
-    
-    UCX_TEST_ASSERT(*(ucx_destructor*)(pool->data[1]) == test_setdestr,
-            "realloc killed destructor")
-    UCX_TEST_ASSERT(
-            test[0] == 5 && test[1] == (intptr_t) cb, "realloc destroyed data")
-    
-    ucx_mempool_destroy(pool);
-    
-    UCX_TEST_ASSERT(*cb == 42, "destructor not called");
-    
-    UCX_TEST_END
-    if (cb != NULL) free(cb);
-}
--- a/test/mpool_tests.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef MPOOL_TESTS_H
-#define	MPOOL_TESTS_H
-
-#include <ucx/test.h>
-#include <ucx/mempool.h>
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-UCX_TEST(test_ucx_mempool_new);
-UCX_TEST(test_ucx_mempool_malloc);
-UCX_TEST(test_ucx_mempool_malloc_with_chcap);
-UCX_TEST(test_ucx_mempool_calloc);
-UCX_TEST(test_ucx_mempool_free);
-UCX_TEST(test_ucx_mempool_set_destr);
-UCX_TEST(test_ucx_mempool_reg_destr);
-UCX_TEST(test_ucx_mempool_realloc);
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* MPOOL_TESTS_H */
-
--- a/test/prop_tests.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,545 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "prop_tests.h"
-#include <ucx/mempool.h>
-
-UCX_TEST(test_ucx_properties_new) {
-    UcxProperties *parser = ucx_properties_new();
-    
-    UCX_TEST_BEGIN
-            
-    UCX_TEST_ASSERT(parser != NULL, "failed");
-    UCX_TEST_ASSERT(parser->buffer == NULL, "parser has buffer");
-    UCX_TEST_ASSERT(parser->tmp == NULL, "parser has tmp buffer");
-    
-    UCX_TEST_END
-            
-    ucx_properties_free(parser);
-}
-
-UCX_TEST(test_ucx_properties_next) {  
-    const char *tests[] = {
-        "name = value\n",
-        "name=value\n",
-        "n=value\n",
-        "name=v\n",
-        "n=v\n",
-        "name = value # comment\n",
-        "#comment\nn=v\n",
-        "# comment1\n# comment2\n\n    \n\nname = value\n",
-        "    name     =      value\n",
-        "name = value\n\n"
-    };
-    
-    const char *names[] = {
-        "name",
-        "name",
-        "n",
-        "name",
-        "n",
-        "name",
-        "n",
-        "name",
-        "name",
-        "name"
-    };
-    
-    const char *values[] = {
-        "value",
-        "value",
-        "value",
-        "v",
-        "v",
-        "value",
-        "v",
-        "value",
-        "value",
-        "value"
-    };
-    
-    UCX_TEST_BEGIN
-    
-    sstr_t name;
-    sstr_t value;
-    
-    for(int i=0;i<10;i++) {
-        UcxProperties *parser = ucx_properties_new();
-        
-        ucx_properties_fill(parser, (char*)tests[i], strlen(tests[i]));
-        UCX_TEST_ASSERT(parser->buffer == tests[i], "fill failed");
-        UCX_TEST_ASSERT(parser->buflen == strlen(tests[i]), "wrong buflen");
-        
-        int r = ucx_properties_next(parser, &name, &value);
-        sstr_t n = sstr((char*)names[i]);
-        sstr_t v = sstr((char*)values[i]);
-        UCX_TEST_ASSERT(r == 1, "next returned 0");
-        UCX_TEST_ASSERT((!sstrcmp(name, n)), "wrong property name");
-        UCX_TEST_ASSERT((!sstrcmp(value, v)), "wrong property value");
-        
-        r = ucx_properties_next(parser, &name, &value);
-        UCX_TEST_ASSERT(r == 0, "next returned 1");
-        UCX_TEST_ASSERT(parser->tmp == NULL, "tmp not NULL");
-        UCX_TEST_ASSERT(parser->tmpcap == 0, "tmpcap not NULL");
-        UCX_TEST_ASSERT(parser->tmplen == 0, "tmplen not NULL");
-        
-        ucx_properties_free(parser);
-    }
-    
-    UCX_TEST_END       
-}
-
-UCX_TEST(test_ucx_properties_next_multi) {
-    const char *names[] = {
-        "a",
-        "b",
-        "c",
-        "uap",
-        "name",
-        "key1",
-        "key2",
-        "key3"
-    };
-    
-    const char *values[] = {
-        "a value",
-        "b value",
-        "core",
-        "core",
-        "ucx",
-        "value1",
-        "value2",
-        "value3"
-    };
-    
-    const char *str = "#\n"
-        "# properties\n"
-        "# contains key/value pairs\n"
-        "#\n"
-        "a = a value\n"
-        "b = b value\n"
-        "c = core\n"
-        "\n# test\n"
-        "uap = core\n"
-        "name = ucx\n"
-        "# no = property\n"
-        "key1 = value1\n"
-        "#key1 = wrong value\n"
-        "#key2 = not value 2\n"
-        "key2 = value2\n"
-        "\n\n\n        \n           key3=value3\n";
-    
-    UcxProperties *parser = ucx_properties_new();
-    
-    UCX_TEST_BEGIN
-    
-    ucx_properties_fill(parser, (char*)str, strlen(str));
-    
-    sstr_t name;
-    sstr_t value;
-    for(int i=0;i<8;i++) {
-        int r = ucx_properties_next(parser, &name, &value);
-        UCX_TEST_ASSERT(r == 1, "next returned 0");
-        UCX_TEST_ASSERT((!sstrcmp(name, sstr((char*)names[i]))), "wrong name");
-        UCX_TEST_ASSERT((!sstrcmp(value, sstr((char*)values[i]))),
-                "wrong value");
-    }
-    int r = ucx_properties_next(parser, &name, &value);
-    UCX_TEST_ASSERT(r == 0, "next returned 1");
-    
-    UCX_TEST_END
-    
-    ucx_properties_free(parser);
-}
-
-UCX_TEST(test_ucx_properties_next_part) {
-    UcxProperties *parser = ucx_properties_new();
-    const char *str;
-    int r;
-    sstr_t name;
-    sstr_t value;
-    
-    UCX_TEST_BEGIN
-    
-    str = "";
-    ucx_properties_fill(parser, (char*)str, strlen(str));
-    r = ucx_properties_next(parser, &name, &value);
-    UCX_TEST_ASSERT(r == 0, "next returned 1");
-    
-    str = "  \n";
-    ucx_properties_fill(parser, (char*)str, strlen(str));
-    r = ucx_properties_next(parser, &name, &value); 
-    UCX_TEST_ASSERT(r == 0, "next returned 1");
-    
-    str = "name";
-    ucx_properties_fill(parser, (char*)str, strlen(str));
-    r = ucx_properties_next(parser, &name, &value); 
-    UCX_TEST_ASSERT(r == 0, "next returned 1");
-    
-    str = "    ";
-    ucx_properties_fill(parser, (char*)str, strlen(str));
-    r = ucx_properties_next(parser, &name, &value); 
-    UCX_TEST_ASSERT(r == 0, "next returned 1");
-    
-    str = "= ";
-    ucx_properties_fill(parser, (char*)str, strlen(str));
-    r = ucx_properties_next(parser, &name, &value); 
-    UCX_TEST_ASSERT(r == 0, "next returned 1");
-    
-    str = "value";
-    ucx_properties_fill(parser, (char*)str, strlen(str));
-    r = ucx_properties_next(parser, &name, &value); 
-    UCX_TEST_ASSERT(r == 0, "next returned 1");
-    
-    str = "\n";
-    ucx_properties_fill(parser, (char*)str, strlen(str));
-    r = ucx_properties_next(parser, &name, &value); 
-    UCX_TEST_ASSERT(r == 1, "next returned 0");
-    UCX_TEST_ASSERT((!sstrcmp(name, sstr((char*)"name"))), "wrong name");
-    UCX_TEST_ASSERT((!sstrcmp(value, sstr((char*)"value"))), "wrong value");
-    
-    // second round
-    str = "#comment\n";
-    ucx_properties_fill(parser, (char*)str, strlen(str));
-    r = ucx_properties_next(parser, &name, &value); 
-    UCX_TEST_ASSERT(r == 0, "next returned 1");
-    
-    str = "#comment\nname = ";
-    ucx_properties_fill(parser, (char*)str, strlen(str));
-    r = ucx_properties_next(parser, &name, &value); 
-    UCX_TEST_ASSERT(r == 0, "next returned 1");
-    
-    str = "value\na = b\n";
-    ucx_properties_fill(parser, (char*)str, strlen(str));
-    r = ucx_properties_next(parser, &name, &value); 
-    UCX_TEST_ASSERT(r == 1, "next returned 0");
-    UCX_TEST_ASSERT((!sstrcmp(name, sstr((char*)"name"))), "wrong name");
-    UCX_TEST_ASSERT((!sstrcmp(value, sstr((char*)"value"))), "wrong value");
-    
-    r = ucx_properties_next(parser, &name, &value); 
-    UCX_TEST_ASSERT(r == 1, "next returned 0");
-    UCX_TEST_ASSERT((!sstrcmp(name, sstr((char*)"a"))), "wrong name");
-    UCX_TEST_ASSERT((!sstrcmp(value, sstr((char*)"b"))), "wrong value");
-    
-    str = "# comment\n#\n#\ntests = ";
-    ucx_properties_fill(parser, (char*)str, strlen(str));
-    r = ucx_properties_next(parser, &name, &value); 
-    UCX_TEST_ASSERT(r == 0, "next returned 1");
-    
-    str = "test1 ";
-    ucx_properties_fill(parser, (char*)str, strlen(str));
-    r = ucx_properties_next(parser, &name, &value); 
-    UCX_TEST_ASSERT(r == 0, "next returned 1");
-    
-    str = "test2 test3 test4\n";
-    sstr_t testv = sstr((char*)"test1 test2 test3 test4");
-    ucx_properties_fill(parser, (char*)str, strlen(str));
-    r = ucx_properties_next(parser, &name, &value); 
-    UCX_TEST_ASSERT(r == 1, "next returned 0");
-    UCX_TEST_ASSERT((!sstrcmp(name, sstr((char*)"tests"))), "wrong name");
-    UCX_TEST_ASSERT((!sstrcmp(value, testv)), "wrong value");
-    
-    // test if ucx_properties_next finds a name/value after a tmp comment
-    str = "# just a comment";
-    ucx_properties_fill(parser, (char*)str, strlen(str));
-    r = ucx_properties_next(parser, &name, &value); 
-    UCX_TEST_ASSERT(r == 0, "next returned 1");
-    
-    str = " in 3";
-    ucx_properties_fill(parser, (char*)str, strlen(str));
-    r = ucx_properties_next(parser, &name, &value); 
-    UCX_TEST_ASSERT(r == 0, "next returned 1");
-    
-    str = " parts\na = 1\n";
-    ucx_properties_fill(parser, (char*)str, strlen(str));
-    r = ucx_properties_next(parser, &name, &value); 
-    UCX_TEST_ASSERT(r == 1, "next returned 0");
-    UCX_TEST_ASSERT((!sstrcmp(name, sstr((char*)"a"))), "wrong name");
-    UCX_TEST_ASSERT((!sstrcmp(value, sstr((char*)"1"))), "wrong value");
-    
-    UCX_TEST_END
-    
-    ucx_properties_free(parser);
-}
-
-UCX_TEST(test_ucx_properties_next_long) {
-    UcxProperties *parser = ucx_properties_new();
-    int r;
-    size_t name_len = 512;
-    char *long_name = (char*)malloc(name_len);
-    memset(long_name, 'a', 70);
-    memset(long_name+70, 'b', 242);
-    memset(long_name+312, 'c', 200);
-    
-    size_t value_len = 2048;
-    char *long_value = (char*)malloc(value_len);
-    memset(long_value, 'x', 1024);
-    memset(long_value+1024, 'y', 1024);
-    
-    UCX_TEST_BEGIN
-    
-    sstr_t name;
-    sstr_t value;
-    
-    ucx_properties_fill(parser, long_name, 10);
-    r = ucx_properties_next(parser, &name, &value);
-    UCX_TEST_ASSERT(r == 0, "next returned 1");
-    
-    ucx_properties_fill(parser, long_name+10, 202);
-    r = ucx_properties_next(parser, &name, &value);
-    UCX_TEST_ASSERT(r == 0, "next returned 1");
-    
-    ucx_properties_fill(parser, long_name+212, 200);
-    r = ucx_properties_next(parser, &name, &value);
-    UCX_TEST_ASSERT(r == 0, "next returned 1");
-    
-    ucx_properties_fill(parser, long_name+412, 100);
-    r = ucx_properties_next(parser, &name, &value);
-    UCX_TEST_ASSERT(r == 0, "next returned 1");
-    
-    const char *str = " = ";
-    ucx_properties_fill(parser, (char*)str, strlen(str));
-    r = ucx_properties_next(parser, &name, &value);
-    UCX_TEST_ASSERT(r == 0, "next returned 1");
-    
-    ucx_properties_fill(parser, long_value, 512);
-    r = ucx_properties_next(parser, &name, &value); 
-    UCX_TEST_ASSERT(r == 0, "next returned 1");
-    
-    ucx_properties_fill(parser, long_value+512, 1024);
-    r = ucx_properties_next(parser, &name, &value);
-    UCX_TEST_ASSERT(r == 0, "next returned 1");
-    
-    ucx_properties_fill(parser, long_value+1536, 512);
-    r = ucx_properties_next(parser, &name, &value);
-    UCX_TEST_ASSERT(r == 0, "next returned 1");
-    
-    str = "\n#comment\nkey = value\n";
-    ucx_properties_fill(parser, (char*)str, strlen(str));    
-    r = ucx_properties_next(parser, &name, &value);
-    sstr_t n = sstrn(long_name, name_len);
-    sstr_t v = sstrn(long_value, value_len);
-    UCX_TEST_ASSERT(r == 1, "next returned 0");
-    UCX_TEST_ASSERT((!sstrcmp(name, n)), "wrong name");
-    UCX_TEST_ASSERT((!sstrcmp(value, v)), "wrong value");
-    
-    r = ucx_properties_next(parser, &name, &value);
-    UCX_TEST_ASSERT(r == 1, "next returned 0");
-    UCX_TEST_ASSERT((!sstrcmp(name, sstr((char*)"key"))), "wrong name");
-    UCX_TEST_ASSERT((!sstrcmp(value, sstr((char*)"value"))), "wrong value");
-    
-    r = ucx_properties_next(parser, &name, &value);
-    UCX_TEST_ASSERT(r == 0, "next returned 1");
-    
-    UCX_TEST_END
-    
-    free(long_name);
-    free(long_value);
-    ucx_properties_free(parser);
-}
-
-UCX_TEST(test_ucx_properties2map) {
-    UcxMempool *mp = ucx_mempool_new(64);
-    UcxMap *map = ucx_map_new_a(mp->allocator, 16);
-    UcxProperties *parser = ucx_properties_new();
-    
-    UCX_TEST_BEGIN
-    
-    const char *str = "key1 = value1\nkey2 = value2\n\n#comment\n\nkey3 = value3\n";
-    ucx_properties_fill(parser, (char*)str, strlen(str));
-    
-    int r = ucx_properties2map(parser, map);
-    
-    UCX_TEST_ASSERT(r == 0, "properties2map failed");
-    UCX_TEST_ASSERT(map->count == 3, "wrong number of properties");
-    
-    char *v1 = (char*)ucx_map_cstr_get(map, "key1");
-    char *v2 = (char*)ucx_map_cstr_get(map, "key2");
-    char *v3 = (char*)ucx_map_cstr_get(map, "key3");
-    
-    UCX_TEST_ASSERT(v1, "value for key1 not found");
-    UCX_TEST_ASSERT(v2, "value for key2 not found");
-    UCX_TEST_ASSERT(v3, "value for key3 not found");
-    
-    UCX_TEST_ASSERT((!strcmp(v1, "value1")), "wrong value for key1");
-    UCX_TEST_ASSERT((!strcmp(v2, "value2")), "wrong value for key2");
-    UCX_TEST_ASSERT((!strcmp(v3, "value3")), "wrong value for key3");
-    
-    // second test
-    ucx_map_free(map);
-    map = ucx_map_new_a(mp->allocator, 16);
-    
-    str = "\n#comment\n";
-    ucx_properties_fill(parser, (char*)str, strlen(str));
-    
-    r = ucx_properties2map(parser, map);
-    UCX_TEST_ASSERT(r == 0, "properties2map failed");
-    UCX_TEST_ASSERT(map->count == 0, "wrong number of properties");
-    
-    str = "key1 = value1\nsyntax error line\n";
-    ucx_properties_fill(parser, (char*)str, strlen(str));
-    
-    r = ucx_properties2map(parser, map);
-    UCX_TEST_ASSERT(r == 1, "properties2map should return 1");
-    UCX_TEST_ASSERT(map->count == 1, "wrong number of properties");
-    
-    char *v = (char*)ucx_map_cstr_get(map, "key1");
-    UCX_TEST_ASSERT((!strcmp(v, "value1")), "wrong value");
-    
-    UCX_TEST_END
-    
-    ucx_mempool_destroy(mp);
-    ucx_properties_free(parser);
-}
-
-UCX_TEST(test_ucx_properties_load) { 
-    UCX_TEST_BEGIN
-    FILE *f = tmpfile();
-    UCX_TEST_ASSERT(f, "test file cannot be opened, test aborted");
-    
-    fprintf(f, "# properties file\n\nkey1 = value1\nkey2 = value2\n");
-    fprintf(f, "\n\nkey3    = value3\n\n");
-    
-    size_t name_len = 512;
-    char *long_name = (char*)malloc(name_len);
-    memset(long_name, 'k', 512);
-    
-    size_t value_len = 2048;
-    char *long_value = (char*)malloc(value_len);
-    memset(long_value, 'v', 2048);
-    
-    fwrite(long_name, 1, name_len, f);
-    fprintf(f, "    =    ");
-    fwrite(long_value, 1, value_len, f);
-    fprintf(f, "                         \n");
-    
-    fprintf(f, "\n\n\n\nlast_key = property value\n");
-    
-    fflush(f);
-    fseek(f, 0, SEEK_SET);
-    
-    UcxMap *map = ucx_map_new(8);
-    int r = ucx_properties_load(map, f);
-    
-    UCX_TEST_ASSERT(r == 0, "ucx_properties_load failed");
-    UCX_TEST_ASSERT(map->count == 5, "wrong number of properties");
-    
-    char *v1 = (char*)ucx_map_cstr_get(map, "key1");
-    char *v2 = (char*)ucx_map_cstr_get(map, "key2");
-    char *v3 = (char*)ucx_map_cstr_get(map, "key3");
-    char *lv = (char*)ucx_map_sstr_get(map, sstrn(long_name, name_len));
-    char *lk = (char*)ucx_map_cstr_get(map, "last_key");
-    
-    UCX_TEST_ASSERT(v1, "value for key1 not found");
-    UCX_TEST_ASSERT(v2, "value for key2 not found");
-    UCX_TEST_ASSERT(v3, "value for key3 not found");
-    UCX_TEST_ASSERT(lv, "value for long key not found");
-    UCX_TEST_ASSERT(lk, "value for last_key not found");
-    
-    UCX_TEST_ASSERT((!strcmp(v1, "value1")), "wrong value for key1");
-    UCX_TEST_ASSERT((!strcmp(v2, "value2")), "wrong value for key2");
-    UCX_TEST_ASSERT((!strcmp(v3, "value3")), "wrong value for key3");
-    sstr_t long1 = sstrn(long_value, value_len);
-    sstr_t long2 = sstr(lv);
-    UCX_TEST_ASSERT((!sstrcmp(long1, long2)), "wrong value for long key");
-    UCX_TEST_ASSERT(!strcmp(lk, "property value"), "wrong value for last_key");
-    
-    free(v1);
-    free(v2);
-    free(v3);
-    free(lv);
-    free(lk);
-    ucx_map_free(map);
-    fclose(f);
-    
-    free(long_name);
-    free(long_value);
-    
-    UCX_TEST_END
-}
-
-UCX_TEST(test_ucx_properties_store) {
-    UcxMap *map1 = ucx_map_new(16);
-    ucx_map_cstr_put(map1, "key1", "value1");
-    ucx_map_cstr_put(map1, "key2", "value2");
-    ucx_map_cstr_put(map1, "key3", "value3");
-    ucx_map_cstr_put(map1, "key4", "value4");
-    ucx_map_cstr_put(map1, "property.key1", "some value 1");
-    ucx_map_cstr_put(map1, "property.key2", "some value 2");
-    ucx_map_cstr_put(map1, "property.key3", "some value 3");
-    ucx_map_cstr_put(map1, "property.key4", "some value 4");
-    
-    UCX_TEST_BEGIN
-    
-    FILE *f = tmpfile();
-    fprintf(f, "#\n# test property file\n#\n#\n");
-    ucx_properties_store(map1, f);
-    
-    fflush(f);
-    fseek(f, 0, SEEK_SET);
-    UcxMap *map2 = ucx_map_new(16);
-    ucx_properties_load(map2, f);
-    
-    UCX_TEST_ASSERT(map2->count == 8, "wrong number of properties in map2");
-    
-    char *v1 = (char*)ucx_map_cstr_get(map2, "key1");
-    char *v2 = (char*)ucx_map_cstr_get(map2, "key2");
-    char *v3 = (char*)ucx_map_cstr_get(map2, "key3");
-    char *v4 = (char*)ucx_map_cstr_get(map2, "key4");
-    char *v5 = (char*)ucx_map_cstr_get(map2, "property.key1");
-    char *v6 = (char*)ucx_map_cstr_get(map2, "property.key2");
-    char *v7 = (char*)ucx_map_cstr_get(map2, "property.key3");
-    char *v8 = (char*)ucx_map_cstr_get(map2, "property.key4");
-    
-    UCX_TEST_ASSERT(v1 && v2 && v3 && v4 && v5 && v6 && v7 && v8,
-            "missing values");
-    
-    UCX_TEST_ASSERT((!strcmp(v1, "value1")), "wrong value 1");
-    UCX_TEST_ASSERT((!strcmp(v2, "value2")), "wrong value 2");
-    UCX_TEST_ASSERT((!strcmp(v3, "value3")), "wrong value 3");
-    UCX_TEST_ASSERT((!strcmp(v4, "value4")), "wrong value 4");
-    UCX_TEST_ASSERT((!strcmp(v5, "some value 1")), "wrong value 5");
-    UCX_TEST_ASSERT((!strcmp(v6, "some value 2")), "wrong value 6");
-    UCX_TEST_ASSERT((!strcmp(v7, "some value 3")), "wrong value 7");
-    UCX_TEST_ASSERT((!strcmp(v8, "some value 4")), "wrong value 8");
-    
-    free(v1);
-    free(v2);
-    free(v3);
-    free(v4);
-    free(v5);
-    free(v6);
-    free(v7);
-    free(v8);
-    ucx_map_free(map2);
-    fclose(f);
-    
-    UCX_TEST_END
-    
-    ucx_map_free(map1);
-}
--- a/test/prop_tests.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef PROP_TESTS_H
-#define	PROP_TESTS_H
-
-#include <ucx/test.h>
-#include <ucx/properties.h>
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-UCX_TEST(test_ucx_properties_new);
-UCX_TEST(test_ucx_properties_next);
-UCX_TEST(test_ucx_properties_next_multi);
-UCX_TEST(test_ucx_properties_next_part);
-UCX_TEST(test_ucx_properties_next_long);
-UCX_TEST(test_ucx_properties2map);
-UCX_TEST(test_ucx_properties_load);
-UCX_TEST(test_ucx_properties_store);
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* PROP_TESTS_H */
-
--- a/test/stack_tests.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,209 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "stack_tests.h"
-
-#define test_ucx_stack_before \
-    char space[99]; \
-    UcxStack stack; \
-    ucx_stack_init(&stack, space, 99) \
-
-UCX_TEST(test_ucx_stack_init) {
-    
-    test_ucx_stack_before;
-    
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(
-        stack.allocator.malloc == (ucx_allocator_malloc) ucx_stack_malloc &&
-        stack.allocator.calloc == (ucx_allocator_calloc) ucx_stack_calloc &&
-        stack.allocator.realloc == (ucx_allocator_realloc) ucx_stack_realloc &&
-        stack.allocator.free == (ucx_allocator_free) ucx_stack_free &&
-        stack.allocator.pool == &stack,
-        "allocator not properly set");
-    
-    UCX_TEST_ASSERT(!stack.top && stack.space == space
-        && stack.size == 99 - 99 % sizeof(void*),
-        "struct fields not properly set");
-    
-    UCX_TEST_END
-}
-
-UCX_TEST(test_ucx_stack_malloc) {
-
-    test_ucx_stack_before;
-    
-    const size_t metasize = sizeof(struct ucx_stack_metadata);
-    
-    
-    char* first = (char*) ucx_stack_malloc(&stack, 30);
-    char* second = (char*) ucx_stack_malloc(&stack, 30);
-    char* full = (char*) ucx_stack_malloc(&stack, 30);
-    
-    memcpy(first,  "012345678901234567890123456789", 30);
-    memcpy(second, "abcdefghijklmnopqrstuvwxyzABCD", 30);
-    
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(!memcmp(space + metasize,
-        "012345678901234567890123456789", 30), "first element corrupted");
-    UCX_TEST_ASSERT(!memcmp(space + 32+2*metasize,
-        "abcdefghijklmnopqrstuvwxyzABCD", 30), "first element corrupted");
-    
-    UCX_TEST_ASSERT(!full, "stack can be overflowed");
-    UCX_TEST_ASSERT(stack.top == space + 32 + 2*metasize, "wrong top pointer");
-
-    if (3*metasize < 32) {
-        UCX_TEST_ASSERT(ucx_stack_avail(&stack) == 32-3*metasize,
-            "wrong remaining available memory");
-    } else {
-        UCX_TEST_ASSERT(ucx_stack_avail(&stack) == 0,
-            "wrong remaining available memory");
-    }
-
-    UCX_TEST_END
-}
-
-UCX_TEST(test_ucx_stack_calloc) {
-    
-    test_ucx_stack_before;
-
-    char zeros[99];
-    memset(zeros, 0, 99);
-    memset(space, 32, 99);
-    ucx_stack_calloc(&stack, 4, sizeof(int));
-    
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(!memcmp(space+sizeof(struct ucx_stack_metadata),
-        zeros, 4*sizeof(int)), "memory not nulled");
-    UCX_TEST_ASSERT(!memcmp(space+sizeof(struct ucx_stack_metadata)
-        +4*sizeof(int), "          ", 10), "too much memory nulled");
-        
-    UCX_TEST_END
-}
-
-UCX_TEST(test_ucx_stack_free) {
-    
-    test_ucx_stack_before;
-    
-    void *fst = ucx_stack_malloc(&stack, 10);
-    void *snd = ucx_stack_malloc(&stack, 10);
-    void *thrd = ucx_stack_malloc(&stack, 10);
-    
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(stack.top == thrd, "wrong stack");
-    UCX_TEST_ASSERT(((struct ucx_stack_metadata*) thrd - 1)->prev == snd,
-        "wrong thrd prev pointer before free");
-    
-    ucx_stack_free(&stack, snd);
-    
-    UCX_TEST_ASSERT(((struct ucx_stack_metadata*) thrd - 1)->prev == fst,
-        "wrong thrd prev pointer after freeing snd");
-    UCX_TEST_ASSERT(stack.top == thrd, "wrong top after freeing snd");
-    
-    ucx_stack_free(&stack, thrd);
-
-    UCX_TEST_ASSERT(stack.top == fst, "wrong top after freeing thrd");
-    
-    UCX_TEST_END
-}
-
-UCX_TEST(test_ucx_stack_realloc) {
-    
-    test_ucx_stack_before;
-    
-    void *fst = ucx_stack_malloc(&stack, 14);
-    void *snd = ucx_stack_malloc(&stack, 10);
-    
-    UCX_TEST_BEGIN
-    
-    void *nfst = ucx_stack_realloc(&stack, fst, 16);
-    UCX_TEST_ASSERT(nfst == fst, "unnecessary move on reallocation");
-    UCX_TEST_ASSERT(((struct ucx_stack_metadata*)fst - 1)->size == 16,
-        "wrong size after reallocation");
-    
-    void *nsnd = ucx_stack_realloc(&stack, snd, 30);
-    UCX_TEST_ASSERT(nsnd == snd, "unnecessary move on top reallocation");
-    UCX_TEST_ASSERT(ucx_stack_topsize(&stack) == 30,
-        "wrong size after top reallocation");
-    
-    nsnd = ucx_stack_realloc(&stack, snd, 5);
-    UCX_TEST_ASSERT(nsnd == snd, "unnecessary move on top shrink");
-    UCX_TEST_ASSERT(ucx_stack_topsize(&stack) == 5,
-        "wrong size after top shrink");
-    UCX_TEST_ASSERT(ucx_stack_avail(&stack) ==
-        72-3*sizeof(struct ucx_stack_metadata), "wrong size after top shrink");
-    
-    nfst = ucx_stack_realloc(&stack, fst, 24);
-    UCX_TEST_ASSERT(nfst != fst, "missing move on huge reallocation");
-    UCX_TEST_ASSERT(stack.top == nfst, "wrong top after huge reallocation");
-    UCX_TEST_ASSERT(ucx_stack_topsize(&stack) == 24,
-        "wrong size after huge reallocation");
-    UCX_TEST_ASSERT(!((struct ucx_stack_metadata*)snd - 1)->prev,
-        "element not freed after huge reallocation");
-    
-    UCX_TEST_END
-}
-
-UCX_TEST(test_ucx_stack_pop) {
-    
-    test_ucx_stack_before;
-    memset(space, 32, 99);
-    
-    void *fst = ucx_stack_malloc(&stack, 10);
-    void *snd = ucx_stack_malloc(&stack, 10);
-    ucx_stack_malloc(&stack, 10);
-    
-    char buf[16];
-    
-    UCX_TEST_BEGIN
-    
-    memset(buf, '0', 16);
-    ucx_stack_pop(&stack, buf);
-    UCX_TEST_ASSERT(memcmp(buf, "          000000", 16) == 0,
-        "popped wrong content");
-    UCX_TEST_ASSERT(stack.top == snd, "wrong top after pop");
-    
-    memset(buf, '0', 16);
-    ucx_stack_popn(&stack, buf, 5);
-    UCX_TEST_ASSERT(memcmp(buf, "     00000000000", 16) == 0,
-        "n-popped wrong content");
-    UCX_TEST_ASSERT(stack.top == fst, "wrong top after pop");
-    
-    ucx_stack_pop(&stack, buf);
-    UCX_TEST_ASSERT(!stack.top, "top not NULL after last pop");
-    
-    memset(buf, '0', 16);
-    ucx_stack_pop(&stack, buf);
-    UCX_TEST_ASSERT(memcmp(buf, "0000000000000000", 16) == 0,
-        "content not unchanged after empty pop");
-    
-    UCX_TEST_END
-}
--- a/test/stack_tests.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef STACK_TESTS_H
-#define	STACK_TESTS_H
-
-#include <ucx/test.h>
-#include <ucx/stack.h>
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-UCX_TEST(test_ucx_stack_init);
-UCX_TEST(test_ucx_stack_malloc);
-UCX_TEST(test_ucx_stack_calloc);
-UCX_TEST(test_ucx_stack_free);
-UCX_TEST(test_ucx_stack_realloc);
-UCX_TEST(test_ucx_stack_pop);
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* STACK_TESTS_H */
-
--- a/test/string_tests.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,589 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "string_tests.h"
-
-UCX_TEST(test_sstr_macros) {
-    sstr_t hello = ST("Hello");
-    sstr_t world = S("World");
-    
-    char buf[20];
-    snprintf(buf, sizeof(buf), "%" PRIsstr ", %" PRIsstr "!", SFMT(hello), SFMT(world));
-    
-    UCX_TEST_BEGIN
-    const char* cmp = "Hello, World!";
-    UCX_TEST_ASSERT(!strcmp(cmp, buf), "Something weird happened.");
-    UCX_TEST_END
-}
-
-UCX_TEST(test_sstr) {
-    sstr_t s1 = sstr((char*)"1234");
-    sstr_t s2 = sstrn((char*)"ab", 2);
-     
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(s1.length == 4, "s1 length must be 4");
-    UCX_TEST_ASSERT(s2.length == 2, "s2 length must be 2");
-    
-    UCX_TEST_END
-}
-
-UCX_TEST(test_sstr_len) {
-    sstr_t s1 = ST("1234");
-    sstr_t s2 = ST(".:.:.");
-    sstr_t s3 = ST("X");
-    
-    size_t len1 = sstrnlen(1, s1);
-    size_t len2 = sstrnlen(2, s1, s2);
-    size_t len3 = sstrnlen(3, s1, s2, s3);
-    
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(len1 == 4, "sstrnlen returned wrong size");
-    UCX_TEST_ASSERT(len2 == 9, "sstrnlen returned wrong size");
-    UCX_TEST_ASSERT(len3 == 10, "sstrnlen returned wrong size");
-
-    UCX_TEST_END
-}
-
-
-UCX_TEST(test_sstrchr_sstrrchr) {
-    sstr_t str = ST("I will find you - and I will kill you");
-    UCX_TEST_BEGIN
-    
-    sstr_t notfound = sstrchr(str, 'x');
-    UCX_TEST_ASSERT(notfound.length == 0,
-            "string length not 0 after forward search w/o result");
-    
-    notfound = sstrrchr(str, 'x');
-    UCX_TEST_ASSERT(notfound.length == 0,
-            "string length not 0 after reverse search w/o result");
-    
-    sstr_t result = sstrchr(str, 'w');
-    UCX_TEST_ASSERT(result.length == 35, "sstrchr returned wrong length");
-    UCX_TEST_ASSERT(strcmp("will find you - and I will kill you", result.ptr)
-        == 0, "sstrchr did not return the expected string");
-    
-    result = sstrrchr(str, 'w');
-    UCX_TEST_ASSERT(result.length == 13, "sstrrchr returned wrong length");
-    UCX_TEST_ASSERT(strcmp("will kill you", result.ptr)
-        == 0, "sstrrchr did not return the expected string");
-    
-    UCX_TEST_END
-}
-
-UCX_TEST(test_sstrstr) {
-    sstr_t str = ST("find the match in this string");
-    sstr_t longstr = ST(
-            "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl"
-            "mnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwx"
-            "yzabcdeababababnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghij"
-            "klmnopqrstuvwxyzaababababababababrstuvwxyzabcdefghijklmnopqrstuv"
-            "abababababababababababababababababababababababababababababababab"
-            "abababababababababababababababababababababababababababababababab"
-            "abababababababababababababababababababababababababababababababab"
-            "abababababababababababababababababababababababababababababababab"
-            "abababababababababababababababababababababababababababababababab"
-            "abababababababababababababababababababababababababababababababab"
-            "wxyz1234567890");
-    sstr_t longstrpattern = ST(
-            "abababababababababababababababababababababababababababababababab"
-            "abababababababababababababababababababababababababababababababab"
-            "abababababababababababababababababababababababababababababababab"
-            "abababababababababababababababababababababababababababababababab"
-            "abababababababababababababababababababababababababababababababab"
-            );
-    sstr_t longstrresult = ST(
-            "abababababababababababababababababababababababababababababababab"
-            "abababababababababababababababababababababababababababababababab"
-            "abababababababababababababababababababababababababababababababab"
-            "abababababababababababababababababababababababababababababababab"
-            "abababababababababababababababababababababababababababababababab"
-            "abababababababababababababababababababababababababababababababab"
-            "wxyz1234567890"
-            );
-    UCX_TEST_BEGIN
-    
-    sstr_t notfound = sstrstr(str, S("no match"));
-    UCX_TEST_ASSERT(notfound.length == 0, "no match must return empty string");
-    
-    sstr_t result = sstrstr(str, S("match"));
-    UCX_TEST_ASSERT(result.length == 20, "sstrstr returned wrong length");
-    UCX_TEST_ASSERT(!strcmp("match in this string", result.ptr),
-        "sstrstr did not return the expected string");
-    
-    result = sstrstr(str, S(""));
-    UCX_TEST_ASSERT(result.length == str.length,
-        "sstrstr with empty match string returned wrong length");
-    UCX_TEST_ASSERT(!strcmp(str.ptr, result.ptr),
-        "sstrstr with empty match string did not return the original string");
-    
-    result = sstrstr(longstr, longstrpattern);
-    UCX_TEST_ASSERT(result.length == longstrresult.length,
-            "long string result length incorrect");
-    UCX_TEST_ASSERT(!strcmp(result.ptr, longstrresult.ptr),
-            "long string result content incorrect");
-    
-    UCX_TEST_END
-}
-
-UCX_TEST(test_sstrcmp) {
-    sstr_t str = ST("compare this");
-    
-    UCX_TEST_BEGIN
-    UCX_TEST_ASSERT(sstrcmp(str, S("")) == 1, "empty cmp failed");
-    UCX_TEST_ASSERT(sstrcmp(S(""), S("")) == 0, "empty cmp false negative");
-    UCX_TEST_ASSERT(sstrcmp(str, S("compare this")) == 0, "false negative");
-    UCX_TEST_ASSERT(sstrcmp(str, S("Compare This")) != 0, "false positive");
-    UCX_TEST_ASSERT(sstrcmp(str, S("compare tool")) < 0, "memcmp < 0 failed");
-    UCX_TEST_ASSERT(sstrcmp(str, S("compare shit")) > 0, "memcmp > 0 failed");
-    UCX_TEST_ASSERT(sstrcmp(str, S("compare this not")) < 0, "len < 0 failed");
-    UCX_TEST_ASSERT(sstrcmp(str, S("compare")) > 0, "len > 0 failed");
-    UCX_TEST_END
-}
-
-UCX_TEST(test_sstrcasecmp) {
-    
-    sstr_t str = ST("compare this");
-    
-    UCX_TEST_BEGIN
-    UCX_TEST_ASSERT(sstrcasecmp(str, S("")) == 1, "empty cmp failed");
-    UCX_TEST_ASSERT(sstrcasecmp(S(""), S("")) == 0, "empty cmp false negative");
-    UCX_TEST_ASSERT(sstrcasecmp(str, S("compare this")) == 0, "false negative");
-    UCX_TEST_ASSERT(sstrcasecmp(str, S("Compare This")) == 0,
-        "not ignoring case");
-    UCX_TEST_ASSERT(sstrcasecmp(str, S("compare tool")) < 0, "< 0 failed");
-    UCX_TEST_ASSERT(sstrcasecmp(str, S("compare shit")) > 0, "> 0 failed");
-    UCX_TEST_ASSERT(sstrcasecmp(str, S("compare this not")) < 0,
-        "len < 0 failed");
-    UCX_TEST_ASSERT(sstrcasecmp(str, S("compare")) > 0, "len > 0 failed");
-    UCX_TEST_END
-}
-
-
-UCX_TEST(test_sstrcat) {
-    sstr_t s1 = S("12");
-    sstr_t s2 = S("34");
-    sstr_t s3 = S("56");
-    sstr_t sn = { NULL, 0 };
-    
-    UCX_TEST_BEGIN
-    
-    sstr_t t1 = sstrcat(2, s1, s2);
-    UCX_TEST_ASSERT(!sstrcmp(t1, S("1234")), "t1: wrong content");
-    free(t1.ptr);
-    
-    sstr_t t2 = sstrcat(3, s1, s2, s3);
-    UCX_TEST_ASSERT(!sstrcmp(t2, S("123456")), "t2: wrong content");
-    free(t2.ptr);
-    
-    sstr_t t3 = sstrcat(6, s1, sn, s2, sn, s3, sn);
-    UCX_TEST_ASSERT(!sstrcmp(t3, S("123456")), "t3: wrong content");
-    free(t3.ptr);
-    
-    sstr_t t4 = sstrcat(2, sn, sn);
-    UCX_TEST_ASSERT(t4.ptr, "t4.ptr is NULL");
-    UCX_TEST_ASSERT(t4.length == 0, "t4 has wrong length");
-    free(t4.ptr);
-    
-    // overflow test
-    sstr_t o0;
-    o0.ptr = "";
-    o0.length = ((size_t)-1) - 50;
-    sstr_t o1;
-    o1.ptr = "";
-    o1.length = 100;
-    sstr_t o2;
-    o2.ptr = "";
-    o2.length = 10;
-    
-    sstr_t n = sstrcat(2, o0, o1);
-    UCX_TEST_ASSERT(n.ptr == NULL && n.length == 0, "overflow not detected");
-    sstr_t n2 = sstrcat(3, o0, o2, o1);
-    UCX_TEST_ASSERT(n2.ptr == NULL && n2.length == 0, "n2: overflow not detected");
-            
-    UCX_TEST_END
-    
-}
-
-UCX_TEST(test_sstrsplit) {
-
-    const char *original = "this,is,a,csv,string";
-    sstr_t test = ST("this,is,a,csv,string"); /* use copy of original here */
-    ssize_t n;
-    sstr_t *list;
-
-    UCX_TEST_BEGIN
-
-    /* Nullpointer check */
-    n = 0;
-    UCX_TEST_ASSERT(sstrsplit(test, S(""), &n) == NULL,
-            "empty delimiter must return NULL");
-
-    /* no delimiter occurence (ndo) */
-    n = 0;
-    list = sstrsplit(test, S("z"), &n);
-    UCX_TEST_ASSERT(n == 1, "ndo, list length must be 1");
-    UCX_TEST_ASSERT(strcmp(list[0].ptr, original) == 0, "ndo, "
-            "original string shall be returned as single list element");
-    UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0,
-                "ndo, original has been modified");
-    for(int i=0;i<n;i++) {
-        free(list[i].ptr);
-    }
-    free(list);
-
-    /* partially matching delimiter (pmd) */
-    n = 0;
-    list = sstrsplit(test, S("stringbuilder"), &n);
-    UCX_TEST_ASSERT(n == 1, "pmd, list length must be 1");
-    UCX_TEST_ASSERT(strcmp(list[0].ptr, original) == 0, "pmd, "
-            "original string shall be returned as single list element");
-    UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0,
-                "pmd, original has been modified");
-    for(int i=0;i<n;i++) {
-        free(list[i].ptr);
-    }
-    free(list);
-
-    /* matching single-char delimiter (mscd) */
-    n = 0;
-    list = sstrsplit(test, S(","), &n);
-    UCX_TEST_ASSERT(n == 5, "mscd, list length must be 5");
-    UCX_TEST_ASSERT(strcmp(list[0].ptr, "this") == 0, "mscd, item 0 mismatch");
-    UCX_TEST_ASSERT(strcmp(list[1].ptr, "is") == 0, "mscd, item 1 mismatch");
-    UCX_TEST_ASSERT(strcmp(list[2].ptr, "a") == 0, "mscd, item 2 mismatch");
-    UCX_TEST_ASSERT(strcmp(list[3].ptr, "csv") == 0, "mscd, item 3 mismatch");
-    UCX_TEST_ASSERT(strcmp(list[4].ptr, "string")==0, "mscd, item 4 mismatch");
-    UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0,
-            "mscd, original has been modified");
-    for(int i=0;i<n;i++) {
-        free(list[i].ptr);
-    }
-    free(list);
-
-    /* matching multi-char delimiter (mmcd) */
-    n = 0;
-    list = sstrsplit(test, S("is"), &n);
-    UCX_TEST_ASSERT(n == 3, "mscd, list length must be 3");
-    UCX_TEST_ASSERT(strcmp(list[0].ptr, "th") == 0, "mmcd, item 0 mismatch");
-    UCX_TEST_ASSERT(strcmp(list[1].ptr, ",") == 0, "mmcd, item 1 mismatch");
-    UCX_TEST_ASSERT(strcmp(list[2].ptr, ",a,csv,string") == 0,
-            "mmcd, item 2 mismatch");
-    UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0,
-            "mmcd, original has been modified");
-    for(int i=0;i<n;i++) {
-        free(list[i].ptr);
-    }
-    free(list);
-
-    /* bounded list using single-char delimiter (blsc) */
-    n = 3;
-    list = sstrsplit(test, S(","), &n);
-    UCX_TEST_ASSERT(n == 3, "blsc, list length must be 3");
-    UCX_TEST_ASSERT(strcmp(list[0].ptr, "this") == 0, "blsc, item 0 mismatch");
-    UCX_TEST_ASSERT(strcmp(list[1].ptr, "is") == 0, "blsc, item 1 mismatch");
-    UCX_TEST_ASSERT(strcmp(list[2].ptr, "a,csv,string") == 0,
-            "blsc, item 2 mismatch");
-    UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0,
-            "blsc, original has been modified");
-    for(int i=0;i<n;i++) {
-        free(list[i].ptr);
-    }
-    free(list);
-
-    /* bounded list using multi-char delimiter (blmc) */
-    n = 2;
-    list = sstrsplit(test, S("is"), &n);
-    UCX_TEST_ASSERT(n == 2, "blmc, list length must be 2");
-    UCX_TEST_ASSERT(strcmp(list[0].ptr, "th") == 0, "blmc, item 0 mismatch");
-    UCX_TEST_ASSERT(strcmp(list[1].ptr, ",is,a,csv,string") == 0,
-            "blmc, item 1 mismatch");
-    UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0,
-            "blmc, original has been modified");
-    for(int i=0;i<n;i++) {
-        free(list[i].ptr);
-    }
-    free(list);
-
-    /* start with delimiter (swd) */
-    n = 0;
-    list = sstrsplit(test, S("this"), &n);
-    UCX_TEST_ASSERT(n == 2, "swd, list length must be 2");
-    UCX_TEST_ASSERT(list[0].length == 0, "swd, first item must be empty");
-    UCX_TEST_ASSERT(strcmp(list[1].ptr, ",is,a,csv,string") == 0,
-            "swd, second item corrupt");
-    UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0,
-            "swd, original has been modified");
-    for(int i=0;i<n;i++) {
-        free(list[i].ptr);
-    }
-    free(list);
-
-    /* end with delimiter (ewd) */
-    n = 0;
-    list = sstrsplit(test, S("string"), &n);
-    UCX_TEST_ASSERT(n == 2, "ewd, list length must be 2");
-    UCX_TEST_ASSERT(strcmp(list[0].ptr, "this,is,a,csv,") == 0,
-            "ewd, first item corrupt");
-    UCX_TEST_ASSERT(list[1].length == 0, "ewd, second item must be empty");
-    UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0,
-            "ewd, original has been modified");
-    for(int i=0;i<n;i++) {
-        free(list[i].ptr);
-    }
-    free(list);
-    
-    /* end with delimiter exceed bound (ewdeb) */
-    n = 3;
-    sstr_t ewdebtest = ST("a,b,c,");
-    list = sstrsplit(ewdebtest, S(","), &n);
-    UCX_TEST_ASSERT(n == 3, "ewdeb, list length must be 3");
-    UCX_TEST_ASSERT(strcmp(list[0].ptr, "a") == 0, "ewdeb, fst item corrupt");
-    UCX_TEST_ASSERT(strcmp(list[1].ptr, "b") == 0, "ewdeb, snd item corrupt");
-    UCX_TEST_ASSERT(strcmp(list[2].ptr, "c,") == 0, "ewdeb, trd item corrupt");
-    for(int i=0;i<n;i++) {
-        free(list[i].ptr);
-    }
-    free(list);
-
-    /* exact match (exm) */
-    n = 0;
-    list = sstrsplit(test, S("this,is,a,csv,string"), &n);
-    UCX_TEST_ASSERT(n == 0, "exm, list length must be 0");
-    UCX_TEST_ASSERT(list == NULL, "exm, list must be NULL");
-    for(int i=0;i<n;i++) {
-        free(list[i].ptr);
-    }
-    free(list);
-
-    /* substring (subs) */
-    n = 0;
-    list = sstrsplit(test, S("this,is,a,csv,string,with,extension"), &n);
-    UCX_TEST_ASSERT(n == 1, "subs, list length must be 1");
-    UCX_TEST_ASSERT(strcmp(list[0].ptr, original) == 0,
-            "subs, single item must be the original string");
-    UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0,
-            "subs, original has been modified");
-    for(int i=0;i<n;i++) {
-        free(list[i].ptr);
-    }
-    free(list);
-    
-    /* double encounter delimiter (ded) */
-    n = 0;
-    list = sstrsplit(test, S("is,"), &n);
-    UCX_TEST_ASSERT(n == 3, "ded, list length must be 3");
-    UCX_TEST_ASSERT(strcmp(list[0].ptr, "th") == 0, "ded, item 0 mismatch");
-    UCX_TEST_ASSERT(list[1].length == 0, "ded, item 1 not empty!");
-    UCX_TEST_ASSERT(strcmp(list[2].ptr, "a,csv,string") == 0,
-        "ded, item 2 mismatch");
-    for(int i=0;i<n;i++) {
-        free(list[i].ptr);
-    }
-    free(list);
-
-    UCX_TEST_END
-}
-
-UCX_TEST(test_sstrtrim) {
-    sstr_t t1 = sstrtrim(sstr((char*)"  ein test   "));
-    sstr_t t2 = sstrtrim(sstr((char*)"abc"));
-    sstr_t t3 = sstrtrim(sstr((char*)" 123"));
-    sstr_t t4 = sstrtrim(sstr((char*)"xyz "));
-    sstr_t t5 = sstrtrim(sstr((char*)"   "));
-    sstr_t empty = sstrtrim(sstr((char*)""));
-    UCX_TEST_BEGIN
-    UCX_TEST_ASSERT(strncmp(t1.ptr, "ein test", t1.length) == 0, "failed");
-    UCX_TEST_ASSERT(strncmp(t2.ptr, "abc", t2.length) == 0, "failed");
-    UCX_TEST_ASSERT(strncmp(t3.ptr, "123", t3.length) == 0, "failed");
-    UCX_TEST_ASSERT(strncmp(t4.ptr, "xyz", t4.length) == 0, "failed");
-    UCX_TEST_ASSERT(t5.length == 0, "string t5 not empty");
-    UCX_TEST_ASSERT(empty.length == 0, "empty string failed");
-    UCX_TEST_END
-}
-
-UCX_TEST(test_sstrprefixsuffix) {
-    sstr_t str = ST("test my prefix and my suffix");
-    sstr_t empty = ST("");
-    
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(!sstrprefix(empty, S("pref")), "prefix empty string fails");
-    UCX_TEST_ASSERT(!sstrsuffix(empty, S("suf")), "suffix empty string fails");
-    
-    UCX_TEST_ASSERT(sstrprefix(str, empty), "empty prefix fails");
-    UCX_TEST_ASSERT(sstrsuffix(str, empty), "empty suffix fails");
-    
-    UCX_TEST_ASSERT(sstrprefix(empty, empty), "string and prefix empty fails");
-    UCX_TEST_ASSERT(sstrsuffix(empty, empty), "string and suffix empty fails");
-    
-    UCX_TEST_ASSERT(sstrprefix(str, S("test ")), "prefix false negative");
-    UCX_TEST_ASSERT(!sstrprefix(str, S("8-) fsck ")), "prefix false positive");
-    
-    UCX_TEST_ASSERT(sstrsuffix(str, S("fix")), "suffix false negative");
-    UCX_TEST_ASSERT(!sstrsuffix(str, S("fox")), "suffix false positive");
-
-    
-    UCX_TEST_END
-}
-
-UCX_TEST(test_sstrcaseprefixsuffix) {
-    sstr_t str = ST("test my prefix and my suffix");
-    sstr_t empty = ST("");
-    
-    UCX_TEST_BEGIN
-    
-    UCX_TEST_ASSERT(!sstrcaseprefix(empty, S("pREf")), "prefix empty string fails");
-    UCX_TEST_ASSERT(!sstrcasesuffix(empty, S("sUf")), "suffix empty string fails");
-    
-    UCX_TEST_ASSERT(sstrcaseprefix(str, empty), "empty prefix fails");
-    UCX_TEST_ASSERT(sstrcasesuffix(str, empty), "empty suffix fails");
-    
-    UCX_TEST_ASSERT(sstrcaseprefix(empty, empty), "string and prefix empty fails");
-    UCX_TEST_ASSERT(sstrcasesuffix(empty, empty), "string and suffix empty fails");
-    
-    UCX_TEST_ASSERT(sstrcaseprefix(str, S("TEST ")), "prefix false negative");
-    UCX_TEST_ASSERT(!sstrcaseprefix(str, S("8-) fsck ")), "prefix false positive");
-    
-    UCX_TEST_ASSERT(sstrcasesuffix(str, S("FIX")), "suffix false negative");
-    UCX_TEST_ASSERT(!sstrcasesuffix(str, S("fox")), "suffix false positive");
-    
-    UCX_TEST_END
-}
-
-UCX_TEST(test_sstrreplace) {
-
-    sstr_t str = ST("test ababab string aba");
-    sstr_t longstr = ST("xyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacd");
-    sstr_t notrail = ST("test abab");
-    sstr_t empty = ST("");
-    sstr_t astr = ST("aaaaaaaaaa");
-    sstr_t csstr = ST("test AB ab TEST xyz");
-
-    sstr_t repl = sstrreplace(str, SC("abab"), SC("muchlonger"));
-    sstr_t expected = ST("test muchlongerab string aba");
-
-    sstr_t repln = sstrreplacen(str, SC("ab"), SC("c"), 2);
-    sstr_t expectedn = ST("test ccab string aba");
-
-    sstr_t longrepl = sstrreplace(longstr, SC("a"), SC("z"));
-    sstr_t longexpect = ST("xyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzcd");
-
-    sstr_t replnotrail = sstrreplace(notrail, SC("ab"), SC("z"));
-    sstr_t notrailexpect = ST("test zz");
-    
-    sstr_t repleq = sstrreplace(str, str, SC("hello"));
-    sstr_t eqexpect = ST("hello");
-    
-    sstr_t replempty1 = sstrreplace(empty, SC("ab"), SC("c")); // expect: empty
-    sstr_t replempty2 = sstrreplace(str, SC("abab"), empty);
-    sstr_t emptyexpect2 = ST("test ab string aba");
-    
-    sstr_t replpre = sstrreplace(str, SC("test "), SC("TEST "));
-    sstr_t preexpected = ST("TEST ababab string aba");
-    
-    sstr_t replan1 = sstrreplacen(astr, SC("a"), SC("x"), 1);
-    sstr_t an1expected = ST("xaaaaaaaaa");
-    
-    sstr_t replan4 = sstrreplacen(astr, SC("a"), SC("x"), 4);
-    sstr_t an4expected = ST("xxxxaaaaaa");
-    
-    sstr_t replan9 = sstrreplacen(astr, SC("a"), SC("x"), 9);
-    sstr_t an9expected = ST("xxxxxxxxxa");
-    
-    sstr_t replan10 = sstrreplacen(astr, SC("a"), SC("x"), 10);
-    sstr_t an10expected = ST("xxxxxxxxxx");
-    
-    sstr_t replcs1 = sstrreplace(csstr, SC("AB"), SC("*"));
-    sstr_t cs1expected = ST("test * ab TEST xyz");
-    
-    sstr_t replcs2 = sstrreplace(csstr, SC("test"), SC("TEST"));
-    sstr_t cs2expected = ST("TEST AB ab TEST xyz");
-    
-    UCX_TEST_BEGIN
-
-    UCX_TEST_ASSERT(repl.ptr != str.ptr, "result string is not fresh");
-    UCX_TEST_ASSERT(!sstrcmp(repl, expected), "incorrect replacement");
-
-    UCX_TEST_ASSERT(repln.ptr != str.ptr, "result string is not fresh");
-    UCX_TEST_ASSERT(!sstrcmp(repln, expectedn), "incorrect replacement");
-
-    UCX_TEST_ASSERT(!sstrcmp(longrepl, longexpect),
-            "incorrect handling of long strings");
-
-    UCX_TEST_ASSERT(!sstrcmp(replnotrail, notrailexpect),
-            "no trail replacement fails");
-    
-    UCX_TEST_ASSERT(!sstrcmp(repleq, eqexpect),
-            "equal replacement fails");
-    
-    UCX_TEST_ASSERT(!sstrcmp(replempty1, empty),
-            "replacement in empty string fails");
-    
-    UCX_TEST_ASSERT(!sstrcmp(replempty2, emptyexpect2),
-            "empty replacement fails");
-    
-    UCX_TEST_ASSERT(!sstrcmp(replpre, preexpected),
-            "prefix replacement fails");
-    
-    UCX_TEST_ASSERT(!sstrcmp(replan1, an1expected),
-            "a1 replacement fails");
-    
-    UCX_TEST_ASSERT(!sstrcmp(replan4, an4expected),
-            "a4 replacement fails");
-    
-    UCX_TEST_ASSERT(!sstrcmp(replan9, an9expected),
-            "a9 replacement fails");
-    
-    UCX_TEST_ASSERT(!sstrcmp(replan10, an10expected),
-            "a10 replacement fails");
-    
-    UCX_TEST_ASSERT(!sstrcmp(replcs1, cs1expected),
-            "case sensitivity test1 fails");
-    
-    UCX_TEST_ASSERT(!sstrcmp(replcs2, cs2expected),
-            "case sensitivity test2 fails");
-
-    UCX_TEST_END
-
-    free(repl.ptr);
-    free(repln.ptr);
-    free(longrepl.ptr);
-    free(replnotrail.ptr);
-    free(repleq.ptr);
-    if(replempty1.ptr) free(replempty1.ptr);
-    free(replempty2.ptr);
-    free(replpre.ptr);
-    free(replan1.ptr);
-    free(replan4.ptr);
-    free(replan9.ptr);
-    free(replan10.ptr);
-    free(replcs1.ptr);
-    free(replcs2.ptr);
-}
--- a/test/string_tests.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef STRING_TESTS_H
-#define	STRING_TESTS_H
-
-#include <ucx/test.h>
-#include <ucx/string.h>
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-UCX_TEST(test_sstr_macros);
-UCX_TEST(test_sstr);
-UCX_TEST(test_sstr_len);
-UCX_TEST(test_sstrcmp);
-UCX_TEST(test_sstrcasecmp);
-UCX_TEST(test_sstrcat);
-UCX_TEST(test_sstrchr_sstrrchr);
-UCX_TEST(test_sstrstr);
-UCX_TEST(test_sstrsplit);
-UCX_TEST(test_sstrtrim);
-UCX_TEST(test_sstrprefixsuffix);
-UCX_TEST(test_sstrcaseprefixsuffix);
-UCX_TEST(test_sstrreplace);
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* STRING_TESTS_H */
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/test_list.c	Sat Feb 06 19:11:44 2021 +0100
@@ -0,0 +1,31 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+int main() {
+    return 0;
+}
--- a/test/utils_tests.c	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,187 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "utils_tests.h"
-#include <ucx/buffer.h>
-
-UCX_TEST(test_ucx_fprintf) {
-    UcxBuffer *b1 = ucx_buffer_new(NULL, 32, UCX_BUFFER_AUTOEXTEND);
-    UcxBuffer *b2 = ucx_buffer_new(NULL, 4096, UCX_BUFFER_AUTOEXTEND);
-    
-    char *teststr1 = (char*)calloc(1, 1024);
-    char *teststr2 = (char*)calloc(1, 1024);
-    memset(teststr1, 'a', 1023);
-    memset(teststr2, 'b', 1023);
-    
-    UCX_TEST_BEGIN
-    
-    ucx_fprintf(b1, (write_func)ucx_buffer_write, "Hello %s", "World");
-    UCX_TEST_ASSERT(!strcmp(b1->space, "Hello World"), "wrong content in b1");
-    ucx_fprintf(b1, (write_func)ucx_buffer_write, "\nend.\n");
-    UCX_TEST_ASSERT(!strcmp(b1->space, "Hello World\nend.\n"),
-            "wrong content in b1 after second fprintf");
-    
-    ucx_bprintf(b2, "%s%s", teststr1, teststr2);
-    UCX_TEST_ASSERT(b2->pos == 2046, "wrong length");
-    UCX_TEST_ASSERT(!memcmp(b2->space, teststr1, 1023),
-            "wrong first half in b2");
-    UCX_TEST_ASSERT(!memcmp(b2->space+1023, teststr2, 1023),
-            "wrong second half in b2");
-    
-    UCX_TEST_END
-    
-    ucx_buffer_free(b1);
-    ucx_buffer_free(b2);
-    free(teststr1);
-    free(teststr2);
-}
-
-UCX_TEST(test_ucx_asprintf) {
-    char *teststr1 = (char*)calloc(1, 1024);
-    char *teststr2 = (char*)calloc(1, 1024);
-    memset(teststr1, 'a', 1023);
-    memset(teststr2, 'b', 1023);
-    UcxAllocator *a = ucx_default_allocator();
-    
-    UCX_TEST_BEGIN
-    
-    sstr_t s1 = ucx_asprintf(a, "int: %d\nHello %s!", 123, "World");
-    UCX_TEST_ASSERT(s1.ptr, "s1.ptr is NULL");
-    UCX_TEST_ASSERT(s1.length == 21, "wrong length");
-    UCX_TEST_ASSERT(!sstrcmp(s1, S("int: 123\nHello World!")), "wrong content");
-    free(s1.ptr);
-    
-    sstr_t s2 = ucx_asprintf(a, "%s%s", teststr1, teststr2);
-    UCX_TEST_ASSERT(s2.ptr, "s2.ptr is NULL");
-    UCX_TEST_ASSERT(s2.length == 2046, "wrong length");
-    UCX_TEST_ASSERT(!memcmp(s2.ptr, teststr1, 1023),
-            "wrong first half in s2");
-    UCX_TEST_ASSERT(!memcmp(s2.ptr+1023, teststr2, 1023),
-            "wrong second half in s2");
-    free(s2.ptr);
-    
-    UCX_TEST_END
-            
-    free(teststr1);
-    free(teststr2);
-}
-
-UCX_TEST(test_ucx_sprintf) {
-    UCX_TEST_BEGIN
-    
-    sstr_t s1 = ucx_sprintf("int: %d\nHello %s!", 123, "World");
-    UCX_TEST_ASSERT(s1.ptr, "s1.ptr is NULL");
-    UCX_TEST_ASSERT(s1.length == 21, "wrong length");
-    UCX_TEST_ASSERT(!sstrcmp(s1, S("int: 123\nHello World!")), "wrong content");
-    free(s1.ptr);
-    
-    sstr_t s2 = ucx_sprintf("Nothing to format!");
-    UCX_TEST_ASSERT(s2.ptr, "s2.ptr is NULL");
-    UCX_TEST_ASSERT(s2.length == 18, "wrong length");
-    UCX_TEST_ASSERT(!memcmp(s2.ptr, "Nothing to format!", 18),
-            "wrong string without format arguments");
-    free(s2.ptr);
-    
-    UCX_TEST_END
-}
-
-UCX_TEST(test_ucx_bprintf) {
-    UcxBuffer *b = ucx_buffer_new(NULL, 64, UCX_BUFFER_DEFAULT);
-    
-    UCX_TEST_BEGIN
-    
-    ucx_bprintf(b, "int: %d\nHello %s!", 123, "World");
-    UCX_TEST_ASSERT(b->size == 21, "wrong length");
-    UCX_TEST_ASSERT(!memcmp(b->space, "int: 123\nHello World!", 21),
-            "wrong content");
-            
-    ucx_buffer_clear(b);
-            
-    ucx_bprintf(b, "Nothing to format!");
-    UCX_TEST_ASSERT(b->size == 18, "wrong length");
-    UCX_TEST_ASSERT(!memcmp(b->space, "Nothing to format!", 18),
-            "wrong string without format arguments");
-            
-    UCX_TEST_END
-    
-    ucx_buffer_free(b);
-}
-
-UCX_TEST(test_ucx_stream_copy) {
-    UcxBuffer *b1 = ucx_buffer_new(NULL, 64, UCX_BUFFER_DEFAULT);
-    UcxBuffer *b2 = ucx_buffer_new(NULL, 2, UCX_BUFFER_AUTOEXTEND);
-    
-    UCX_TEST_BEGIN
-    
-    ucx_buffer_write("01234567", 1, 8, b1);
-    ucx_buffer_write("abcdefgh", 1, 8, b1);
-    UCX_TEST_ASSERT(b1->size == 16, "failed to fill buffer b1");
-    ucx_buffer_seek(b1, 0, SEEK_SET);
-    
-    char copybuf[256];
-    size_t ncp = ucx_stream_bcopy(b1, b2, ucx_buffer_read, ucx_buffer_write,
-            copybuf, sizeof(copybuf));
-    UCX_TEST_ASSERT(ncp == 16, "wrong number of copied bytes");
-    UCX_TEST_ASSERT(b2->size == 16, "b2 has wrong size");
-    UCX_TEST_ASSERT(memcmp(b1->space, b2->space, 16) == 0,
-            "b1 and b2 have not the same content");
-    
-    memset(b2->space, 0, b2->capacity);
-    b2->pos = 0;
-    b2->size = 0;
-    ucx_buffer_seek(b1, 0, SEEK_SET);
-    
-    FILE *file = tmpfile();
-    UCX_TEST_ASSERT(file, "test file cannot be opened, test aborted");
-    
-    ncp = ucx_stream_copy(b1, file, ucx_buffer_read, fwrite);
-    UCX_TEST_ASSERT(ncp == 16, "copied wrong number of bytes to file");
-    
-    fseek(file, 0, SEEK_SET);
-    
-    ncp = ucx_stream_copy(file, b2, fread, ucx_buffer_write);
-    UCX_TEST_ASSERT(ncp == 16, "copied wrong number of bytes from file");
-    
-    UCX_TEST_ASSERT(memcmp(b1->space, b2->space, 16) == 0,
-            "b1 and b2 content mismatch");
-    
-    fclose(file);
-
-    ucx_buffer_clear(b1);
-    ucx_buffer_seek(b2, 0, SEEK_SET);
-    ncp = ucx_stream_ncopy(b2, b1, ucx_buffer_read, ucx_buffer_write, 8);
-    UCX_TEST_ASSERT(ncp == 8, "copied wrong number of bytes with ncopy");
-    UCX_TEST_ASSERT(memcmp(b1->space, "01234567\0\0\0\0\0\0\0\0", 16) == 0,
-        "content wrong after ncopy");
-    
-    UCX_TEST_END
-    
-    ucx_buffer_free(b1);
-    ucx_buffer_free(b2);
-}
-
--- a/test/utils_tests.h	Mon Dec 30 09:54:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef UTILS_TESTS_H
-#define	UTILS_TESTS_H
-
-#include <ucx/test.h>
-#include <ucx/utils.h>
-
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
-UCX_TEST(test_ucx_fprintf);
-UCX_TEST(test_ucx_asprintf);
-UCX_TEST(test_ucx_sprintf);
-UCX_TEST(test_ucx_bprintf);
-UCX_TEST(test_ucx_stream_copy);
-
-#ifdef	__cplusplus
-}
-#endif
-
-#endif	/* UTILS_TESTS_H */
-

mercurial